diff options
Diffstat (limited to 'usr/src/uts/common/sys/1394/t1394.h')
| -rw-r--r-- | usr/src/uts/common/sys/1394/t1394.h | 766 |
1 files changed, 766 insertions, 0 deletions
diff --git a/usr/src/uts/common/sys/1394/t1394.h b/usr/src/uts/common/sys/1394/t1394.h new file mode 100644 index 0000000000..6fda994537 --- /dev/null +++ b/usr/src/uts/common/sys/1394/t1394.h @@ -0,0 +1,766 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _SYS_1394_T1394_H +#define _SYS_1394_T1394_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* + * t1394.h + * Contains all of the prototypes, defines, and structures necessary + * for building drivers using the Solaris 1394 Software Framework. + */ + +#include <sys/types.h> +#include <sys/dditypes.h> +#include <sys/ddi.h> +#include <sys/sunddi.h> + +#include <sys/1394/s1394_impl.h> +#include <sys/1394/cmd1394.h> +#include <sys/1394/id1394.h> +#include <sys/1394/ixl1394.h> +#include <sys/1394/ieee1394.h> +#include <sys/1394/ieee1212.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Macro to convert a byte stream into a big endian quadlet or octlet or + * back the other way. All data is treated as byte streams over the 1394 + * bus. These macros will convert the data to a big endian "integer" on + * x86 platforms, and it will do nothing if it is not on x86. + */ +#ifdef _LITTLE_ENDIAN +#define T1394_DATA32(DATA) ddi_swap32(DATA) +#define T1394_DATA64(DATA) ddi_swap64(DATA) +#else +#define T1394_DATA32(DATA) (DATA) +#define T1394_DATA64(DATA) (DATA) +#endif + +/* The various "handles" returned by the 1394 Framework */ + +/* Target handle type */ +typedef struct target_handle *t1394_handle_t; +/* Address handle type */ +typedef struct address_handle *t1394_addr_handle_t; +/* Isoch single handle type */ +typedef struct isoch_handle *t1394_isoch_single_handle_t; +/* Isoch CEC handle type */ +typedef struct isoch_handle *t1394_isoch_cec_handle_t; +/* Config ROM handle type */ +typedef struct cfgrom_handle *t1394_cfgrom_handle_t; + + +/* + * t1394_localinfo_t + * is filled in and returned by the 1394 Framework at attach time + * (in the t1394_attachinfo_t structure returned from t1394_attach()) + * to provide the local host nodeID and the current bus generation. + */ +typedef struct t1394_localinfo_s { + uint_t bus_generation; + uint_t local_nodeID; +} t1394_localinfo_t; + +/* + * t1394_attachinfo_t + * is filled in and returned by the 1394 Framework at attach time + * (returned from the call to t1394_attach()). This structure contains + * the t1394_localinfo_t structure described above, as well as the + * iblock cookie and the attributes necessary for DMA allocations, etc. + */ +typedef struct t1394_attachinfo_s { + ddi_iblock_cookie_t iblock_cookie; + ddi_device_acc_attr_t acc_attr; + ddi_dma_attr_t dma_attr; + t1394_localinfo_t localinfo; +} t1394_attachinfo_t; + + +/* + * t1394_addr_enable_t + * is used in the t1394_alloc_addr_t structure, passed to + * t1394_alloc_addr(), to indicate what types of (incoming) + * asynchronous requests will be allowed in a given address block. + * If, for example, an address block is intended to be read-only, + * then only the T1394_ADDR_RDENBL bit should be enabled at allocation + * time. Then, when incoming requests of an inappropriate type (write + * or lock requests, in this case) arrive, the 1394 Framework can + * automatically respond to them with TYPE_ERROR in the response + * without having to notify the target driver. + */ +typedef enum { + T1394_ADDR_RDENBL = (1 << 0), + T1394_ADDR_WRENBL = (1 << 1), + T1394_ADDR_LKENBL = (1 << 2) +} t1394_addr_enable_t; + +/* + * t1394_addr_type_t + * is used in the t1394_alloc_addr_t structure, passed to + * t1394_alloc_addr(), to indicate what type of address block the + * target driver would like to allocate. + * T1394_ADDR_POSTED_WRITE indicates posted write memory, where + * incoming write requests are automatically acknowledged as complete. + * T1394_ADDR_NORMAL indicates memory, unlike the posted write area, + * where all requests regardless of type are ack_pended upon receipt + * and are subsequently responded to. + * T1394_ADDR_CSR memory range is generally used by target drivers + * that are implementing a well-defined protocol. + * And T1394_ADDR_FIXED is used to indicate to t1394_alloc_addr() + * that a specific set of addresses are needed. Unlike the other three + * types, this type of request is used to choose a specific address or + * range of addresses in 1394 address space. + */ +typedef enum { + T1394_ADDR_POSTED_WRITE = 0, + T1394_ADDR_NORMAL = 1, + T1394_ADDR_CSR = 2, + T1394_ADDR_FIXED = 3 +} t1394_addr_type_t; + +/* + * t1394_addr_evts_t + * is used in the t1394_alloc_addr_t structure, passed to + * t1394_alloc_addr(), to specify callback routines for the + * allocated address block. When a request of the appropriate type + * (read/write/lock) is received to a target driver's address + * block, the appropriate callback routine is consulted and if it is + * non-NULL it is called and passed a cmd1394_cmd_t structure used to + * describe the incoming asynch request. + */ +typedef struct t1394_addr_evts { + void (*recv_read_request)(cmd1394_cmd_t *req); + void (*recv_write_request)(cmd1394_cmd_t *req); + void (*recv_lock_request)(cmd1394_cmd_t *req); +} t1394_addr_evts_t; + +/* + * t1394_alloc_addr_t + * is passed to t1394_alloc_addr(), when 1394 address space is being + * allocated, to describe the type of address space. The target driver + * is responsible for specifying the aa_enable, aa_type, and aa_evts + * fields described above as well as the size of the allocated block. + * Additionally, the target driver may specify backing store + * (aa_kmem_bufp), a specific address (in aa_address if aa_type is + * T1394_ADDR_FIXED), and a callback argument (in aa_arg) to be + * passed to the target in any of its callback routines. + * When it returns, t1394_alloc_addr() will return in aa_address the + * starting address of the requested block of 1394 address space and + * and address block handle (aa_hdl) used to free the address block + * in a call to t1394_free_addr(). + */ +typedef struct t1394_alloc_addr { + t1394_addr_type_t aa_type; /* IN: address region */ + size_t aa_length; /* IN: # bytes requested */ + t1394_addr_enable_t aa_enable; /* IN: request enables */ + t1394_addr_evts_t aa_evts; /* IN: event callbacks */ + opaque_t aa_arg; /* IN: evt callback arg */ + caddr_t aa_kmem_bufp; /* IN: backing-store buf */ + uint64_t aa_address; /* IN/OUT: alloced address */ + t1394_addr_handle_t aa_hdl; /* OUT: returned to target */ +} t1394_alloc_addr_t; + +/* + * t1394_fcp_evts_t + * is used in t1394_fcp_register_controller(). FCP only allows writes. + */ +typedef struct t1394_fcp_evts { + int (*fcp_write_request)(cmd1394_cmd_t *req); + opaque_t fcp_arg; +} t1394_fcp_evts_t; + +/* values returned by the FCP callback */ +enum { + T1394_REQ_CLAIMED, /* request is recognized by the target */ + T1394_REQ_UNCLAIMED /* request is not recognized by the target */ +}; + +/* + * t1394_cmp_reg_t + * CMP register types + */ +typedef enum { + T1394_CMP_OMPR, /* oMPR */ + T1394_CMP_IMPR /* iMPR */ +} t1394_cmp_reg_t; + +/* + * t1394_cmp_evts_t + * is used in t1394_cmp_register(). + */ +typedef struct t1394_cmp_evts { + void (*cmp_reg_change)(opaque_t, t1394_cmp_reg_t); + opaque_t cmp_arg; +} t1394_cmp_evts_t; + +/* + * t1394_isoch_rsrc_error_t + * is used in the rsrc_fail_target() callback to indicate the reason + * for the resource allocation failure. T1394_RSRC_BANDWIDTH indicates + * that insufficient bandwidth was available for the requested allocation, + * and T1394_RSRC_CHANNEL indicates that none of the requested channels + * were available. + */ +typedef enum { + T1394_RSRC_BANDWIDTH = 1, + T1394_RSRC_CHANNEL = 2 +} t1394_isoch_rsrc_error_t; + +/* + * t1394_isoch_singleinfo_t + * is passed to the t1394_alloc_isoch_single() routine. A target + * driver will use this structure to indicate the channels it supports, + * the maximum speed for the isochronous channel, the amount of + * bandwidth required, and the callback (and callback arg) to be used + * when notifying the target of resource reallocation failures. + */ +typedef struct t1394_isoch_singleinfo_s { + uint64_t si_channel_mask; /* channels supported */ + uint_t si_speed; /* 1394 speed for the channel */ + uint_t si_bandwidth; /* max bytes per cycle */ + void (*rsrc_fail_target)( + t1394_isoch_single_handle_t t1394_single_hdl, + opaque_t single_evt_arg, + t1394_isoch_rsrc_error_t fail_args); + opaque_t single_evt_arg; +} t1394_isoch_singleinfo_t; + +/* + * t1394_isoch_single_out_t + * is filled in and returned to the target by the + * t1394_alloc_isoch_single() routine. It indicates the number of the + * channel that was actually allocated for the target driver. This + * channel number will typically be used by a target driver to setup + * isochronous DMA or other resources. + */ +typedef struct t1394_isoch_single_out_s { + uint_t channel_num; /* number for the allocated channel */ +} t1394_isoch_single_out_t; + +/* + * t1394_setup_target_args_t + * is used in the setup_target() callback to indicate the channel number + * and channel speed for the isochronous channel coordinated by the + * Isoch CEC routines. + */ +typedef struct t1394_setup_target_args_s { + uint_t channel_num; /* number for the allocated channel */ + uint_t channel_speed; /* 1394 speed for the channel */ +} t1394_setup_target_args_t; + +/* + * t1394_cec_options_t + * is used in the t1394_isoch_cec_props_t structure, passed to + * t1394_alloc_isoch_cec(). As the cec_options field in that + * structure, it can be used to request that the 1394 Framework + * NOT automatically reallocate the same isochronous channel and + * bandwidth, if a bus reset happens. The default behavior is to + * let the 1394 Framework attempt to reallocate the same channel and + * bandwidth the target had after a bus reset, but some target drivers + * may not require this functionality and they therefore have the option + * to decline this service. + */ +typedef enum { + T1394_NO_IRM_ALLOC = (1 << 0) +} t1394_cec_options_t; + +/* + * t1394_isoch_cec_props_t + * is used in calls to the t1394_alloc_isoch_cec() routine. The + * minimum and maximum speeds, channels supported, and the amount + * of bandwidth necessary for the channel are specified. These + * characteristics of the Isoch CEC are specified at allocation time + * and are used to pass or fail targets that try to join the Isoch + * CEC later. + */ +typedef struct t1394_isoch_cec_props_s { + uint_t cec_min_speed; /* min speed supported */ + uint_t cec_max_speed; /* max speed supported */ + uint64_t cec_channel_mask; /* channels supported */ + uint_t cec_bandwidth; /* max bytes per cycle */ + t1394_cec_options_t cec_options; +} t1394_isoch_cec_props_t; + +/* + * t1394_isoch_cec_evts_t + * is used in the t1394_join_isochinfo_t structure, passed to + * t1394_join_isoch_cec(). This structure is a list of callbacks + * for each of the various events the Isoch CEC is responsible for + * coordinating. + * The setup_target() callback is called after the isochronous + * channel and bandwidth for the Isoch CEC have been allocated + * (as a result of a call to t1394_setup_isoch_cec()) to inform the + * member targets of the channel number and speed. + * The start_target() callback is called for all member targets + * as a result of a call to t1394_start_isoch_cec(). + * The stop_target() callback is called for all member targets + * as a result of a call to t1394_stop_isoch_cec(). + * The rsrc_fail_target() callback (as mentioned above) is called + * to indicate that the 1394 Framework was unable to reallocate + * isochronous resources and the reason for the failure. + * And the teardown_target() callback is called as a result of + * a call to t1394_teardown_isoch_cec() to indicate that the + * isochronous channel and bandwidth are being freed up. + */ +typedef struct t1394_isoch_cec_evts_s { + int (*setup_target)( + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, + opaque_t isoch_cec_evts_arg, + t1394_setup_target_args_t *setup_args); + int (*start_target)( + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, + opaque_t isoch_cec_evts_arg); + void (*stop_target)( + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, + opaque_t isoch_cec_evts_arg); + void (*rsrc_fail_target)( + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, + opaque_t isoch_cec_evts_arg, + t1394_isoch_rsrc_error_t fail_args); + void (*teardown_target)( + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, + opaque_t isoch_cec_evts_arg); +} t1394_isoch_cec_evts_t; + +/* + * t1394_jii_options_t + * is used in the t1394_join_isochinfo_t structure, passed to + * t1394_join_isoch_cec(). As the jii_options field in that + * structure, it is used to indicate to the 1394 Framework + * that the member target is the talker on the channel. There can + * be no more than one talker per Isoch CEC, and a member target + * may fail in t1394_join_isoch_cec() because there is already a + * talker on the Isoch CEC. + */ +typedef enum { + T1394_TALKER = (1 << 0) +} t1394_jii_options_t; + +/* + * t1394_join_isochinfo_t + * is used in calls to the t1394_join_isoch_cec() routine. The + * req_channel_mask field indicate the channels that a member + * target can support. If these channels are inconsistent with + * the characteristics passed in at allocation or with the current + * characteristics of the other members of the Isoch CEC, then the + * t1394_join_isoch_cec() call will fail. + * The req_max_speed field is used similarly. If the member target's + * maximum speed is inconsistent with the other members of the + * Isoch CEC, then the t1394_join_isoch_cec() will fail. + * In addition to the above fields, a joining member target will pass + * the jii_options (indicate talker or listener), the callbacks and + * the callback arg (see above). + */ +typedef struct t1394_join_isochinfo_s { + uint64_t req_channel_mask; /* target chnls supported */ + uint_t req_max_speed; /* target max_speed */ + t1394_jii_options_t jii_options; + opaque_t isoch_cec_evts_arg; + t1394_isoch_cec_evts_t isoch_cec_evts; +} t1394_join_isochinfo_t; + + +/* + * t1394_targetinfo_t + * is used in calls to the t1394_get_targetinfo() routine. The + * structure returned to the target contains current_max_payload, + * the default maximum block size that the host device will use in + * asynchronous block reads and writes to the target's device. + * It also contains current_max_speed, the default maximum speed at + * which the host device will communicate with the target's device. + * The structure also contains the target driver's target nodeID, + * the number assigned to the device for the current bus + * generation. It will contain T1394_INVALID_NODEID if the target + * device is no longer connected to the 1394 Serial Bus. + */ +typedef struct t1394_targetinfo_s { + uint_t current_max_payload; + uint_t current_max_speed; + uint_t target_nodeID; +} t1394_targetinfo_t; +#define T1394_INVALID_NODEID 0xFFFF + +/* + * t1394_cfgrom_entryinfo_t + * is used in calls to the t1394_add_cfgrom_entry() routine. The + * t1394_cfgrom_entryinfo_t structure contains the information necessary + * to add the Config ROM entry. The ce_buffer and ce_size are used to + * describe the data to be added, and the ce_key is used to indicate + * what type of entry in the Config ROM buffer the data represents + * (see ieee1212.h fro key types). + */ +typedef struct t1394_cfgrom_entryinfo_s { + uint_t ce_key; /* key for Root Dir. entry */ + size_t ce_size; /* size of the buffer */ + uint32_t *ce_buffer; /* buffer for Config ROM data */ +} t1394_cfgrom_entryinfo_t; + + + +/* + * ATTACH and DETACH: + * These are the calls into 1394 Framework used during target driver + * attach() and detach(). The t1394_attach() routine takes a dip and + * a version (T1394_VERSION_V1) as its input arguments, and it fills + * in and returns a t1394_attachinfo_t structure (described above) and + * the t1394_handle_t. This target handle is used in all subsequent + * calls into the 1394 Framework. + * The t1394_detach() routine is called from a target driver's detach() + * routine to unregister itself from the 1394 Framework. + */ +int t1394_attach(dev_info_t *dip, int version, uint_t flags, + t1394_attachinfo_t *attachinfo, t1394_handle_t *t1394_hdl); +/* Version value */ +#define T1394_VERSION_V1 1 + +int t1394_detach(t1394_handle_t *t1394_hdl, uint_t flags); + + +/* + * OUTGOING ASYNCHRONOUS COMMANDS: + * These are the calls into 1394 Framework used for allocating/freeing + * and sending (outgoing) asynchronous requests. The t1394_alloc_cmd() + * routine takes a target driver's handle as an input argument and + * returns the cmd1394_cmd_t structure necessary for sending asynch + * requests. The flags parameter is used to indicate whether or not the + * 1394 Framework may sleep while allocating memory for the command. + * The t1394_free_cmd() routine is used to free up commands allocated + * by t1394_alloc_cmd(). Commands should not be in use at the time + * t1394_free_cmd() is called or the call may fail (return DDI_FAILURE). + * After an asynch command has been allocated and filled in (see + * the cmd1394.h file for more details) to indicate the type of request, + * what types of options are necessary, callback functions and/or data + * (if necessary), the command is passed to either t1394_read(), + * t1394_write(), or t1394_lock(). These routines will return DDI_SUCCESS + * or DDI_FAILURE depending on whether the command has been successfully + * accepted by the 1394 Framework. If the command is a "blocking" + * command, the function will not return until the command has completed. + * If, however, a callback has been specified in the command, that + * function will be called when the command completes. + */ +int t1394_alloc_cmd(t1394_handle_t t1394_hdl, uint_t flags, + cmd1394_cmd_t **cmdp); +/* Flags passed to t1394_alloc_cmd() */ +#define T1394_ALLOC_CMD_NOSLEEP 0x00000001 /* don't sleep in alloc */ +#define T1394_ALLOC_CMD_FCP_COMMAND 0x00010000 /* FCP command */ +#define T1394_ALLOC_CMD_FCP_RESPONSE 0x00020000 /* FCP response */ + +int t1394_free_cmd(t1394_handle_t t1394_hdl, uint_t flags, + cmd1394_cmd_t **cmdp); + +int t1394_read(t1394_handle_t t1394_hdl, cmd1394_cmd_t *cmd); + +int t1394_write(t1394_handle_t t1394_hdl, cmd1394_cmd_t *cmd); + +int t1394_lock(t1394_handle_t t1394_hdl, cmd1394_cmd_t *cmd); + + +/* + * 1394 ADDRESS SPACE AND INCOMING ASYNCHRONOUS COMMANDS: + * These are the calls into the 1394 Framework used for allocating/freeing + * 1394 address space and handling incoming asynchronous requests. The + * t1394_alloc_addr() routine is used to allocate 1394 address space. It + * is passed the target handle and a t1394_alloc_addr_t structure + * (described above). + * The t1394_free_addr() routine is used to free any allocated address + * space that the target may have. Typically, this will be done in a + * target driver's detach() routine (before calling t1394_detach()). + * The t1394_recv_request_done() routine is used after a target has + * received and handled an incoming asynch request. It is used to send + * a response to the request. After the command is sent to + * t1394_recv_request_done(), it should not be modified or used because + * the 1394 Framework may free it up without notifying the target driver. + */ +int t1394_alloc_addr(t1394_handle_t t1394_hdl, t1394_alloc_addr_t *addr_allocp, + uint_t flags, int *result); +/* Results codes returned by t1394_alloc_addr() */ +#define T1394_EALLOC_ADDR (-400) +#define T1394_EADDR_FIRST T1394_EALLOC_ADDR +#define T1394_EADDR_LAST T1394_EALLOC_ADDR +/* + * NOTE: Make sure T1394_EADDR_LAST is updated if a new error code is + * added. t1394_errmsg.c uses *FIRST and *LAST as bounds checks. + */ + +int t1394_free_addr(t1394_handle_t t1394_hdl, t1394_addr_handle_t *addr_hdl, + uint_t flags); + +int t1394_recv_request_done(t1394_handle_t t1394_hdl, cmd1394_cmd_t *resp, + uint_t flags); + + +/* + * FCP SERVICES: + * Function Control Protocol (FCP) is defined in IEC 61883-1 and supported + * by the 1394 Framework. While target drivers could use t1394_alloc_addr() + * and standard asynchronous services, only one driver could use FCP at a + * time, because the FCP addresses have fixed values. To allow sharing of + * FCP address space, the following Framework services should be used. + * + * t1394_fcp_register_controller() registers the target as an FCP controller, + * which allows it to write into target's FCP command register and receive + * write requests into host's FCP response register. It takes a valid + * t1394_handle_t argument, hence it should be called after t1394_attach(). + * t1394_fcp_unregister_controller() unregisters the target. + * + * t1394_fcp_register_target() and t1394_fcp_unregister_target() are + * target counterparts of the above controller functions. + */ + +int t1394_fcp_register_controller(t1394_handle_t t1394_hdl, + t1394_fcp_evts_t *evts, uint_t flags); + +int t1394_fcp_unregister_controller(t1394_handle_t t1394_hdl); + +int t1394_fcp_register_target(t1394_handle_t t1394_hdl, + t1394_fcp_evts_t *evts, uint_t flags); + +int t1394_fcp_unregister_target(t1394_handle_t t1394_hdl); + + +/* + * CMP services: + * Connection Management Procedures (CMP) is defined in IEC 61883-1 and + * supported by the 1394 Framework by providing the drivers with shared + * access to iMPR and oMPR registers, which are created by the Framework + * when t1394_cmp_register() is called and destroyed when + * t1394_cmp_unregister() is called. These registers can be read using + * t1394_cmp_read() function and compare-swapped using t1394_cmp_cas(). + * + * oPCR and iPCR registers can be allocated by the drivers using + * t1394_alloc_addr() function. + */ +int t1394_cmp_register(t1394_handle_t t1394_hdl, t1394_cmp_evts_t *evts, + uint_t flags); + +int t1394_cmp_unregister(t1394_handle_t t1394_hdl); + +int t1394_cmp_read(t1394_handle_t t1394_hdl, t1394_cmp_reg_t reg, + uint32_t *valp); + +int t1394_cmp_cas(t1394_handle_t t1394_hdl, t1394_cmp_reg_t reg, + uint32_t arg_val, uint32_t new_val, uint32_t *old_valp); + + +/* + * ISOCHRONOUS SERVICES: + * These are the calls into the 1394 Framework used for isochronous + * services. The t1394_alloc_isoch_single() routine takes a target + * handle and a t1394_isoch_singleinfo_t structure (see above). It will + * attempt to setup an isochronous channel (which will be automatically + * reallocated after bus resets), and it will return the channel number + * of the allocated channel in the t1394_isoch_single_out_t structure. + * Additionally, it returns a t1394_isoch_single_handle_t structure + * which is passed to t1394_free_isoch_single() when the isochronous + * channel is no longer required. + * The t1394_alloc_isoch_cec() and t1394_free_isoch_cec() are used to + * allocate and free an Isoch Channel Event Coordinator (CEC). Target + * drivers pass a t1394_isoch_cec_props_t structure (described above) + * to specify the initial characteristics of the Isoch CEC. + * Targets will subsequently join the Isoch CEC with t1394_join_isoch_cec() + * before setting up the channel with t1394_setup_isoch_cec(). + * Calls to t1394_join_isoch_cec() are used by targets who wish to join + * the Isoch CEC and receive all of the channel event notifications. + * When they want to leave target drivers call t1394_leave_isoch_cec(). + * The t1394_setup_isoch_cec(), as described above, is used to setup the + * the isochronous channel and bandwidth and to notify all member targets + * of the allocated channel number and speed. After targets have finished + * using the isoch channel, the resources can be torn down with a call to + * t1394_teardown_isoch_cec(). + * Additionally, the t1394_start_isoch_cec() and t1394_stop_isoch_cec() + * routines can be used by member targets to coordinate additional events, + * such as the starting and stopping of isochronous DMA or other resources. + */ +int t1394_alloc_isoch_single(t1394_handle_t t1394_hdl, + t1394_isoch_singleinfo_t *sii, uint_t flags, + t1394_isoch_single_out_t *output_args, + t1394_isoch_single_handle_t *t1394_single_hdl, int *result); + +void t1394_free_isoch_single(t1394_handle_t t1394_hdl, + t1394_isoch_single_handle_t *t1394_single_hdl, uint_t flags); + +int t1394_alloc_isoch_cec(t1394_handle_t t1394_hdl, + t1394_isoch_cec_props_t *props, uint_t flags, + t1394_isoch_cec_handle_t *t1394_isoch_cec_hdl); + +int t1394_free_isoch_cec(t1394_handle_t t1394_hdl, uint_t flags, + t1394_isoch_cec_handle_t *t1394_isoch_cec_hdl); + +int t1394_join_isoch_cec(t1394_handle_t t1394_hdl, + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, uint_t flags, + t1394_join_isochinfo_t *join_isoch_info); + +int t1394_leave_isoch_cec(t1394_handle_t t1394_hdl, + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, uint_t flags); + +int t1394_setup_isoch_cec(t1394_handle_t t1394_hdl, + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, uint_t flags, int *result); + +/* Results codes returned by t1394_setup_isoch_cec() */ +#define T1394_ENO_BANDWIDTH (-500) +#define T1394_ENO_CHANNEL (-501) +#define T1394_ETARGET (-502) +#define T1394_CEC_ERR_FIRST T1394_ENO_BANDWIDTH +#define T1394_CEC_ERR_LAST T1394_ETARGET +/* + * NOTE: Make sure T1394_ERR_LAST is updated if a new error code is + * added. t1394_errmsg.c uses *FIRST and *LAST as bounds checks. + */ + +int t1394_start_isoch_cec(t1394_handle_t t1394_hdl, + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, uint_t flags); + +int t1394_stop_isoch_cec(t1394_handle_t t1394_hdl, + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, uint_t flags); + +int t1394_teardown_isoch_cec(t1394_handle_t t1394_hdl, + t1394_isoch_cec_handle_t t1394_isoch_cec_hdl, uint_t flags); + + +/* + * ISOCHRONOUS DMA (LOCAL ISOCH DMA) SERVICES: + * These are the calls into the 1394 Framework used for local + * isochronous DMA services. The t1394_alloc_isoch_dma() routine + * takes a target handle and an id1394_isoch_dmainfo_t structure + * (see id1394.h for details) as its input arguments and returns a + * t1394_isoch_dma_handle_t that the target driver will use with all + * other local host DMA calls. After allocating a local host DMA + * resource, a target driver may start and stop it as often as desired + * using the t1394_start_isoch_dma() and t1394_stop_isoch_dma() calls. + * The t1394_start_isoch_dma() takes an id1394_isoch_dma_ctrlinfo_t + * structure (also discussed in more detail in id1394.h) as an + * additional argument to indicate among other things the conditions + * under which the host DMA will be started. + * The t1394_free_isoch_dma() is used, not surprisingly, to free up + * allocate isoch DMA resources. + * And the t1394_update_isoch_dma() routine is used to update a running + * isochronous stream. By creating and passing a temporary IXL command + * or set of commands and both the kernel virtual addresses of the + * temporary and original commands, a target driver can request that the + * 1394 Framework replace the original field contents with those in the + * temporary command and update the corresponding hardware DMA elements. + */ +int t1394_alloc_isoch_dma(t1394_handle_t t1394_hdl, + id1394_isoch_dmainfo_t *idi, uint_t flags, + t1394_isoch_dma_handle_t *t1394_idma_hdl, int *result); + +/* + * Results codes returned by t1394_alloc_isoch_dma(). See ixl1394.h for possible + * IXL1394 compilation errors. + * NOTE: Make sure T1394_IDMA_ERR_LAST is updated if a new error code is + * added. + */ +#define T1394_EIDMA_NO_RESRCS (-600) +#define T1394_EIDMA_CONFLICT (-601) +#define T1394_IDMA_ERR_FIRST T1394_EIDMA_NO_RESRCS +#define T1394_IDMA_ERR_LAST T1394_EIDMA_CONFLICT + +void t1394_free_isoch_dma(t1394_handle_t t1394_hdl, uint_t flags, + t1394_isoch_dma_handle_t *t1394_idma_hdl); + +int t1394_start_isoch_dma(t1394_handle_t t1394_hdl, + t1394_isoch_dma_handle_t t1394_idma_hdl, + id1394_isoch_dma_ctrlinfo_t *idma_ctrlinfo, uint_t flags, int *result); + +void t1394_stop_isoch_dma(t1394_handle_t t1394_hdl, + t1394_isoch_dma_handle_t t1394_idma_hdl, uint_t flags); + +/* See ixl1394.h for possible IXL1394 t1394_update_isoch_dma() errors. */ +int t1394_update_isoch_dma(t1394_handle_t t1394_hdl, + t1394_isoch_dma_handle_t t1394_idma_hdl, + id1394_isoch_dma_updateinfo_t *idma_updateinfo, uint_t flags, int *result); + + +/* + * MISCELLANEOUS SERVICES: + * These are the calls into the 1394 Framework used for miscellaneous + * services, including getting target information and topology map, + * adding to and removing from local Config ROM, initiating bus resets, + * etc. The t1394_get_targetinfo() routine is used to get information + * about the target driver's device and about current bus conditions + * that might be useful to a target. By passing the target handle and + * current bus generation, a target driver can expect to receive a filled + * in t1394_targetinfo_t structure (see above) that contains the + * current_max_payload, current_max_speed, and device's nodeID. + * The t1394_initiate_bus_reset() routine can be used by target drivers + * to initiate a bus reset. This call should be used only when it is + * absolutely imperative, however, as bus resets affect all devices on + * the 1394 Serial Bus and excessive use of bus resets can have an + * adverse effect on overall bus performance. + * The t1394_get_topology_map() will return the TOPOLOGY_MAP (see + * IEEE 1394-1995, Section 8.3.2.4.1) which is a list of SelfID packets + * from the current bus generation. + * The t1394_CRC16() call is used to calculate cyclic redundancy checks + * (CRCs) necessary for use in Config ROM buffers. + * The t1394_add_cfgrom_entry() and t1394_rem_cfgrom_entry() calls are + * used, respectively, to add and remove entries from the local host + * Config ROM buffer. (See above for a description of the + * t1394_cfgrom_entryinfo_t structure.) + * And the t1394_errmsg() routine is used to convert result codes which + * have been returned by the 1394 Framework into character strings for + * use in error messages. + */ +int t1394_get_targetinfo(t1394_handle_t t1394_hdl, uint_t bus_generation, + uint_t flags, t1394_targetinfo_t *targetinfo); + +void t1394_initiate_bus_reset(t1394_handle_t t1394_hdl, uint_t flags); + +int t1394_get_topology_map(t1394_handle_t t1394_hdl, uint_t bus_generation, + size_t tm_length, uint_t flags, uint32_t *tm_buffer); + +uint_t t1394_CRC16(uint32_t *d, size_t crc_length, uint_t flags); + +int t1394_add_cfgrom_entry(t1394_handle_t t1394_hdl, + t1394_cfgrom_entryinfo_t *cfgrom_entryinfo, uint_t flags, + t1394_cfgrom_handle_t *t1394_cfgrom_hdl, int *result); +/* Results codes returned by t1394_add_cfgrom_entry() */ +#define T1394_ECFGROM_FULL (-700) +#define T1394_EINVALID_PARAM (-701) +#define T1394_EINVALID_CONTEXT (-702) +#define T1394_NOERROR (-703) +#define T1394_ECFG_FIRST T1394_ECFGROM_FULL +#define T1394_ECFG_LAST T1394_NOERROR +/* + * NOTE: Make sure T1394_ECFG_LAST is updated if a new error code is + * added. t1394_errmsg.c uses *FIRST and *LAST as bounds checks. + */ + +int t1394_rem_cfgrom_entry(t1394_handle_t t1394_hdl, uint_t flags, + t1394_cfgrom_handle_t *t1394_cfgrom_hdl, int *result); + +const char *t1394_errmsg(int result, uint_t flags); + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_1394_T1394_H */ |
