FeatureStore: Add Protobuf definition

Adds the protocol buffer messages for NVMe features like Arbitration,
Power Management, etc.

Design-Doc: go/bmc-redfish-nvme-get-set-features
Google-Bug-Id: 405609473
Change-Id: I5e574ac00c7c66ee417ca3f0070d4e82209c196e
Signed-off-by: Guangzong Chen <guangzong@google.com>
diff --git a/proto/nvme_features.proto b/proto/nvme_features.proto
new file mode 100644
index 0000000..84af23d
--- /dev/null
+++ b/proto/nvme_features.proto
@@ -0,0 +1,157 @@
+syntax = "proto3";
+
+package google.gbmc.nvme.base;
+
+// 01h - Arbitration
+// This feature controls the arbitration of commands among different submission queues.
+message Arbitration {
+  // Bit 7:0 - Arbitration Burst (AB)
+  // Specifies the maximum number of commands that the controller may launch at one time from a particular submission queue.
+  uint32 arbitration_burst = 1;
+  // Bit 15:8 - Low Priority Weight (LPW)
+  // Specifies the number of commands that may be executed from the low priority service class in each round.
+  uint32 low_priority_weight = 2;
+  // Bit 23:16 - Medium Priority Weight (MPW)
+  // Specifies the number of commands that may be executed from the medium priority service class in each round.
+  uint32 medium_priority_weight = 3;
+  // Bit 31:24 - High Priority Weight (HPW)
+  // Specifies the number of commands that may be executed from the high priority service class in each round.
+  uint32 high_priority_weight = 4;
+}
+
+// 02h - Power Management
+// This feature allows the host to configure the power state of the controller.
+message PowerManagement {
+  // Bit 4:0 - Power State (PS)
+  // Specifies the power state that the controller should transition to.
+  uint32 power_state = 1;
+  // Bit 8 - Workload Hint (WH)
+  // Indicates the type of workload that the controller should optimize for.
+  uint32 workload_hint = 2;
+}
+
+// 04h - Temperature Threshold
+// This feature allows the host to set temperature thresholds for the controller or a specific namespace.
+message TemperatureThreshold {
+  enum ThresholdType {
+    OVER_TEMPERATURE = 0;
+    UNDER_TEMPERATURE = 1;
+  }
+  // Bit 15:00 - Temperature Threshold (TMPTH)
+  // Specifies the threshold value in Kelvins.
+  uint32 temperature_threshold = 1;
+  // Bit 19:16 - Threshold Temperature Select (TMPSEL)
+  // Selects the temperature sensor.
+  uint32 threshold_temperature_select = 2;
+  // Bit 21:20 - Threshold Type Select (THSEL)
+  // Selects the type of temperature threshold (Over, Under).
+  ThresholdType threshold_type_select = 3;
+}
+
+// 05h - Error Recovery
+// This feature controls the error recovery settings for the NVM command set.
+message ErrorRecovery {
+  enum State {
+    DISABLED = 0;
+    ENABLED = 1;
+  }
+  // Bit 15:00 - Time Limited Error Recovery (TLER)
+  // Indicates a limited retry timeout value in 100 millisecond units.
+  uint32 tler = 1;
+  // Bit 16 - Deallocated or Unwritten Logical Block Error Enable (DULBE)
+  // If set to ENABLED, then the Deallocated or Unwritten Logical Block error is enabled.
+  State dulbe_enable = 2;
+}
+
+// 06h - Volatile Write Cache
+// This feature controls the operation of the volatile write cache, if present.
+message VolatileWriteCache {
+  enum State {
+    DISABLED = 0;
+    ENABLED = 1;
+  }
+  // Bit 0 - Volatile Write Cache Enable (WCE)
+  // If set to ENABLED, the volatile write cache is enabled.
+  State write_cache_enable = 1;
+}
+
+// 07h - Number of Queues
+// This feature configures the number of submission and completion queues.
+message NumberOfQueues {
+  // Bit 15:00 - Number of Submission Queues (NSQR)
+  // Specifies the number of I/O submission queues requested by the host.
+  uint32 number_of_submission_queues = 1;
+  // Bit 31:16 - Number of Completion Queues (NCQR)
+  // Specifies the number of I/O completion queues requested by the host.
+  uint32 number_of_completion_queues = 2;
+}
+
+// 08h - Interrupt Coalescing
+// This feature controls the interrupt coalescing settings.
+message InterruptCoalescing {
+  // Bit 7:0 - Aggregation Threshold (THR)
+  // Specifies the minimum number of completion queue entries to aggregate before signaling an interrupt.
+  uint32 aggregation_threshold = 1;
+  // Bit 15:8 - Aggregation Time (TIME)
+  // Specifies the maximum time to aggregate interrupts in units of 100 microseconds.
+  uint32 aggregation_time = 2;
+}
+
+// 09h - Interrupt Vector Configuration
+// This feature configures a specific interrupt vector.
+message InterruptVectorConfiguration {
+  enum CoalescingState {
+    COALESCING_ENABLED = 0;
+    COALESCING_DISABLED = 1;
+  }
+  // Bit 15:00 - Interrupt Vector (IV)
+  // Specifies the interrupt vector to be configured.
+  uint32 interrupt_vector = 1;
+  // Bit 16 - Coalescing Disable (CD)
+  // If set to COALESCING_DISABLED, interrupt coalescing is disabled for this vector.
+  CoalescingState coalescing_disable = 2;
+}
+
+// 0Ah - Write Atomicity Normal
+// This feature controls the write atomicity settings for normal write operations.
+message WriteAtomicityNormal {
+  enum NormalWriteAtomicityState {
+    NORMAL_WRITE_ATOMICITY_ENABLED = 0;
+    NORMAL_WRITE_ATOMICITY_DISABLED = 1;
+  }
+  // Bit 0 - Disable Normal (DN)
+  // If set to NORMAL_WRITE_ATOMICITY_DISABLED, the controller shall disable normal write atomicity.
+  NormalWriteAtomicityState disable_normal = 1;
+}
+
+// 0Bh - Asynchronous Event Configuration
+// This feature controls the configuration of asynchronous events.
+message AsynchronousEventConfiguration {
+  enum EventState {
+    EVENT_DISABLED = 0;
+    EVENT_ENABLED = 1;
+  }
+  // Bit 7:0 - SMART / Health Critical Warnings
+  // Specifies which SMART/Health critical warnings should trigger an asynchronous event notification.
+  uint32 smart_critical_warning_config = 1;
+  // Bit 8 - Namespace Attribute Notices
+  EventState namespace_attribute_notice_config = 2;
+  // Bit 9 - Firmware Activation Notices
+  EventState fw_activation_notice_config = 3;
+  // Bit 10 - Telemetry Log Notices
+  EventState telemetry_log_notice_config = 4;
+  // Bit 11 - Asymmetric Namespace Access Change Notices
+  EventState asymmetric_namespace_access_change_config = 5;
+  // Bit 12 - Predictable Latency Event Aggregate Log Change Notices
+  EventState predictable_latency_event_aggregate_log_change_config = 6;
+  // Bit 13 - LBA Status Information Alert Notices
+  EventState lba_status_information_alert_config = 7;
+  // Bit 14 - Endurance Group Event Aggregate Log Change Notices
+  EventState endurance_group_event_aggregate_log_change_config = 8;
+  // Bit 15 - Normal NVM Subsystem Shutdown
+  EventState normal_nvm_subsystem_shutdown_config = 9;
+  // Bit 27 - Zone Descriptor Changed Notices
+  EventState zone_descriptor_changed_config = 10;
+  // Bit 31 - Discovery Log Page Change Notification
+  EventState discovery_log_page_change_config = 11;
+}