/*
 * Copyright 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.boot@1.0;

/**
 * The Boot Control HAL is designed to allow for managing sets of redundant
 * partitions, called slots, that can be booted from independently. Slots
 * are sets of partitions whose names differ only by a given suffix.
 * They are identified here by a 0 indexed number and associated with their
 * suffix, which is appended to the base name for any particular partition
 * to find the one associated with that slot.
 * The primary use of this set up is to allow for background updates while
 * the device is running, and to provide a fallback in the event that the
 * update fails.
 */
interface IBootControl {
  /**
   * getNumberSlots() returns the number of available slots.
   * For instance, a system with a single set of partitions must return
   * 1, a system with A/B must return 2, A/B/C -> 3 and so on. A system with
   * less than two slots doesn't support background updates, for example if
   * running from a virtual machine with only one copy of each partition for the
   * purpose of testing.
   */
  getNumberSlots() generates (uint32_t numSlots);

  /**
   * getCurrentSlot() returns the slot number of that the current boot is booted
   * from, for example slot number 0 (Slot A). It is assumed that if the current
   * slot is A, then the block devices underlying B can be accessed directly
   * without any risk of corruption.
   * The returned value is always guaranteed to be strictly less than the
   * value returned by getNumberSlots. Slots start at 0 and finish at
   * getNumberSlots() - 1. The value returned here must match the suffix passed
   * from the bootloader, regardless of which slot is active or successful.
   */
  getCurrentSlot() generates (Slot slot);

  /**
   * markBootSuccessful() marks the current slot as having booted successfully.
   *
   * Returns whether the command succeeded.
   */
  markBootSuccessful() generates (CommandResult error);

  /**
   * setActiveBootSlot() marks the slot passed in parameter as the active boot
   * slot (see getCurrentSlot for an explanation of the "slot" parameter). This
   * overrides any previous call to setSlotAsUnbootable.
   * Returns whether the command succeeded.
   */
  setActiveBootSlot(Slot slot) generates (CommandResult error);

  /**
   * setSlotAsUnbootable() marks the slot passed in parameter as
   * an unbootable. This can be used while updating the contents of the slot's
   * partitions, so that the system must not attempt to boot a known bad set up.
   * Returns whether the command succeeded.
   */
  setSlotAsUnbootable(Slot slot) generates (CommandResult error);

  /**
   * isSlotBootable() returns if the slot passed in parameter is bootable. Note
   * that slots can be made unbootable by both the bootloader and by the OS
   * using setSlotAsUnbootable.
   * Returns TRUE if the slot is bootable, FALSE if it's not, and INVALID_SLOT
   * if slot does not exist.
   */
  isSlotBootable(Slot slot) generates (BoolResult bootable);

  /**
   * isSlotMarkedSucessful() returns if the slot passed in parameter has been
   * marked as successful using markBootSuccessful. Note that only the current
   * slot can be marked as successful but any slot can be queried.
   * Returns TRUE if the slot has been marked as successful, FALSE if it has
   * not, and INVALID_SLOT if the slot does not exist.
   */
  isSlotMarkedSuccessful(Slot slot) generates (BoolResult successful);

  /**
   * getSuffix() returns the string suffix used by partitions that correspond to
   * the slot number passed in as a parameter. The bootloader must pass the
   * suffix of the currently active slot either through a kernel command line
   * property at androidboot.slot_suffix, or the device tree at
   * /firmware/android/slot_suffix.
   * Returns the empty string "" if slot does not match an existing slot.
   */
  getSuffix(Slot slot) generates (string slotSuffix);
};

