template <>
class Server
Defined at line 1170 of file fidling/gen/sdk/fidl/fuchsia.hardware.sdmmc/fuchsia.hardware.sdmmc/cpp/fidl/fuchsia.hardware.sdmmc/cpp/driver/natural_messaging.h
Public Methods
void InitializeCommandQueueing (InitializeCommandQueueingRequest & request, InitializeCommandQueueingCompleter::Sync & completer)
Initializes the CQHCI driver, providing it with all necessary resources.
This call is expected to be made once. The server should reject any additional calls
until the peer end of `virtual_interrupt_lifeline` closes.
# Interrupt Delegation
While the CQHCI driver is running, it takes over the physical IRQ object from its underlying
driver, and directly handles any CQHCI-specific interrupts. Interrupts which it cannot
service (e.g. SDHCI interrupts) are forwarded to the underlying driver via
`virtual_interrupt`. The server should service interrupts exactly as it normally would.
The CQHCI driver will wait for the virtual IRQ to be acked before acking the physical IRQ.
# Arguments
* `virtual_interrupt` - A virtual interrupt to monitor instead of the physical IRQ.
The CQHCI driver will use this to forward interrupts which it cannot directly service.
* `virtual_interrupt_lifeline` - A lifeline for the virtual interrupt. The CQHCI
driver will destroy the peer end upon shutdown, which should be handled by the server as a
signal to stop monitoring the virtual interrupt and return to monitoring the physical
interrupt.
# Returns
* `cqhci_mmio` and `cqhci_mmio_offset` - An MMIO for the CQHCI register block.
MMIO size minus offset must be at least 512 bytes as per the CQHCI specification.
* `sdhci_mmio` and `sdhci_mmio_offset` - An MMIO for the SDHCI register block.
MMIO size minus offset must be at least 512 bytes as per the SDHCI specification.
* `bti` - The BTI to use for pinning pages for DMA.
* `interrupt` - The physical interrupt to monitor.
void EnableCqhci (EnableCqhciCompleter::Sync & completer)
Enables the Command Queueing Engine. The CQHCI driver is expected to already have called
[`InitializeCommandQueueing`] to handle interrupts.
While CQHCI is enabled, it is the caller's responsibility to only submit regular requests
(via [`Request`]) via DCMD, or after disabling CQHCI.
void DisableCqhci (DisableCqhciCompleter::Sync & completer)
Disables the Command Queueing Engine. `EnableCqhci` must have previously been called. From
this point onwards, regular requests can be submitted (until `EnableCqhci` is called again).
void HostInfo (HostInfoCompleter::Sync & completer)
Get host info.
void Server ()
Defined at line 1173 of file fidling/gen/sdk/fidl/fuchsia.hardware.sdmmc/fuchsia.hardware.sdmmc/cpp/fidl/fuchsia.hardware.sdmmc/cpp/driver/natural_messaging.h
void SetSignalVoltage (SetSignalVoltageRequest & request, SetSignalVoltageCompleter::Sync & completer)
Set signal voltage.
void SetBusWidth (SetBusWidthRequest & request, SetBusWidthCompleter::Sync & completer)
Set bus width.
void SetBusFreq (SetBusFreqRequest & request, SetBusFreqCompleter::Sync & completer)
Set bus frequency, zero means disable the clock to the card.
void SetTiming (SetTimingRequest & request, SetTimingCompleter::Sync & completer)
Set mmc timing.
void HwReset (HwResetCompleter::Sync & completer)
Issue a hw reset.
void PerformTuning (PerformTuningRequest & request, PerformTuningCompleter::Sync & completer)
Perform tuning.
void RegisterInBandInterrupt (RegisterInBandInterruptRequest & request, RegisterInBandInterruptCompleter::Sync & completer)
Register the given callback to be called when an in-band interrupt is received from the
card. Before calling the callback the protocol implementation will disable the in-band
interrupt in the controller. In-band interrupts can be re-enabled by calling
`AckInBandInterrupt()` once the previous interrupt has been handled by the client.
void AckInBandInterrupt (AckInBandInterruptCompleter::Sync & completer)
void RegisterVmo (RegisterVmoRequest & request, RegisterVmoCompleter::Sync & completer)
In the methods below, vmo_id is used to uniquely identify a VMO that will be passed to
Request in an SdmmcBufferRegion. VMO IDs are chosen by the caller, and may be any uint32
value.
Registers a VMO and transfers ownership to the protocol implementation. vmo_rights is a bit
field containing SdmmcVmoRight values, and determines the read/write permissions used by
the implementation when pinning or mapping the VMO. The implementation may pin vmo during
this call or any time it is used in a request, and may keep it pinned until the VMO is
unregistered. client_id may be in [0, SDMMC_MAX_CLIENT_ID] and identifies the ID space for
this VMO to be registered in (that is, two different VMOs may use the same ID if they are
registered for different clients).
void UnregisterVmo (UnregisterVmoRequest & request, UnregisterVmoCompleter::Sync & completer)
The callee unmaps/unpins the VMO and returns ownership to the caller.
void Request (RequestRequest & request, RequestCompleter::Sync & completer)
Perform the requests in order, atomically (i.e., no intervening requests). Furthermore,
calls are replied to in the order they are received. If an error occurs, abort any remaining
requests. Else, return the response of the last request.
The protocol implementation chooses whether or not to use DMA
depending on the properties of the request and the capabilities of the controller.
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 Request 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.
Handler bind_handler (fdf_dispatcher_t * dispatcher)
|bind_handler| returns a handler that binds incoming connections to this
server implementation.
The returned handler borrows the server instance.
The server must outlive the provided |dispatcher|. Only after
the dispatcher is shutdown will it be safe to destroy the servers.
The server should not be moved.
void ~Server ()
Defined at line 1174 of file fidling/gen/sdk/fidl/fuchsia.hardware.sdmmc/fuchsia.hardware.sdmmc/cpp/fidl/fuchsia.hardware.sdmmc/cpp/driver/natural_messaging.h