blob: 0444514c54f34d0f894393c0641438979c3ee7d7 [file] [log] [blame]
// Copyright 2018 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.sdio;
using fuchsia.hardware.sdmmc;
using zx;
const uint8 SDIO_FN_1 = 1;
const uint8 SDIO_FN_2 = 2;
/// Including func 0
const uint8 SDIO_MAX_FUNCS = 8;
struct SdioFuncHwInfo {
uint32 manufacturer_id;
uint32 product_id;
uint32 max_blk_size;
uint32 max_tran_speed;
uint8 fn_intf_code;
};
enum SDIO_CARD : uint32 {
MULTI_BLOCK = 0x1;
SRW = 0x2;
DIRECT_COMMAND = 0x4;
SUSPEND_RESUME = 0x8;
LOW_SPEED = 0x10;
HIGH_SPEED = 0x20;
HIGH_POWER = 0x40;
FOUR_BIT_BUS = 0x80;
HS_SDR12 = 0x100;
HS_SDR25 = 0x200;
UHS_SDR50 = 0x400;
UHS_SDR104 = 0x800;
UHS_DDR50 = 0x1000;
TYPE_A = 0x2000;
TYPE_B = 0x4000;
TYPE_C = 0x8000;
TYPE_D = 0x10000;
};
struct SdioDeviceHwInfo {
/// number of sdio funcs including func 0
uint32 num_funcs;
uint32 sdio_vsn;
uint32 cccr_vsn;
uint32 caps;
};
struct SdioHwInfo {
SdioDeviceHwInfo dev_hw_info;
array<SdioFuncHwInfo>:SDIO_MAX_FUNCS funcs_hw_info;
uint32 host_max_transfer_size;
};
resource struct SdioRwTxnNew {
uint32 addr;
bool incr;
bool write;
vector<fuchsia.hardware.sdmmc.SdmmcBufferRegion> buffers;
};
resource struct SdioRwTxn {
uint32 addr;
uint32 data_size;
bool incr;
bool write;
bool use_dma;
/// Used if use_dma is true
zx.handle:VMO dma_vmo;
/// Used if use_dma is false
[Mutable, Buffer] vector<uint8> virt;
/// offset into dma_vmo or virt
uint64 buf_offset;
};
[Transport = "Banjo", BanjoLayout = "ddk-protocol"]
protocol Sdio {
GetDevHwInfo() -> (zx.status s, SdioHwInfo hw_info);
EnableFn() -> (zx.status s);
DisableFn() -> (zx.status s);
EnableFnIntr() -> (zx.status s);
DisableFnIntr() -> (zx.status s);
UpdateBlockSize(uint16 blk_sz, bool deflt) -> (zx.status s);
GetBlockSize() -> (zx.status s, uint16 cur_blk_size);
DoRwTxn([InOut] SdioRwTxn txn) -> (zx.status s);
DoRwByte(bool write, uint32 addr, uint8 write_byte) -> (zx.status s, uint8 read_byte);
GetInBandIntr() -> (zx.status s, zx.handle:INTERRUPT irq);
/// The following functions access the card common control registers (CCCR) on function 0.
/// Aborts an I/O operation occurring on the specified function.
IoAbort() -> (zx.status s);
/// Returns true if an interrupt is pending for function fn_idx, false otherwise.
IntrPending() -> (zx.status s, bool pending);
/// Reads or writes to a vendor CCCR register. addr must be in [0xF0, 0xFF].
DoVendorControlRwByte(bool write, uint8 addr, uint8 write_byte) -> (zx.status s, uint8 read_byte);
// See fuchsia.hardware.sdmmc.
RegisterVmo(uint32 vmo_id, zx.handle:VMO vmo, uint64 offset, uint64 size, uint32 vmo_rights)
-> (zx.status status);
UnregisterVmo(uint32 vmo_id) -> (zx.status status, zx.handle:VMO vmo);
/// Clients are responsible for performing the following cache operations:
///
/// After read requests:
/// - Call zx_cache_flush with ZX_CACHE_FLUSH_DATA | ZX_CACHE_FLUSH_INVALIDATE on buffers that
/// have been mapped by the client.
/// - Call zx_vmo_op_range with ZX_VMO_OP_CACHE_CLEAN_INVALIDATE on all other buffers.
///
/// Note that writing to any portion of a buffer before DoRwTxnNew has returned can corrupt the
/// received data.
///
/// Before write requests:
/// - Call zx_cache_flush with ZX_CACHE_FLUSH_DATA on buffers that have been mapped by the
/// client.
/// - Call zx_vmo_op_range with ZX_VMO_OP_CACHE_CLEAN on all other buffers.
DoRwTxnNew(SdioRwTxnNew txn) -> (zx.status status);
/// Runs tests and logs the results in order to diagnose issues with the bus. Clients should
/// call this before shutting down due to unrecoverable errors. This method may block for some
/// time to send commands to the card, so it should be the last call made by the client.
/// Note: SDIO devices may have different drivers bound to different functions. Clients must not
/// call RunDiagnostics in these cases, since doing so could interfere with other clients.
/// TODO(fxbug.dev/64166): Remove this when the SDIO issues have been investigated.
RunDiagnostics();
};