| // 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 SdioCard : 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>:MAX 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>:MAX 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(); |
| }; |