[rbox] Created the rbox register definition files

Signed-off-by: Eric Shiu <eshiu@google.com>
diff --git a/hw/Makefile b/hw/Makefile
index 6d79654..3f434d1 100644
--- a/hw/Makefile
+++ b/hw/Makefile
@@ -30,6 +30,7 @@
        pattgen       \
        pinmux        \
        pwrmgr        \
+       rbox          \
        rstmgr        \
        rv_plic       \
        rv_timer      \
diff --git a/hw/ip/rbox/data/rbox.hjson b/hw/ip/rbox/data/rbox.hjson
new file mode 100644
index 0000000..83e4754
--- /dev/null
+++ b/hw/ip/rbox/data/rbox.hjson
@@ -0,0 +1,573 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+{ name: "rbox",
+  clock_primary: "clk_i",
+  other_clock_list: [
+    "clk_aon_i"
+  ]
+  bus_device: "tlul",
+  bus_host: "none",
+  reset_primary: "rst_ni",
+  other_reset_list: [
+    "rst_slow_ni"
+  ],
+  interrupt_list: [
+    { name: "rbox_intr_o",
+      desc: "combo or keyboard triggered interrupt",
+    }
+  ],
+  param_list: [
+    { name:    "NumCombo",
+      type:    "int",
+      default: "4",
+      desc:    "Number of keyboard combos",
+      local:   "true",
+    }
+  ],
+  available_input_list: [
+    { name: "ac_present", desc: "A/C power is present" }
+    { name: "ec_rst_l_i", desc: "ec_rst_l as an input from the open drain IO" }
+    { name: "key0_in", desc: "VolUp button in tablet; column output from the EC in a laptop" }
+    { name: "key1_in", desc: "VolDown button in tablet; row input from keyboard matrix in a laptop" }
+    { name: "key2_in", desc: "TBD button in tablet; row input from keyboard matrix in a laptop" }
+    { name: "pwrb_in", desc: "Power button in both tablet and laptop" }
+  ],
+  available_output_list: [
+    { name: "bat_disable", desc: "Battery is disconnected" }
+    { name: "ec_rst_l_o", desc: "ec_rst_l as an output to the open drain IO" }
+    { name: "key0_out", desc: "Passthrough from key0_in, can be configured to invert" }
+    { name: "key1_out", desc: "Passthrough from key1_in, can be configured to invert" }
+    { name: "key2_out", desc: "Passthrough from key2_in, can be configured to invert" }
+    { name: "pwrb_out", desc: "Passthrough from pwrb_in, can be configured to invert" }
+  ],
+  regwidth: "32",
+  registers: [
+    { name: "REGWEN",
+      desc: "Configuration write enable control register",
+      swaccess: "rw0c",
+      hwaccess: "none",
+      resval: "1",
+      fields: [
+        { bits: "0",
+          name: "write_en",
+          desc: '''config write enable.
+                0: cfg is locked(not writable); 1: cfg is not locked(writable)
+                ''',
+        }
+      ]
+    }
+    { name: "ec_rst_ctl",
+      desc: "EC reset control register",
+      swaccess: "rw",
+      hwaccess: "hro",
+      hwqe: "true",
+      regwen: "REGWEN",
+      resval: "2000",
+      fields: [
+        { bits: "15:0",
+          name: "ec_rst_pulse",
+          desc: "Configure the pulse width of ec_rst_l. 10-200ms, each step is 5us(200KHz clock)",
+        }
+      ],
+    }
+    { name: "key_invert_ctl",
+      desc: "configure key input output invert property",
+      swaccess: "rw",
+      hwaccess: "hro",
+      regwen: "REGWEN",
+      resval: "0",
+      fields: [
+        { bits: "0",
+	  name: "key0_in",
+	  desc: "0: don’t invert; 1: invert",
+	}
+        { bits: "1",
+	  name: "key0_out",
+	  desc: "0: don’t invert; 1: invert",
+	}
+        { bits: "2",
+	  name: "key1_in",
+	  desc: "0: don’t invert; 1: invert",
+	}
+        { bits: "3",
+	  name: "key1_out",
+	  desc: "0: don’t invert; 1: invert",
+	}
+        { bits: "4",
+	  name: "key2_in",
+	  desc: "0: don’t invert; 1: invert",
+	}
+        { bits: "5",
+	  name: "key2_out",
+	  desc: "0: don’t invert; 1: invert",
+	}
+        { bits: "6",
+	  name: "pwrb_in",
+	  desc: "0: don’t invert; 1: invert",
+	}
+        { bits: "7",
+	  name: "pwrb_out",
+	  desc: "0: don’t invert; 1: invert",
+	}
+        { bits: "8",
+	  name: "ac_present",
+	  desc: "0: don’t invert; 1: invert",
+	}
+        { bits: "9",
+	  name: "bat_disable",
+	  desc: "0: don’t invert; 1: invert",
+	}
+      ]
+    }
+    { name: "pin_allowed_ctl",
+      desc: "configure the allowed pinout override value",
+      swaccess: "rw",
+      hwaccess: "hro",
+      regwen: "REGWEN",
+      resval: "2",
+      fields: [
+        { bits: "0",
+	  name: "bat_disable_0",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "1",
+	  name: "ec_rst_l_0",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "2",
+	  name: "pwrb_out_0",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "3",
+	  name: "key0_out_0",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "4",
+	  name: "key1_out_0",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "5",
+	  name: "key2_out_0",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "6",
+	  name: "bat_disable_1",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "7",
+	  name: "ec_rst_l_1",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "8",
+	  name: "pwrb_out_1",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "9",
+	  name: "key0_out_1",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "10",
+	  name: "key1_out_1",
+	  desc: "0: disable ;1: enable ",
+	}
+        { bits: "11",
+	  name: "key2_out_1",
+	  desc: "0: disable ;1: enable ",
+	}
+      ]
+    }
+    { name: "pin_out_ctl",
+      desc: "configure the pin out directly to override the function",
+      swaccess: "rw",
+      hwaccess: "hro",
+      resval: "2",
+      fields: [
+        { bits: "0",
+	  name: "bat_disable",
+	  desc: "0: disable override;1: enable override",
+	}
+        { bits: "1",
+	  name: "ec_rst_l",
+	  desc: "0: disable override;1: enable override",
+	}
+        { bits: "2",
+	  name: "pwrb_out",
+	  desc: "0: disable override;1: enable override",
+	}
+        { bits: "3",
+	  name: "key0_out",
+	  desc: "0: disable override;1: enable override",
+	}
+        { bits: "4",
+	  name: "key1_out",
+	  desc: "0: disable override;1: enable override",
+	}
+        { bits: "5",
+	  name: "key2_out",
+	  desc: "0: disable override;1: enable override",
+	}
+      ]
+    }
+    { name: "pin_out_value",
+      desc: "confiure the pin out value directly to override the function",
+      swaccess: "rw",
+      hwaccess: "hro",
+      resval: "0",
+      fields: [
+        { bits: "0",
+	  name: "bat_disable",
+	  desc: "0: override to 1b0; 1: override to 1b1",
+	}
+        { bits: "1",
+	  name: "ec_rst_l",
+	  desc: "0: override to 1b0; 1: override to 1b1",
+	}
+        { bits: "2",
+	  name: "pwrb_out",
+	  desc: "0: override to 1b0; 1: override to 1b1",
+	}
+        { bits: "3",
+	  name: "key0_out",
+	  desc: "0: override to 1b0; 1: override to 1b1",
+	}
+        { bits: "4",
+	  name: "key1_out",
+	  desc: "0: override to 1b0; 1: override to 1b1",
+	}
+        { bits: "5",
+	  name: "key2_out",
+	  desc: "0: override to 1b0; 1: override to 1b1",
+	}
+      ]
+    }
+    { name: "pin_in_value",
+      desc: "For SW to read the rbox inputs like GPIO",
+      swaccess: "ro",
+      hwaccess: "hwo",
+      resval: "0",
+      fields: [
+        { bits: "0",
+	  name: "ac_present",
+	  desc: "raw ac_present value; before the invert logic",
+	}
+        { bits: "1",
+	  name: "ec_rst_l",
+	  desc: "raw ac_present value; before the invert logic",
+	}
+        { bits: "2",
+	  name: "pwrb_in",
+	  desc: "raw ac_present value; before the invert logic",
+	}
+        { bits: "3",
+	  name: "key0_in",
+	  desc: "raw ac_present value; before the invert logic",
+	}
+        { bits: "4",
+	  name: "key1_in",
+	  desc: "raw ac_present value; before the invert logic",
+	}
+        { bits: "5",
+	  name: "key2_in",
+	  desc: "raw ac_present value; before the invert logic",
+	}
+      ]
+    }
+    { name: "key_intr_ctl",
+      desc: "Define the keys or inputs that can trigger the interrupt ",
+      swaccess: "rw",
+      hwaccess: "hro",
+      regwen: "REGWEN",
+      resval: "0",
+      fields: [
+        { bits: "0",
+	  name: "pwrb_in_H2L",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "1",
+	  name: "key0_in_H2L",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "2",
+	  name: "key1_in_H2L",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "3",
+	  name: "key2_in_H2L",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "4",
+	  name: "ac_present_H2L",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "5",
+	  name: "ec_rst_l_H2L",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "8",
+	  name: "pwrb_in_L2H",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "9",
+	  name: "key0_in_L2H",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "10",
+	  name: "key1_in_L2H",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "11",
+	  name: "key2_in_L2H",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "12",
+	  name: "ac_present_L2H",
+	  desc: "0: disable, 1: enable",
+	}
+        { bits: "13",
+	  name: "ec_rst_l_L2H",
+	  desc: "0: disable, 1: enable",
+	}
+      ]
+    }
+    { name: "key_intr_debounce_ctl",
+      desc: "Debounce timer control register for key-triggered interrupt",
+      swaccess: "rw",
+      hwaccess: "hro",
+      hwqe:  "true",
+      regwen: "REGWEN",
+      resval: "0",
+      fields: [
+        { bits: "15:0",
+          name: "debounce_timer",
+          desc: "Define the timer valure so that the key or input is not oscillating for 0-200ms, each step is 5us(200KHz clock)",
+        }
+      ],
+    }
+    { name: "auto_block_debounce_ctl",
+      desc: "Debounce timer control register for pwrb_in H2L transition",
+      swaccess: "rw",
+      hwaccess: "hro",
+      hwqe:  "true",
+      regwen: "REGWEN",
+      resval: "0",
+      fields: [
+        { bits: "15:0",
+          name: "debounce_timer",
+          desc: "Define the timer valure so that pwrb_in is not oscillating for 0-200ms, each step is 5us(200KHz clock)",
+        }
+	{ bits: "16",
+	  name: "auto_block_enable",
+	  desc: "0: disable, 1: enable",
+	}
+      ],
+    }
+    { name: "auto_block_out_ctl",
+      desc: "confiure the key outputs to auto-override and their value",
+      swaccess: "rw",
+      hwaccess: "hro",
+      regwen: "REGWEN",
+      resval: "0",
+      fields: [
+        { bits: "0",
+	  name: "key0_out_sel",
+	  desc: "0: disable auto-block; 1: enable auto-block",
+	}
+        { bits: "1",
+	  name: "key1_out_sel",
+	  desc: "0: disable auto-block; 1: enable auto-block",
+	}
+        { bits: "2",
+	  name: "key2_out_sel",
+	  desc: "0: disable auto-block; 1: enable auto-block",
+	}
+        { bits: "4",
+	  name: "key0_out_value",
+	  desc: "0: override to 1’b0; 1: override to 1’b1",
+	}
+        { bits: "5",
+	  name: "key1_out_value",
+	  desc: "0: override to 1’b0; 1: override to 1’b1",
+	}
+        { bits: "6",
+	  name: "key2_out_value",
+	  desc: "0: override to 1’b0; 1: override to 1’b1",
+	}
+      ]
+    }
+    { multireg: {
+        name: "com_sel_ctl",
+	desc: '''To define the keys that trigger the combo
+	      [0]: key0_in_sel
+              [1]: key1_in_sel
+              [2]: key2_in_sel
+              [3]: pwrb_in_sel
+              [4]: ac_present_sel
+	      HW will detect H2L transition in the combo use case
+              ''',
+        count: "NumCombo",
+        cname: "rbox",
+	swaccess: "rw",
+	hwaccess: "hro",
+        regwen:   "REGWEN",
+	resval:   "0",
+	fields: [
+	  { bits: "0",
+	    name: "key0_in_sel",
+	    desc: "0: disable, 1: enable",
+	  }
+	  { bits: "1",
+	    name: "key1_in_sel",
+	    desc: "0: disable, 1: enable",
+	  }
+	  { bits: "2",
+	    name: "key2_in_sel",
+	    desc: "0: disable, 1: enable",
+	  }
+	  { bits: "3",
+	    name: "pwrb_in_sel",
+	    desc: "0: disable, 1: enable",
+	  }
+	  { bits: "4",
+	    name: "ac_present_sel",
+	    desc: "0: disable, 1: enable",
+	  }
+        ],
+      }
+    }
+    { multireg: {
+        name: "com_det_ctl",
+	desc: '''To define the duration that the combo should be pressed
+	      0-60s, each step is 5us(200KHz clock)
+              ''',
+        count: "NumCombo",
+        cname: "rbox",
+	hwqe:  "true",
+	swaccess: "rw",
+	hwaccess: "hro",
+        regwen:   "REGWEN",
+	resval:   "0",
+	fields: [
+	  { bits: "31:0",
+	    name: "detection_timer",
+	    desc: "0-60s, each step is 5us(200KHz clock)",
+	  }
+        ],
+      }
+    }
+    { multireg: {
+        name: "com_out_ctl",
+	desc: '''To define the actions once the combo is detected
+	      [0]: bat_disable
+              [1]: interrupt
+              [2]: ec_rst
+              [3]: gsc_rst
+              ''',
+        count: "NumCombo",
+        cname: "rbox",
+	swaccess: "rw",
+	hwaccess: "hro",
+        regwen:   "REGWEN",
+	resval:   "0",
+	fields: [
+	  { bits: "0",
+	    name: "bat_disable",
+	    desc: "0: disable, 1: enable",
+	  }
+	  { bits: "1",
+	    name: "interrupt",
+	    desc: "0: disable, 1: enable",
+	  }
+	  { bits: "2",
+	    name: "ec_rst",
+	    desc: "0: disable, 1: enable",
+	  }
+	  { bits: "3",
+	    name: "gsc_rst",
+	    desc: "0: disable, 1: enable",
+	  }
+        ],
+      }
+    }
+    { name: "combo_intr_status",
+      desc: "combo interrupt source",
+      swaccess: "rw1c",
+      hwaccess: "hwo",
+      resval: "0",
+      fields: [
+        { bits: "0",
+	  name: "combo0_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "1",
+	  name: "combo1_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "2",
+	  name: "combo2_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "3",
+	  name: "combo3_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+      ]
+    }
+    { name: "key_intr_status",
+      desc: "key interrupt source",
+      swaccess: "rw1c",
+      hwaccess: "hwo",
+      resval: "0",
+      fields: [
+        { bits: "0",
+	  name: "pwrb_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "1",
+	  name: "key0_in_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "2",
+	  name: "key1_in_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "3",
+	  name: "key2_in_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "4",
+	  name: "ac_present_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "5",
+	  name: "ec_rst_l_H2L",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "6",
+	  name: "pwrb_L2H",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "7",
+	  name: "key0_in_L2H",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "8",
+	  name: "key1_in_L2H",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "9",
+	  name: "key2_in_L2H",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "10",
+	  name: "ac_present_L2H",
+	  desc: "0: case not detected;1: case detected",
+	}
+        { bits: "11",
+	  name: "ec_rst_l_L2H",
+	  desc: "0: case not detected;1: case detected",
+	}
+      ]
+    }
+  ],
+}
diff --git a/hw/ip/rbox/data/rbox.prj.hjson b/hw/ip/rbox/data/rbox.prj.hjson
new file mode 100644
index 0000000..b229752
--- /dev/null
+++ b/hw/ip/rbox/data/rbox.prj.hjson
@@ -0,0 +1,15 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+{
+    name:               "rbox",
+    design_spec:        "hw/ip/rbox/doc",
+    dv_doc:             "hw/ip/rbox/doc/dv",
+    hw_checklist:       "hw/ip/rbox/doc/checklist",
+    version:            "1.0",
+    life_stage:         "L1",
+    design_stage:       "D0",
+    verification_stage: "V0",
+    notes:              "",
+}
diff --git a/hw/ip/rbox/rbox.core b/hw/ip/rbox/rbox.core
new file mode 100644
index 0000000..5efb614
--- /dev/null
+++ b/hw/ip/rbox/rbox.core
@@ -0,0 +1,65 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:ip:rbox:1.0"
+description: "rbox"
+filesets:
+  files_rtl:
+    depend:
+      - lowrisc:constants:top_pkg
+      - lowrisc:prim:all
+      - lowrisc:ip:tlul
+    files:
+      - rtl/rbox_reg_pkg.sv
+      - rtl/rbox_reg_top.sv
+      - rtl/rbox_autoblock.sv
+      - rtl/rbox_comboact.sv
+      - rtl/rbox_combotrg.sv
+      - rtl/rbox_intr.sv
+      - rtl/rbox_inv.sv
+      - rtl/rbox_pin.sv
+      - rtl/rbox_keyintr.sv
+      - rtl/rbox_timerfsm.sv
+      - rtl/rbox_keyfsm.sv
+      - rtl/rbox_combofsm.sv
+      - rtl/rbox_combo.sv
+      - rtl/rbox.sv
+    file_type: systemVerilogSource
+
+  files_ascentlint_waiver:
+    depend:
+      # common waivers
+      - lowrisc:lint:common
+    file_type: waiver
+
+  files_veriblelint_waiver:
+    depend:
+      # common waivers
+      - lowrisc:lint:common
+      - lowrisc:lint:comportable
+
+parameters:
+  SYNTHESIS:
+    datatype: bool
+    paramtype: vlogdefine
+
+targets:
+  default: &default_target
+    filesets:
+      - tool_ascentlint  ? (files_ascentlint_waiver)
+      - files_rtl
+    toplevel: rbox
+
+
+  lint:
+    <<: *default_target
+    default_tool: verilator
+    parameters:
+      - SYNTHESIS=true
+    tools:
+      verilator:
+        mode: lint-only
+        verilator_options:
+          - "-Wall"
+