1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_INCLUDE_HARDWARE_BOOT_CONTROL_H
18#define ANDROID_INCLUDE_HARDWARE_BOOT_CONTROL_H
19
20#include <hardware/hardware.h>
21
22__BEGIN_DECLS
23
24#define BOOT_CONTROL_MODULE_API_VERSION_0_1  HARDWARE_MODULE_API_VERSION(0, 1)
25
26/**
27 * The id of this module
28 */
29#define BOOT_CONTROL_HARDWARE_MODULE_ID "bootctrl"
30
31/*
32 * The Boot Control HAL is designed to allow for managing sets of redundant
33 * partitions, called slots, that can be booted from independantly. Slots
34 * are sets of partitions whose names differ only by a given suffix.
35 * They are identified here by a 0 indexed number, and associated with their
36 * suffix, which can be appended to the base name for any particular partition
37 * to find the one associated with that slot. The bootloader must pass the suffix
38 * of the currently active slot either through a kernel command line property at
39 * androidboot.slot_suffix, or the device tree at /firmware/android/slot_suffix.
40 * The primary use of this set up is to allow for background updates while the
41 * device is running, and to provide a fallback in the event that the update fails.
42 */
43
44
45/**
46 * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
47 * and the fields of this data structure must begin with hw_module_t
48 * followed by module specific information.
49 */
50typedef struct boot_control_module {
51    struct hw_module_t common;
52
53    /*
54     * (*init)() perform any initialization tasks needed for the HAL.
55     * This is called only once.
56     */
57    void (*init)(struct boot_control_module *module);
58
59    /*
60     * (*getNumberSlots)() returns the number of available slots.
61     * For instance, a system with a single set of partitions would return
62     * 1, a system with A/B would return 2, A/B/C -> 3...
63     */
64    unsigned (*getNumberSlots)(struct boot_control_module *module);
65
66    /*
67     * (*getCurrentSlot)() returns the value letting the system know
68     * whether the current slot is A or B. The meaning of A and B is
69     * left up to the implementer. It is assumed that if the current slot
70     * is A, then the block devices underlying B can be accessed directly
71     * without any risk of corruption.
72     * The returned value is always guaranteed to be strictly less than the
73     * value returned by getNumberSlots. Slots start at 0 and
74     * finish at getNumberSlots() - 1
75     */
76    unsigned (*getCurrentSlot)(struct boot_control_module *module);
77
78    /*
79     * (*markBootSuccessful)() marks the current slot
80     * as having booted successfully
81     *
82     * Returns 0 on success, -errno on error.
83     */
84    int (*markBootSuccessful)(struct boot_control_module *module);
85
86    /*
87     * (*setActiveBootSlot)() marks the slot passed in parameter as
88     * the active boot slot (see getCurrentSlot for an explanation
89     * of the "slot" parameter). This overrides any previous call to
90     * setSlotAsUnbootable.
91     * Returns 0 on success, -errno on error.
92     */
93    int (*setActiveBootSlot)(struct boot_control_module *module, unsigned slot);
94
95    /*
96     * (*setSlotAsUnbootable)() marks the slot passed in parameter as
97     * an unbootable. This can be used while updating the contents of the slot's
98     * partitions, so that the system will not attempt to boot a known bad set up.
99     * Returns 0 on success, -errno on error.
100     */
101    int (*setSlotAsUnbootable)(struct boot_control_module *module, unsigned slot);
102
103    /*
104     * (*isSlotBootable)() returns if the slot passed in parameter is
105     * bootable. Note that slots can be made unbootable by both the
106     * bootloader and by the OS using setSlotAsUnbootable.
107     * Returns 1 if the slot is bootable, 0 if it's not, and -errno on
108     * error.
109     */
110    int (*isSlotBootable)(struct boot_control_module *module, unsigned slot);
111
112    /*
113     * (*getSuffix)() returns the string suffix used by partitions that
114     * correspond to the slot number passed in parameter. The returned string
115     * is expected to be statically allocated and not need to be freed.
116     * Returns NULL if slot does not match an existing slot.
117     */
118    const char* (*getSuffix)(struct boot_control_module *module, unsigned slot);
119
120    /*
121     * (*isSlotMarkedSucessful)() returns if the slot passed in parameter has
122     * been marked as successful using markBootSuccessful.
123     * Returns 1 if the slot has been marked as successful, 0 if it's
124     * not the case, and -errno on error.
125     */
126    int (*isSlotMarkedSuccessful)(struct boot_control_module *module, unsigned slot);
127
128    void* reserved[31];
129} boot_control_module_t;
130
131
132__END_DECLS
133
134#endif  // ANDROID_INCLUDE_HARDWARE_BOOT_CONTROL_H
135