Home | History | Annotate | Download | only in sys
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #ifndef _SYS_DCOPY_H
     28 #define	_SYS_DCOPY_H
     29 
     30 #ifdef __cplusplus
     31 extern "C" {
     32 #endif
     33 
     34 #include <sys/types.h>
     35 
     36 /*
     37  * *** This interface is for private use by the IP stack only ***
     38  */
     39 
     40 /* Private dcopy/uioa interface for dcopy to enable/disable dcopy KAPI */
     41 extern void uioa_dcopy_enable();
     42 extern void uioa_dcopy_disable();
     43 
     44 /* Function return status */
     45 #define	DCOPY_FAILURE		(-1)
     46 #define	DCOPY_SUCCESS		(0)
     47 #define	DCOPY_NORESOURCES	(1) /* _alloc & _cmd_alloc, _cmd_post only */
     48 #define	DCOPY_PENDING		(0x10) /* dcopy_poll(), dcopy_unregister() */
     49 #define	DCOPY_COMPLETED		(0x20) /* dcopy_poll() only */
     50 
     51 
     52 /* dq_version */
     53 #define	DCOPY_QUERY_V0	0
     54 
     55 typedef struct dcopy_query_s {
     56 	int		dq_version; /* DCOPY_QUERY_V0 */
     57 	uint_t		dq_num_channels; /* number of dma channels */
     58 } dcopy_query_t;
     59 
     60 /*
     61  * dcopy_query()
     62  *   query for the number of DMA engines usable in the system.
     63  */
     64 void dcopy_query(dcopy_query_t *query);
     65 
     66 
     67 typedef struct dcopy_channel_s *dcopy_handle_t;
     68 
     69 /* dcopy_alloc() and dcopy_cmd_alloc() common flags */
     70 #define	DCOPY_SLEEP	(0)
     71 #define	DCOPY_NOSLEEP	(1 << 0)
     72 
     73 /*
     74  * dcopy_alloc()
     75  *   Allocate a DMA channel which is used for posting DMA requests. Note: this
     76  *   does not give the caller exclusive access to the DMA engine. Commands
     77  *   posted to a channel will complete in order.
     78  *     flags - (DCOPY_SLEEP, DCOPY_NOSLEEP)
     79  *     returns => DCOPY_FAILURE, DCOPY_SUCCESS, DCOPY_NORESOURCES
     80  */
     81 int dcopy_alloc(int flags, dcopy_handle_t *handle);
     82 
     83 /*
     84  * dcopy_free()
     85  *   Free the DMA channel. The client can no longer use the handle to post or
     86  *   poll for status on posts which were previously done on this channel.
     87  */
     88 void dcopy_free(dcopy_handle_t *handle);
     89 
     90 /* dq_version */
     91 #define	DCOPY_QUERY_CHANNEL_V0	0
     92 
     93 /* Per DMA channel info */
     94 typedef struct dcopy_query_channel_s {
     95 	int		qc_version; /* DCOPY_QUERY_CHANNEL_V0 */
     96 
     97 	/* Does DMA channel support DCA */
     98 	boolean_t	qc_dca_supported;
     99 
    100 	/* device id and device specific capabilities */
    101 	uint64_t	qc_id;
    102 	uint64_t	qc_capabilities;
    103 
    104 	/*
    105 	 * DMA channel size. This may not be the same as the number of posts
    106 	 * that the DMA channel can handle since a post may consume 1 or more
    107 	 * entries.
    108 	 */
    109 	uint64_t	qc_channel_size;
    110 
    111 	/* DMA channel number within the device. Not unique across devices */
    112 	uint64_t	qc_chan_num;
    113 } dcopy_query_channel_t;
    114 
    115 /*
    116  * dcopy_query_channel()
    117  *   query DMA engines capabilities
    118  */
    119 void dcopy_query_channel(dcopy_handle_t handle, dcopy_query_channel_t *query);
    120 
    121 
    122 /* dp_version */
    123 #define	DCOPY_CMD_V0	0
    124 
    125 /* dp_cmd */
    126 #define	DCOPY_CMD_COPY	0x1
    127 
    128 /* dp_flags */
    129 /*
    130  * DCOPY_CMD_QUEUE
    131  *    Hint to queue up the post but don't notify the DMA engine. This can be
    132  *    used as an optimization when multiple posts are going to be queued up and
    133  *    you only want notify the DMA engine after the last post. Note, this does
    134  *    not mean the DMA engine won't process the request since it could notice
    135  *    it anyway.
    136  * DCOPY_CMD_NOSTAT
    137  *    Don't generate a status. If this flag is used, You cannot poll for
    138  *    completion status on this command. This can be a useful performance
    139  *    optimization if your posting multiple commands and just want to poll on
    140  *    the last command.
    141  * DCOPY_CMD_DCA
    142  *    If DCA is supported, direct this and all future command data (until the
    143  *    next command with DCOPY_POST_DCA set) to the processor specified in
    144  *    dp_dca_id. This flag is ignored if DCA is not supported.
    145  * DCOPY_CMD_INTR
    146  *    Generate an interrupt when command completes. This flag is required if
    147  *    the caller is going to call dcopy_cmd_poll(() with DCOPY_POLL_BLOCK set
    148  *    for this command.
    149  * DCOPY_CMD_NOWAIT
    150  *    Return error instead of busy waiting if resource is not available.
    151  * DCOPY_CMD_NOSRCSNP
    152  *    Disable source cache snooping.
    153  * DCOPY_CMD_NODSTSNP
    154  *    Disable destination cache snooping.
    155  * DCOPY_CMD_LOOP
    156  *    For CBv1, generate a loop descriptor list, used to support FIPE driver.
    157  * DCOPY_CMD_SYNC
    158  *    Reserved for internal use.
    159  */
    160 #define	DCOPY_CMD_NOFLAGS	(0)
    161 #define	DCOPY_CMD_QUEUE		(1 << 0)
    162 #define	DCOPY_CMD_NOSTAT	(1 << 1)
    163 #define	DCOPY_CMD_DCA		(1 << 2)
    164 #define	DCOPY_CMD_INTR		(1 << 3)
    165 #define	DCOPY_CMD_NOWAIT	(1 << 4)
    166 #define	DCOPY_CMD_NOSRCSNP	(1 << 5)
    167 #define	DCOPY_CMD_NODSTSNP	(1 << 6)
    168 #define	DCOPY_CMD_LOOP		(1 << 7)
    169 #define	DCOPY_CMD_SYNC		(1 << 30)
    170 
    171 typedef struct dcopy_cmd_copy_s {
    172 	uint64_t	cc_source; /* Source physical address */
    173 	uint64_t	cc_dest; /* Destination physical address */
    174 	size_t		cc_size;
    175 } dcopy_cmd_copy_t;
    176 
    177 typedef union dcopy_cmd_u {
    178 	dcopy_cmd_copy_t	copy;
    179 } dcopy_cmd_u_t;
    180 
    181 typedef struct dcopy_cmd_priv_s *dcopy_cmd_priv_t;
    182 
    183 struct dcopy_cmd_s {
    184 	uint_t			dp_version; /* DCOPY_CMD_V0 */
    185 	uint_t			dp_flags;
    186 	uint64_t		dp_cmd;
    187 	dcopy_cmd_u_t   	dp;
    188 	uint32_t		dp_dca_id;
    189 	dcopy_cmd_priv_t	dp_private;
    190 };
    191 typedef struct dcopy_cmd_s *dcopy_cmd_t;
    192 
    193 
    194 /*
    195  * dcopy_cmd_alloc() specific flags
    196  *   DCOPY_ALLOC_LINK - when set, the caller passes in a previously alloced
    197  *     command in cmd. dcopy_cmd_alloc() will allocate a new command and
    198  *     link it to the old command. The caller can use this to build a
    199  *     chain of commands, keeping only the last cmd alloced. calling
    200  *     dcopy_cmd_free() with the last cmd alloced in the chain will free all of
    201  *     the commands in the chain. dcopy_cmd_post() and dcopy_cmd_poll() have
    202  *     no knowledge of a chain of commands.  It's only used for alloc/free.
    203  */
    204 #define	DCOPY_ALLOC_LINK	(1 << 16)
    205 
    206 /*
    207  * dcopy_cmd_alloc()
    208  *   allocate a command. A command can be re-used after it completes.
    209  *     flags - (DCOPY_SLEEP || DCOPY_NOSLEEP), DCOPY_ALLOC_LINK
    210  *     returns => DCOPY_FAILURE, DCOPY_SUCCESS, DCOPY_NORESOURCES
    211  */
    212 int dcopy_cmd_alloc(dcopy_handle_t handle, int flags, dcopy_cmd_t *cmd);
    213 
    214 /*
    215  * dcopy_cmd_free()
    216  *   free the command. This call cannot be called after dcopy_free().
    217  */
    218 void dcopy_cmd_free(dcopy_cmd_t *cmd);
    219 
    220 /*
    221  * dcopy_cmd_post()
    222  *   post a command (allocated from dcopy_cmd_alloc()) to the DMA channel
    223  *     returns => DCOPY_FAILURE, DCOPY_SUCCESS, DCOPY_NORESOURCES
    224  */
    225 int dcopy_cmd_post(dcopy_cmd_t cmd);
    226 
    227 /* dcopy_cmd_poll() flags */
    228 #define	DCOPY_POLL_NOFLAGS	(0)
    229 #define	DCOPY_POLL_BLOCK	(1 << 0)
    230 
    231 /*
    232  * dcopy_cmd_poll()
    233  *   poll on completion status of a previous post. This call cannot be called
    234  *   after dcopy_free().
    235  *
    236  *   if flags == DCOPY_POLL_NOFLAGS, return status can be DCOPY_FAILURE,
    237  *   DCOPY_PENDING, or DCOPY_COMPLETED.
    238  *
    239  *   if flags & DCOPY_POLL_BLOCK, return status can be DCOPY_FAILURE or
    240  *   DCOPY_COMPLETED. DCOPY_POLL_BLOCK can only be set in base context.
    241  *
    242  *   The command cannot be re-used or freed until the command has completed
    243  *   (e.g. DCOPY_FAILURE or DCOPY_COMPLETED).
    244  */
    245 int dcopy_cmd_poll(dcopy_cmd_t cmd, int flags);
    246 
    247 
    248 #ifdef __cplusplus
    249 }
    250 #endif
    251 
    252 #endif /* _SYS_DCOPY_H */
    253