blob: 74aa78d9160a04aa371a4cd2b27d7ef5b8a87b3a [file] [log] [blame]
+=============================================================================+
| Copyright (c) 2010-2020 Rambus, Inc. and/or its subsidiaries. |
| |
| Subject : DMABuf API Implementation Notes |
| Product : SLAD API |
| Date : 18 November, 2020 |
| |
+=============================================================================+
SLAD API Implementation Notes : DMABuf API
==========================================
The SLAD API is a set of the API's one of which is the DMA Buffer
Allocation (DMABuf) API. The driver implementation specifics of these APIs
are described in short documents that serve as an addendum to the API
specifications. This document describes the DMABuf API.
DMABuf API
----------
The implementation of this API is fully re-entrant.
Supported properties:
Alignment must be 1, 2, 4, 8, 16, 32, 64 or 128.
Bank is used to select a memory pool suitable for certain data types.
fCached can be used to indicate whether a DMA resource is cached.
Implementations of the DMAResource API can ignore the fCached parameter
and force all buffers to be allocated or registered either
cached or non-cached.
DMABuf_NULLHandle:
Implemented as a NULL handle that can be assigned to a variable
of type DMABuf_Handle_t
DMABuf_Handle_IsSame:
Two pointers to memory locations where the handles are stored
should be provided to this function as parameters.
The function will do byte comparison for the size of the handle type.
DMABuf_Alloc:
Maximum buffer size supported is 1 megabyte.
Implementation uses the DMAResource API
DMABuf_Register:
Supported values for AllocatorRef:
'N' to register a buffer that is not intended to be DMA-safe but for
which a DMABuf handle is desired nevertheless.
'R' to register a (subrange of) a buffer previously allocated with
DMABuf_Alloc. This buffer is known to be DMA-safe.
'k' to register a buffer allocated with Linux kmalloc.
'C' to register a coherent DMA-mapped buffer. The application must
provide the bus address in Alternative_p.
Alternative_p is only used with allocator ref 'C' and should be set to
"NULL" for other allocators.
All implementations of the DMAResource API support the 'N' and 'R'
allocators. The 'k' and 'C' allocators are only supported by
the Linux kernel implementation.
DMABuf_Release:
The implementation is protected against invalid handles and also detects
and warns when handles are used after release (does not work well when
all available handles are in use).
Banks:
The implementation supports several banks. The banks are configurable,
an example default configuration is as follows
(bank values in DMABuf_Properties_t):
- Bank 0 allocates buffers anywhere in physical RAM without restrictions.
- Bank 1 allocates buffers suitable for SA records and Transform records.
All these are required to lie in a single 4GB segment on 64-bit systems.
- Bank 2 allocates buffers suitable for flow records. All these are
required to lie in a single 4GB segment on 64-bit systems.
The following properties of the static (fixed-size) DMA banks are implemented:
- One static bank contains one DMA pool;
- One DMA Pool contains a fixed compile-time configurable number of blocks;
- All blocks in one DMA pool have the same fixed compile-time configurable
size;
- The DMA pools for all the configured static banks are allocated
in DMAResource_Init() and freed in DMAResource_Uninit();
- DMA resources can be allocated in a static bank using
DMABuf_Alloc() and they must be freed using DMABuf_Release();
- Only sub-sets of DMA resources allocated in a static bank can be
registered in that bank using DMABuf_Register();
If the DMABuf_Register() function is called for a static
bank then it must use allocator type 82 ('R') and the required memory
block must belong to an already allocated DMA resource in that bank;
- The DMABuf_Register() function can be called for a static
bank also using allocator type 78 ('N') to register a DMA-unsafe buffer;
These DMA resources must be subsequently freed using the DMABuf_Release()
function;
- An "all-pool" DMA resource of size (nr_of_blocks * block_size) can be
allocated in a static bank using DMABuf_Alloc() where nr_of_blocks
and block_size are compile-time configuration parameters
(see HWPAL_DMARESOURCE_BANKS in c_dmares_gen.h);
The DMABuf_Register() function can be used to register
sub-sets of this DMA resource; Only one such a all-pool DMA resource
can be allocated in one static bank and must be freed using
DMABuf_Release() function;
- No other DMA resources can be allocated in a static bank
where an all-pool DMA resource is allocated.
<end of document>