| // Copyright 2019 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.shareddma; |
| using zx; |
| |
| type DmaType = strict enum : uint32 { |
| REGULAR = 0x1; |
| CYCLIC = 0x2; |
| }; |
| |
| type DmaState = strict enum : uint32 { |
| COMPLETED = 0x1; |
| FAILED = 0x2; |
| }; |
| |
| @transport("Banjo") |
| @banjo_layout("ddk-callback") |
| protocol DmaNotifyCallback { |
| Callback(struct { |
| state DmaState; |
| }) -> (); |
| }; |
| |
| @transport("Banjo") |
| @banjo_layout("ddk-protocol") |
| protocol SharedDma { |
| |
| /// Initializes and provides a VMO for memory source or destination. |
| /// Only supports device to memory and memory to device DMAs. |
| /// The provided id is opaque and HW specific. The id implicitly defines the direction of the |
| /// DMA (biderectional DMAs are not supported yet). Transfer sizes and alignment are |
| /// managed within the shared DMA driver. |
| InitializeAndGetBuffer(struct { |
| channel_id uint32; |
| type DmaType; |
| size uint32; |
| }) -> (resource struct { |
| s zx.status; |
| vmo zx.handle:VMO; |
| }); |
| |
| /// Start DMA |
| Start(struct { |
| channel_id uint32; |
| }); |
| |
| /// Stop DMA |
| Stop(struct { |
| channel_id uint32; |
| }); |
| |
| /// Returns the current position within memory where is the DMA has written to or read from. |
| GetBufferPosition(struct { |
| channel_id uint32; |
| }) -> (struct { |
| position uint32; |
| }); |
| |
| /// It must always be assumed that the DMA is in the process of transfering this amount |
| /// of data (accounting for warp around) into or from memory, hence for: |
| /// Device to memory DMAs, it is not safe to read this amount past the buffer position. |
| /// Memory to device DMAs, it is not safe to write this amount before the buffer position. |
| GetTransferSize(struct { |
| channel_id uint32; |
| }) -> (struct { |
| available_size uint32; |
| }); |
| |
| /// Specifies a callback for notifications of state change. |
| SetNotifyCallback(resource struct { |
| channel_id uint32; |
| cb client_end:DmaNotifyCallback; |
| }) -> (struct { |
| s zx.status; |
| }); |
| }; |