Home | History | Annotate | Download | only in linux
      1 /*
      2  * Char device interface.
      3  *
      4  * Copyright (C) 2005-2006  Kristian Hoegsberg <krh (at) bitplanet.net>
      5  *
      6  * This program is free software; you can redistribute it and/or modify
      7  * it under the terms of the GNU General Public License as published by
      8  * the Free Software Foundation; either version 2 of the License, or
      9  * (at your option) any later version.
     10  *
     11  * This program is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14  * GNU General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU General Public License
     17  * along with this program; if not, write to the Free Software Foundation,
     18  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     19  */
     20 
     21 #ifndef _LINUX_FIREWIRE_CDEV_H
     22 #define _LINUX_FIREWIRE_CDEV_H
     23 
     24 #include <linux/ioctl.h>
     25 #include <linux/types.h>
     26 #include <linux/firewire-constants.h>
     27 
     28 #define FW_CDEV_EVENT_BUS_RESET		0x00
     29 #define FW_CDEV_EVENT_RESPONSE		0x01
     30 #define FW_CDEV_EVENT_REQUEST		0x02
     31 #define FW_CDEV_EVENT_ISO_INTERRUPT	0x03
     32 
     33 /**
     34  * struct fw_cdev_event_common - Common part of all fw_cdev_event_ types
     35  * @closure:	For arbitrary use by userspace
     36  * @type:	Discriminates the fw_cdev_event_ types
     37  *
     38  * This struct may be used to access generic members of all fw_cdev_event_
     39  * types regardless of the specific type.
     40  *
     41  * Data passed in the @closure field for a request will be returned in the
     42  * corresponding event.  It is big enough to hold a pointer on all platforms.
     43  * The ioctl used to set @closure depends on the @type of event.
     44  */
     45 struct fw_cdev_event_common {
     46 	__u64 closure;
     47 	__u32 type;
     48 };
     49 
     50 /**
     51  * struct fw_cdev_event_bus_reset - Sent when a bus reset occurred
     52  * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_GET_INFO ioctl
     53  * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_BUS_RESET
     54  * @node_id:       New node ID of this node
     55  * @local_node_id: Node ID of the local node, i.e. of the controller
     56  * @bm_node_id:    Node ID of the bus manager
     57  * @irm_node_id:   Node ID of the iso resource manager
     58  * @root_node_id:  Node ID of the root node
     59  * @generation:    New bus generation
     60  *
     61  * This event is sent when the bus the device belongs to goes through a bus
     62  * reset.  It provides information about the new bus configuration, such as
     63  * new node ID for this device, new root ID, and others.
     64  */
     65 struct fw_cdev_event_bus_reset {
     66 	__u64 closure;
     67 	__u32 type;
     68 	__u32 node_id;
     69 	__u32 local_node_id;
     70 	__u32 bm_node_id;
     71 	__u32 irm_node_id;
     72 	__u32 root_node_id;
     73 	__u32 generation;
     74 };
     75 
     76 /**
     77  * struct fw_cdev_event_response - Sent when a response packet was received
     78  * @closure:	See &fw_cdev_event_common;
     79  *		set by %FW_CDEV_IOC_SEND_REQUEST ioctl
     80  * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE
     81  * @rcode:	Response code returned by the remote node
     82  * @length:	Data length, i.e. the response's payload size in bytes
     83  * @data:	Payload data, if any
     84  *
     85  * This event is sent when the stack receives a response to an outgoing request
     86  * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl.  The payload data for responses
     87  * carrying data (read and lock responses) follows immediately and can be
     88  * accessed through the @data field.
     89  */
     90 struct fw_cdev_event_response {
     91 	__u64 closure;
     92 	__u32 type;
     93 	__u32 rcode;
     94 	__u32 length;
     95 	__u32 data[0];
     96 };
     97 
     98 /**
     99  * struct fw_cdev_event_request - Sent on incoming request to an address region
    100  * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl
    101  * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST
    102  * @tcode:	Transaction code of the incoming request
    103  * @offset:	The offset into the 48-bit per-node address space
    104  * @handle:	Reference to the kernel-side pending request
    105  * @length:	Data length, i.e. the request's payload size in bytes
    106  * @data:	Incoming data, if any
    107  *
    108  * This event is sent when the stack receives an incoming request to an address
    109  * region registered using the %FW_CDEV_IOC_ALLOCATE ioctl.  The request is
    110  * guaranteed to be completely contained in the specified region.  Userspace is
    111  * responsible for sending the response by %FW_CDEV_IOC_SEND_RESPONSE ioctl,
    112  * using the same @handle.
    113  *
    114  * The payload data for requests carrying data (write and lock requests)
    115  * follows immediately and can be accessed through the @data field.
    116  */
    117 struct fw_cdev_event_request {
    118 	__u64 closure;
    119 	__u32 type;
    120 	__u32 tcode;
    121 	__u64 offset;
    122 	__u32 handle;
    123 	__u32 length;
    124 	__u32 data[0];
    125 };
    126 
    127 /**
    128  * struct fw_cdev_event_iso_interrupt - Sent when an iso packet was completed
    129  * @closure:	See &fw_cdev_event_common;
    130  *		set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl
    131  * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_ISO_INTERRUPT
    132  * @cycle:	Cycle counter of the interrupt packet
    133  * @header_length: Total length of following headers, in bytes
    134  * @header:	Stripped headers, if any
    135  *
    136  * This event is sent when the controller has completed an &fw_cdev_iso_packet
    137  * with the %FW_CDEV_ISO_INTERRUPT bit set.  In the receive case, the headers
    138  * stripped of all packets up until and including the interrupt packet are
    139  * returned in the @header field.
    140  */
    141 struct fw_cdev_event_iso_interrupt {
    142 	__u64 closure;
    143 	__u32 type;
    144 	__u32 cycle;
    145 	__u32 header_length;
    146 	__u32 header[0];
    147 };
    148 
    149 /**
    150  * union fw_cdev_event - Convenience union of fw_cdev_event_ types
    151  * @common:        Valid for all types
    152  * @bus_reset:     Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET
    153  * @response:      Valid if @common.type == %FW_CDEV_EVENT_RESPONSE
    154  * @request:       Valid if @common.type == %FW_CDEV_EVENT_REQUEST
    155  * @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT
    156  *
    157  * Convenience union for userspace use.  Events could be read(2) into a char
    158  * buffer and then cast to this union for further processing.
    159  */
    160 union fw_cdev_event {
    161 	struct fw_cdev_event_common common;
    162 	struct fw_cdev_event_bus_reset bus_reset;
    163 	struct fw_cdev_event_response response;
    164 	struct fw_cdev_event_request request;
    165 	struct fw_cdev_event_iso_interrupt iso_interrupt;
    166 };
    167 
    168 #define FW_CDEV_IOC_GET_INFO		_IOWR('#', 0x00, struct fw_cdev_get_info)
    169 #define FW_CDEV_IOC_SEND_REQUEST	_IOW('#', 0x01, struct fw_cdev_send_request)
    170 #define FW_CDEV_IOC_ALLOCATE		_IOWR('#', 0x02, struct fw_cdev_allocate)
    171 #define FW_CDEV_IOC_DEALLOCATE		_IOW('#', 0x03, struct fw_cdev_deallocate)
    172 #define FW_CDEV_IOC_SEND_RESPONSE	_IOW('#', 0x04, struct fw_cdev_send_response)
    173 #define FW_CDEV_IOC_INITIATE_BUS_RESET	_IOW('#', 0x05, struct fw_cdev_initiate_bus_reset)
    174 #define FW_CDEV_IOC_ADD_DESCRIPTOR	_IOWR('#', 0x06, struct fw_cdev_add_descriptor)
    175 #define FW_CDEV_IOC_REMOVE_DESCRIPTOR	_IOW('#', 0x07, struct fw_cdev_remove_descriptor)
    176 
    177 #define FW_CDEV_IOC_CREATE_ISO_CONTEXT	_IOWR('#', 0x08, struct fw_cdev_create_iso_context)
    178 #define FW_CDEV_IOC_QUEUE_ISO		_IOWR('#', 0x09, struct fw_cdev_queue_iso)
    179 #define FW_CDEV_IOC_START_ISO		_IOW('#', 0x0a, struct fw_cdev_start_iso)
    180 #define FW_CDEV_IOC_STOP_ISO		_IOW('#', 0x0b, struct fw_cdev_stop_iso)
    181 #define FW_CDEV_IOC_GET_CYCLE_TIMER	_IOR('#', 0x0c, struct fw_cdev_get_cycle_timer)
    182 
    183 /* FW_CDEV_VERSION History
    184  *
    185  * 1	Feb 18, 2007:  Initial version.
    186  */
    187 #define FW_CDEV_VERSION		1
    188 
    189 /**
    190  * struct fw_cdev_get_info - General purpose information ioctl
    191  * @version:	The version field is just a running serial number.
    192  *		We never break backwards compatibility, but may add more
    193  *		structs and ioctls in later revisions.
    194  * @rom_length:	If @rom is non-zero, at most rom_length bytes of configuration
    195  *		ROM will be copied into that user space address.  In either
    196  *		case, @rom_length is updated with the actual length of the
    197  *		configuration ROM.
    198  * @rom:	If non-zero, address of a buffer to be filled by a copy of the
    199  *		local node's configuration ROM
    200  * @bus_reset:	If non-zero, address of a buffer to be filled by a
    201  *		&struct fw_cdev_event_bus_reset with the current state
    202  *		of the bus.  This does not cause a bus reset to happen.
    203  * @bus_reset_closure: Value of &closure in this and subsequent bus reset events
    204  * @card:	The index of the card this device belongs to
    205  */
    206 struct fw_cdev_get_info {
    207 	__u32 version;
    208 	__u32 rom_length;
    209 	__u64 rom;
    210 	__u64 bus_reset;
    211 	__u64 bus_reset_closure;
    212 	__u32 card;
    213 };
    214 
    215 /**
    216  * struct fw_cdev_send_request - Send an asynchronous request packet
    217  * @tcode:	Transaction code of the request
    218  * @length:	Length of outgoing payload, in bytes
    219  * @offset:	48-bit offset at destination node
    220  * @closure:	Passed back to userspace in the response event
    221  * @data:	Userspace pointer to payload
    222  * @generation:	The bus generation where packet is valid
    223  *
    224  * Send a request to the device.  This ioctl implements all outgoing requests.
    225  * Both quadlet and block request specify the payload as a pointer to the data
    226  * in the @data field.  Once the transaction completes, the kernel writes an
    227  * &fw_cdev_event_request event back.  The @closure field is passed back to
    228  * user space in the response event.
    229  */
    230 struct fw_cdev_send_request {
    231 	__u32 tcode;
    232 	__u32 length;
    233 	__u64 offset;
    234 	__u64 closure;
    235 	__u64 data;
    236 	__u32 generation;
    237 };
    238 
    239 /**
    240  * struct fw_cdev_send_response - Send an asynchronous response packet
    241  * @rcode:	Response code as determined by the userspace handler
    242  * @length:	Length of outgoing payload, in bytes
    243  * @data:	Userspace pointer to payload
    244  * @handle:	The handle from the &fw_cdev_event_request
    245  *
    246  * Send a response to an incoming request.  By setting up an address range using
    247  * the %FW_CDEV_IOC_ALLOCATE ioctl, userspace can listen for incoming requests.  An
    248  * incoming request will generate an %FW_CDEV_EVENT_REQUEST, and userspace must
    249  * send a reply using this ioctl.  The event has a handle to the kernel-side
    250  * pending transaction, which should be used with this ioctl.
    251  */
    252 struct fw_cdev_send_response {
    253 	__u32 rcode;
    254 	__u32 length;
    255 	__u64 data;
    256 	__u32 handle;
    257 };
    258 
    259 /**
    260  * struct fw_cdev_allocate - Allocate a CSR address range
    261  * @offset:	Start offset of the address range
    262  * @closure:	To be passed back to userspace in request events
    263  * @length:	Length of the address range, in bytes
    264  * @handle:	Handle to the allocation, written by the kernel
    265  *
    266  * Allocate an address range in the 48-bit address space on the local node
    267  * (the controller).  This allows userspace to listen for requests with an
    268  * offset within that address range.  When the kernel receives a request
    269  * within the range, an &fw_cdev_event_request event will be written back.
    270  * The @closure field is passed back to userspace in the response event.
    271  * The @handle field is an out parameter, returning a handle to the allocated
    272  * range to be used for later deallocation of the range.
    273  */
    274 struct fw_cdev_allocate {
    275 	__u64 offset;
    276 	__u64 closure;
    277 	__u32 length;
    278 	__u32 handle;
    279 };
    280 
    281 /**
    282  * struct fw_cdev_deallocate - Free an address range allocation
    283  * @handle:	Handle to the address range, as returned by the kernel when the
    284  *		range was allocated
    285  */
    286 struct fw_cdev_deallocate {
    287 	__u32 handle;
    288 };
    289 
    290 #define FW_CDEV_LONG_RESET	0
    291 #define FW_CDEV_SHORT_RESET	1
    292 
    293 /**
    294  * struct fw_cdev_initiate_bus_reset - Initiate a bus reset
    295  * @type:	%FW_CDEV_SHORT_RESET or %FW_CDEV_LONG_RESET
    296  *
    297  * Initiate a bus reset for the bus this device is on.  The bus reset can be
    298  * either the original (long) bus reset or the arbitrated (short) bus reset
    299  * introduced in 1394a-2000.
    300  */
    301 struct fw_cdev_initiate_bus_reset {
    302 	__u32 type;	/* FW_CDEV_SHORT_RESET or FW_CDEV_LONG_RESET */
    303 };
    304 
    305 /**
    306  * struct fw_cdev_add_descriptor - Add contents to the local node's config ROM
    307  * @immediate:	If non-zero, immediate key to insert before pointer
    308  * @key:	Upper 8 bits of root directory pointer
    309  * @data:	Userspace pointer to contents of descriptor block
    310  * @length:	Length of descriptor block data, in bytes
    311  * @handle:	Handle to the descriptor, written by the kernel
    312  *
    313  * Add a descriptor block and optionally a preceding immediate key to the local
    314  * node's configuration ROM.
    315  *
    316  * The @key field specifies the upper 8 bits of the descriptor root directory
    317  * pointer and the @data and @length fields specify the contents. The @key
    318  * should be of the form 0xXX000000. The offset part of the root directory entry
    319  * will be filled in by the kernel.
    320  *
    321  * If not 0, the @immediate field specifies an immediate key which will be
    322  * inserted before the root directory pointer.
    323  *
    324  * If successful, the kernel adds the descriptor and writes back a handle to the
    325  * kernel-side object to be used for later removal of the descriptor block and
    326  * immediate key.
    327  */
    328 struct fw_cdev_add_descriptor {
    329 	__u32 immediate;
    330 	__u32 key;
    331 	__u64 data;
    332 	__u32 length;
    333 	__u32 handle;
    334 };
    335 
    336 /**
    337  * struct fw_cdev_remove_descriptor - Remove contents from the configuration ROM
    338  * @handle:	Handle to the descriptor, as returned by the kernel when the
    339  *		descriptor was added
    340  *
    341  * Remove a descriptor block and accompanying immediate key from the local
    342  * node's configuration ROM.
    343  */
    344 struct fw_cdev_remove_descriptor {
    345 	__u32 handle;
    346 };
    347 
    348 #define FW_CDEV_ISO_CONTEXT_TRANSMIT	0
    349 #define FW_CDEV_ISO_CONTEXT_RECEIVE	1
    350 
    351 /**
    352  * struct fw_cdev_create_iso_context - Create a context for isochronous IO
    353  * @type:	%FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE
    354  * @header_size: Header size to strip for receive contexts
    355  * @channel:	Channel to bind to
    356  * @speed:	Speed to transmit at
    357  * @closure:	To be returned in &fw_cdev_event_iso_interrupt
    358  * @handle:	Handle to context, written back by kernel
    359  *
    360  * Prior to sending or receiving isochronous I/O, a context must be created.
    361  * The context records information about the transmit or receive configuration
    362  * and typically maps to an underlying hardware resource.  A context is set up
    363  * for either sending or receiving.  It is bound to a specific isochronous
    364  * channel.
    365  *
    366  * If a context was successfully created, the kernel writes back a handle to the
    367  * context, which must be passed in for subsequent operations on that context.
    368  */
    369 struct fw_cdev_create_iso_context {
    370 	__u32 type;
    371 	__u32 header_size;
    372 	__u32 channel;
    373 	__u32 speed;
    374 	__u64 closure;
    375 	__u32 handle;
    376 };
    377 
    378 #define FW_CDEV_ISO_PAYLOAD_LENGTH(v)	(v)
    379 #define FW_CDEV_ISO_INTERRUPT		(1 << 16)
    380 #define FW_CDEV_ISO_SKIP		(1 << 17)
    381 #define FW_CDEV_ISO_SYNC		(1 << 17)
    382 #define FW_CDEV_ISO_TAG(v)		((v) << 18)
    383 #define FW_CDEV_ISO_SY(v)		((v) << 20)
    384 #define FW_CDEV_ISO_HEADER_LENGTH(v)	((v) << 24)
    385 
    386 /**
    387  * struct fw_cdev_iso_packet - Isochronous packet
    388  * @control:	Contains the header length (8 uppermost bits), the sy field
    389  *		(4 bits), the tag field (2 bits), a sync flag (1 bit),
    390  *		a skip flag (1 bit), an interrupt flag (1 bit), and the
    391  *		payload length (16 lowermost bits)
    392  * @header:	Header and payload
    393  *
    394  * &struct fw_cdev_iso_packet is used to describe isochronous packet queues.
    395  *
    396  * Use the FW_CDEV_ISO_ macros to fill in @control.  The sy and tag fields are
    397  * specified by IEEE 1394a and IEC 61883.
    398  *
    399  * FIXME - finish this documentation
    400  */
    401 struct fw_cdev_iso_packet {
    402 	__u32 control;
    403 	__u32 header[0];
    404 };
    405 
    406 /**
    407  * struct fw_cdev_queue_iso - Queue isochronous packets for I/O
    408  * @packets:	Userspace pointer to packet data
    409  * @data:	Pointer into mmap()'ed payload buffer
    410  * @size:	Size of packet data in bytes
    411  * @handle:	Isochronous context handle
    412  *
    413  * Queue a number of isochronous packets for reception or transmission.
    414  * This ioctl takes a pointer to an array of &fw_cdev_iso_packet structs,
    415  * which describe how to transmit from or receive into a contiguous region
    416  * of a mmap()'ed payload buffer.  As part of the packet descriptors,
    417  * a series of headers can be supplied, which will be prepended to the
    418  * payload during DMA.
    419  *
    420  * The kernel may or may not queue all packets, but will write back updated
    421  * values of the @packets, @data and @size fields, so the ioctl can be
    422  * resubmitted easily.
    423  */
    424 struct fw_cdev_queue_iso {
    425 	__u64 packets;
    426 	__u64 data;
    427 	__u32 size;
    428 	__u32 handle;
    429 };
    430 
    431 #define FW_CDEV_ISO_CONTEXT_MATCH_TAG0		 1
    432 #define FW_CDEV_ISO_CONTEXT_MATCH_TAG1		 2
    433 #define FW_CDEV_ISO_CONTEXT_MATCH_TAG2		 4
    434 #define FW_CDEV_ISO_CONTEXT_MATCH_TAG3		 8
    435 #define FW_CDEV_ISO_CONTEXT_MATCH_ALL_TAGS	15
    436 
    437 /**
    438  * struct fw_cdev_start_iso - Start an isochronous transmission or reception
    439  * @cycle:	Cycle in which to start I/O.  If @cycle is greater than or
    440  *		equal to 0, the I/O will start on that cycle.
    441  * @sync:	Determines the value to wait for for receive packets that have
    442  *		the %FW_CDEV_ISO_SYNC bit set
    443  * @tags:	Tag filter bit mask.  Only valid for isochronous reception.
    444  *		Determines the tag values for which packets will be accepted.
    445  *		Use FW_CDEV_ISO_CONTEXT_MATCH_ macros to set @tags.
    446  * @handle:	Isochronous context handle within which to transmit or receive
    447  */
    448 struct fw_cdev_start_iso {
    449 	__s32 cycle;
    450 	__u32 sync;
    451 	__u32 tags;
    452 	__u32 handle;
    453 };
    454 
    455 /**
    456  * struct fw_cdev_stop_iso - Stop an isochronous transmission or reception
    457  * @handle:	Handle of isochronous context to stop
    458  */
    459 struct fw_cdev_stop_iso {
    460 	__u32 handle;
    461 };
    462 
    463 /**
    464  * struct fw_cdev_get_cycle_timer - read cycle timer register
    465  * @local_time:   system time, in microseconds since the Epoch
    466  * @cycle_timer:  isochronous cycle timer, as per OHCI 1.1 clause 5.13
    467  *
    468  * The %FW_CDEV_IOC_GET_CYCLE_TIMER ioctl reads the isochronous cycle timer
    469  * and also the system clock.  This allows to express the receive time of an
    470  * isochronous packet as a system time with microsecond accuracy.
    471  */
    472 struct fw_cdev_get_cycle_timer {
    473 	__u64 local_time;
    474 	__u32 cycle_timer;
    475 };
    476 
    477 #endif /* _LINUX_FIREWIRE_CDEV_H */
    478