|  | // Copyright 2020 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | library fuchsia.hardware.rpmb; | 
|  |  | 
|  | using zx; | 
|  | using fuchsia.mem; | 
|  |  | 
|  | // RPMB: Replay Protected Memory Block | 
|  | // RPMB is a secure area included in certain types of storage devices. For more information, see: | 
|  | // https://optee.readthedocs.io/en/latest/architecture/secure_storage.html#rpmb-secure-storage | 
|  |  | 
|  | /// The RPMB frame size in bytes. | 
|  | const uint32 FRAME_SIZE = 512; | 
|  |  | 
|  | struct EmmcDeviceInfo { | 
|  | /// The device's CID register. | 
|  | array<uint8>:16 cid; | 
|  | /// RPMB_SIZE_MULT from the device's EXT_CSD register. | 
|  | uint8 rpmb_size; | 
|  | /// REL_WR_SEC_C from the device's EXT_CSD register. | 
|  | uint8 reliable_write_sector_count; | 
|  | }; | 
|  |  | 
|  | flexible union DeviceInfo { | 
|  | 1: EmmcDeviceInfo emmc_info; | 
|  | }; | 
|  |  | 
|  | /// Represents an RPMB operation, which consists of sending one or more frames then receiving zero | 
|  | /// or more frames. The tx_frames and rx_frames VMOs will be transferred to the protocol | 
|  | /// implementation, so clients should keep duplicates of them if access is needed after the call to | 
|  | /// Request(). | 
|  | /// The request will be aborted as soon as an error is encountered, meaning the read operation will | 
|  | /// not be performed if the write operation failed. Invalid parameters passed through tx_frames or | 
|  | /// rx_frames will cause an error to be returned immediately, without either operation having been | 
|  | /// performed. | 
|  | resource struct Request { | 
|  | /// May not be null as all operations involve sending at least one frame. tx_frames.size must be | 
|  | /// a multiple of and at least FRAME_SIZE. | 
|  | fuchsia.mem.Range tx_frames; | 
|  |  | 
|  | /// May be null if no frames need to be received. rx_frames.size must be a multiple of | 
|  | /// FRAME_SIZE if rx_frames is not null. | 
|  | fuchsia.mem.Range? rx_frames; | 
|  | }; | 
|  |  | 
|  | protocol Rpmb { | 
|  | GetDeviceInfo() -> (DeviceInfo info); | 
|  | Request(Request request) -> () error zx.status; | 
|  | }; |