8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * CDDL HEADER START
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * The contents of this file are subject to the terms of the
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Common Development and Distribution License (the "License").
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * You may not use this file except in compliance with the License.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * or http://www.opensolaris.org/os/licensing.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * See the License for the specific language governing permissions
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * and limitations under the License.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * When distributing Covered Code, include this CDDL HEADER in each
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * If applicable, add the following below this CDDL HEADER, with the
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * fields enclosed by brackets "[]" replaced with your own identifying
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * information: Portions Copyright [yyyy] [name of copyright owner]
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * CDDL HEADER END
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Use is subject to license terms.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#ifndef _SYS_DCOPY_H
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define _SYS_DCOPY_H
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#ifdef __cplusplus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusextern "C" {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#endif
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/types.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * *** This interface is for private use by the IP stack only ***
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
17169044f903cb92234f23d0ba0ce43449614a4dbrutus/* Private dcopy/uioa interface for dcopy to enable/disable dcopy KAPI */
17169044f903cb92234f23d0ba0ce43449614a4dbrutusextern void uioa_dcopy_enable();
17169044f903cb92234f23d0ba0ce43449614a4dbrutusextern void uioa_dcopy_disable();
17169044f903cb92234f23d0ba0ce43449614a4dbrutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* Function return status */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_FAILURE (-1)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_SUCCESS (0)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_NORESOURCES (1) /* _alloc & _cmd_alloc, _cmd_post only */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_PENDING (0x10) /* dcopy_poll(), dcopy_unregister() */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_COMPLETED (0x20) /* dcopy_poll() only */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* dq_version */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_QUERY_V0 0
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutustypedef struct dcopy_query_s {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int dq_version; /* DCOPY_QUERY_V0 */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint_t dq_num_channels; /* number of dma channels */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus} dcopy_query_t;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_query()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * query for the number of DMA engines usable in the system.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusvoid dcopy_query(dcopy_query_t *query);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutustypedef struct dcopy_channel_s *dcopy_handle_t;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* dcopy_alloc() and dcopy_cmd_alloc() common flags */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_SLEEP (0)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_NOSLEEP (1 << 0)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_alloc()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Allocate a DMA channel which is used for posting DMA requests. Note: this
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * does not give the caller exclusive access to the DMA engine. Commands
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * posted to a channel will complete in order.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * flags - (DCOPY_SLEEP, DCOPY_NOSLEEP)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * returns => DCOPY_FAILURE, DCOPY_SUCCESS, DCOPY_NORESOURCES
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusint dcopy_alloc(int flags, dcopy_handle_t *handle);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_free()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Free the DMA channel. The client can no longer use the handle to post or
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * poll for status on posts which were previously done on this channel.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusvoid dcopy_free(dcopy_handle_t *handle);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* dq_version */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_QUERY_CHANNEL_V0 0
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* Per DMA channel info */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutustypedef struct dcopy_query_channel_s {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int qc_version; /* DCOPY_QUERY_CHANNEL_V0 */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* Does DMA channel support DCA */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus boolean_t qc_dca_supported;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* device id and device specific capabilities */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint64_t qc_id;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint64_t qc_capabilities;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * DMA channel size. This may not be the same as the number of posts
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * that the DMA channel can handle since a post may consume 1 or more
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * entries.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint64_t qc_channel_size;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* DMA channel number within the device. Not unique across devices */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint64_t qc_chan_num;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus} dcopy_query_channel_t;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_query_channel()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * query DMA engines capabilities
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusvoid dcopy_query_channel(dcopy_handle_t handle, dcopy_query_channel_t *query);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* dp_version */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_CMD_V0 0
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* dp_cmd */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_CMD_COPY 0x1
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* dp_flags */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * DCOPY_CMD_QUEUE
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Hint to queue up the post but don't notify the DMA engine. This can be
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * used as an optimization when multiple posts are going to be queued up and
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * you only want notify the DMA engine after the last post. Note, this does
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * not mean the DMA engine won't process the request since it could notice
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * it anyway.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * DCOPY_CMD_NOSTAT
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Don't generate a status. If this flag is used, You cannot poll for
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * completion status on this command. This can be a useful performance
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * optimization if your posting multiple commands and just want to poll on
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * the last command.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * DCOPY_CMD_DCA
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * If DCA is supported, direct this and all future command data (until the
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * next command with DCOPY_POST_DCA set) to the processor specified in
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dp_dca_id. This flag is ignored if DCA is not supported.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * DCOPY_CMD_INTR
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Generate an interrupt when command completes. This flag is required if
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * the caller is going to call dcopy_cmd_poll(() with DCOPY_POLL_BLOCK set
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * for this command.
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * DCOPY_CMD_NOWAIT
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * Return error instead of busy waiting if resource is not available.
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * DCOPY_CMD_NOSRCSNP
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * Disable source cache snooping.
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * DCOPY_CMD_NODSTSNP
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * Disable destination cache snooping.
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * DCOPY_CMD_LOOP
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * For CBv1, generate a loop descriptor list, used to support FIPE driver.
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * DCOPY_CMD_SYNC
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel * Reserved for internal use.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_CMD_NOFLAGS (0)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_CMD_QUEUE (1 << 0)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_CMD_NOSTAT (1 << 1)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_CMD_DCA (1 << 2)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_CMD_INTR (1 << 3)
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel#define DCOPY_CMD_NOWAIT (1 << 4)
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel#define DCOPY_CMD_NOSRCSNP (1 << 5)
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel#define DCOPY_CMD_NODSTSNP (1 << 6)
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel#define DCOPY_CMD_LOOP (1 << 7)
eca2601cae391051acb146d28fba04237fe1eb85Randy Fishel#define DCOPY_CMD_SYNC (1 << 30)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutustypedef struct dcopy_cmd_copy_s {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint64_t cc_source; /* Source physical address */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint64_t cc_dest; /* Destination physical address */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus size_t cc_size;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus} dcopy_cmd_copy_t;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutustypedef union dcopy_cmd_u {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus dcopy_cmd_copy_t copy;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus} dcopy_cmd_u_t;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutustypedef struct dcopy_cmd_priv_s *dcopy_cmd_priv_t;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstruct dcopy_cmd_s {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint_t dp_version; /* DCOPY_CMD_V0 */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint_t dp_flags;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint64_t dp_cmd;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus dcopy_cmd_u_t dp;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint32_t dp_dca_id;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus dcopy_cmd_priv_t dp_private;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus};
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutustypedef struct dcopy_cmd_s *dcopy_cmd_t;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_cmd_alloc() specific flags
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * DCOPY_ALLOC_LINK - when set, the caller passes in a previously alloced
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * command in cmd. dcopy_cmd_alloc() will allocate a new command and
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * link it to the old command. The caller can use this to build a
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * chain of commands, keeping only the last cmd alloced. calling
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_cmd_free() with the last cmd alloced in the chain will free all of
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * the commands in the chain. dcopy_cmd_post() and dcopy_cmd_poll() have
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * no knowledge of a chain of commands. It's only used for alloc/free.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_ALLOC_LINK (1 << 16)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_cmd_alloc()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * allocate a command. A command can be re-used after it completes.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * flags - (DCOPY_SLEEP || DCOPY_NOSLEEP), DCOPY_ALLOC_LINK
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * returns => DCOPY_FAILURE, DCOPY_SUCCESS, DCOPY_NORESOURCES
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusint dcopy_cmd_alloc(dcopy_handle_t handle, int flags, dcopy_cmd_t *cmd);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_cmd_free()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * free the command. This call cannot be called after dcopy_free().
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusvoid dcopy_cmd_free(dcopy_cmd_t *cmd);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_cmd_post()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * post a command (allocated from dcopy_cmd_alloc()) to the DMA channel
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * returns => DCOPY_FAILURE, DCOPY_SUCCESS, DCOPY_NORESOURCES
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusint dcopy_cmd_post(dcopy_cmd_t cmd);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* dcopy_cmd_poll() flags */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_POLL_NOFLAGS (0)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#define DCOPY_POLL_BLOCK (1 << 0)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * dcopy_cmd_poll()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * poll on completion status of a previous post. This call cannot be called
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * after dcopy_free().
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * if flags == DCOPY_POLL_NOFLAGS, return status can be DCOPY_FAILURE,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * DCOPY_PENDING, or DCOPY_COMPLETED.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * if flags & DCOPY_POLL_BLOCK, return status can be DCOPY_FAILURE or
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * DCOPY_COMPLETED. DCOPY_POLL_BLOCK can only be set in base context.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * The command cannot be re-used or freed until the command has completed
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * (e.g. DCOPY_FAILURE or DCOPY_COMPLETED).
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusint dcopy_cmd_poll(dcopy_cmd_t cmd, int flags);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#ifdef __cplusplus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#endif
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#endif /* _SYS_DCOPY_H */