root/include/linux/firewire.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. fw_card_get
  2. fw_card_put
  3. fw_device_is_shutdown
  4. fw_unit_get
  5. fw_unit_put
  6. fw_parent_device
  7. fw_stream_packet_destination_id

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef _LINUX_FIREWIRE_H
   3 #define _LINUX_FIREWIRE_H
   4 
   5 #include <linux/completion.h>
   6 #include <linux/device.h>
   7 #include <linux/dma-mapping.h>
   8 #include <linux/kernel.h>
   9 #include <linux/kref.h>
  10 #include <linux/list.h>
  11 #include <linux/mutex.h>
  12 #include <linux/spinlock.h>
  13 #include <linux/sysfs.h>
  14 #include <linux/timer.h>
  15 #include <linux/types.h>
  16 #include <linux/workqueue.h>
  17 
  18 #include <linux/atomic.h>
  19 #include <asm/byteorder.h>
  20 
  21 #define CSR_REGISTER_BASE               0xfffff0000000ULL
  22 
  23 /* register offsets are relative to CSR_REGISTER_BASE */
  24 #define CSR_STATE_CLEAR                 0x0
  25 #define CSR_STATE_SET                   0x4
  26 #define CSR_NODE_IDS                    0x8
  27 #define CSR_RESET_START                 0xc
  28 #define CSR_SPLIT_TIMEOUT_HI            0x18
  29 #define CSR_SPLIT_TIMEOUT_LO            0x1c
  30 #define CSR_CYCLE_TIME                  0x200
  31 #define CSR_BUS_TIME                    0x204
  32 #define CSR_BUSY_TIMEOUT                0x210
  33 #define CSR_PRIORITY_BUDGET             0x218
  34 #define CSR_BUS_MANAGER_ID              0x21c
  35 #define CSR_BANDWIDTH_AVAILABLE         0x220
  36 #define CSR_CHANNELS_AVAILABLE          0x224
  37 #define CSR_CHANNELS_AVAILABLE_HI       0x224
  38 #define CSR_CHANNELS_AVAILABLE_LO       0x228
  39 #define CSR_MAINT_UTILITY               0x230
  40 #define CSR_BROADCAST_CHANNEL           0x234
  41 #define CSR_CONFIG_ROM                  0x400
  42 #define CSR_CONFIG_ROM_END              0x800
  43 #define CSR_OMPR                        0x900
  44 #define CSR_OPCR(i)                     (0x904 + (i) * 4)
  45 #define CSR_IMPR                        0x980
  46 #define CSR_IPCR(i)                     (0x984 + (i) * 4)
  47 #define CSR_FCP_COMMAND                 0xB00
  48 #define CSR_FCP_RESPONSE                0xD00
  49 #define CSR_FCP_END                     0xF00
  50 #define CSR_TOPOLOGY_MAP                0x1000
  51 #define CSR_TOPOLOGY_MAP_END            0x1400
  52 #define CSR_SPEED_MAP                   0x2000
  53 #define CSR_SPEED_MAP_END               0x3000
  54 
  55 #define CSR_OFFSET              0x40
  56 #define CSR_LEAF                0x80
  57 #define CSR_DIRECTORY           0xc0
  58 
  59 #define CSR_DESCRIPTOR          0x01
  60 #define CSR_VENDOR              0x03
  61 #define CSR_HARDWARE_VERSION    0x04
  62 #define CSR_UNIT                0x11
  63 #define CSR_SPECIFIER_ID        0x12
  64 #define CSR_VERSION             0x13
  65 #define CSR_DEPENDENT_INFO      0x14
  66 #define CSR_MODEL               0x17
  67 #define CSR_DIRECTORY_ID        0x20
  68 
  69 struct fw_csr_iterator {
  70         const u32 *p;
  71         const u32 *end;
  72 };
  73 
  74 void fw_csr_iterator_init(struct fw_csr_iterator *ci, const u32 *p);
  75 int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value);
  76 int fw_csr_string(const u32 *directory, int key, char *buf, size_t size);
  77 
  78 extern struct bus_type fw_bus_type;
  79 
  80 struct fw_card_driver;
  81 struct fw_node;
  82 
  83 struct fw_card {
  84         const struct fw_card_driver *driver;
  85         struct device *device;
  86         struct kref kref;
  87         struct completion done;
  88 
  89         int node_id;
  90         int generation;
  91         int current_tlabel;
  92         u64 tlabel_mask;
  93         struct list_head transaction_list;
  94         u64 reset_jiffies;
  95 
  96         u32 split_timeout_hi;
  97         u32 split_timeout_lo;
  98         unsigned int split_timeout_cycles;
  99         unsigned int split_timeout_jiffies;
 100 
 101         unsigned long long guid;
 102         unsigned max_receive;
 103         int link_speed;
 104         int config_rom_generation;
 105 
 106         spinlock_t lock; /* Take this lock when handling the lists in
 107                           * this struct. */
 108         struct fw_node *local_node;
 109         struct fw_node *root_node;
 110         struct fw_node *irm_node;
 111         u8 color; /* must be u8 to match the definition in struct fw_node */
 112         int gap_count;
 113         bool beta_repeaters_present;
 114 
 115         int index;
 116         struct list_head link;
 117 
 118         struct list_head phy_receiver_list;
 119 
 120         struct delayed_work br_work; /* bus reset job */
 121         bool br_short;
 122 
 123         struct delayed_work bm_work; /* bus manager job */
 124         int bm_retries;
 125         int bm_generation;
 126         int bm_node_id;
 127         bool bm_abdicate;
 128 
 129         bool priority_budget_implemented;       /* controller feature */
 130         bool broadcast_channel_auto_allocated;  /* controller feature */
 131 
 132         bool broadcast_channel_allocated;
 133         u32 broadcast_channel;
 134         __be32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4];
 135 
 136         __be32 maint_utility_register;
 137 };
 138 
 139 static inline struct fw_card *fw_card_get(struct fw_card *card)
 140 {
 141         kref_get(&card->kref);
 142 
 143         return card;
 144 }
 145 
 146 void fw_card_release(struct kref *kref);
 147 
 148 static inline void fw_card_put(struct fw_card *card)
 149 {
 150         kref_put(&card->kref, fw_card_release);
 151 }
 152 
 153 struct fw_attribute_group {
 154         struct attribute_group *groups[2];
 155         struct attribute_group group;
 156         struct attribute *attrs[13];
 157 };
 158 
 159 enum fw_device_state {
 160         FW_DEVICE_INITIALIZING,
 161         FW_DEVICE_RUNNING,
 162         FW_DEVICE_GONE,
 163         FW_DEVICE_SHUTDOWN,
 164 };
 165 
 166 /*
 167  * Note, fw_device.generation always has to be read before fw_device.node_id.
 168  * Use SMP memory barriers to ensure this.  Otherwise requests will be sent
 169  * to an outdated node_id if the generation was updated in the meantime due
 170  * to a bus reset.
 171  *
 172  * Likewise, fw-core will take care to update .node_id before .generation so
 173  * that whenever fw_device.generation is current WRT the actual bus generation,
 174  * fw_device.node_id is guaranteed to be current too.
 175  *
 176  * The same applies to fw_device.card->node_id vs. fw_device.generation.
 177  *
 178  * fw_device.config_rom and fw_device.config_rom_length may be accessed during
 179  * the lifetime of any fw_unit belonging to the fw_device, before device_del()
 180  * was called on the last fw_unit.  Alternatively, they may be accessed while
 181  * holding fw_device_rwsem.
 182  */
 183 struct fw_device {
 184         atomic_t state;
 185         struct fw_node *node;
 186         int node_id;
 187         int generation;
 188         unsigned max_speed;
 189         struct fw_card *card;
 190         struct device device;
 191 
 192         struct mutex client_list_mutex;
 193         struct list_head client_list;
 194 
 195         const u32 *config_rom;
 196         size_t config_rom_length;
 197         int config_rom_retries;
 198         unsigned is_local:1;
 199         unsigned max_rec:4;
 200         unsigned cmc:1;
 201         unsigned irmc:1;
 202         unsigned bc_implemented:2;
 203 
 204         work_func_t workfn;
 205         struct delayed_work work;
 206         struct fw_attribute_group attribute_group;
 207 };
 208 
 209 static inline struct fw_device *fw_device(struct device *dev)
 210 {
 211         return container_of(dev, struct fw_device, device);
 212 }
 213 
 214 static inline int fw_device_is_shutdown(struct fw_device *device)
 215 {
 216         return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN;
 217 }
 218 
 219 int fw_device_enable_phys_dma(struct fw_device *device);
 220 
 221 /*
 222  * fw_unit.directory must not be accessed after device_del(&fw_unit.device).
 223  */
 224 struct fw_unit {
 225         struct device device;
 226         const u32 *directory;
 227         struct fw_attribute_group attribute_group;
 228 };
 229 
 230 static inline struct fw_unit *fw_unit(struct device *dev)
 231 {
 232         return container_of(dev, struct fw_unit, device);
 233 }
 234 
 235 static inline struct fw_unit *fw_unit_get(struct fw_unit *unit)
 236 {
 237         get_device(&unit->device);
 238 
 239         return unit;
 240 }
 241 
 242 static inline void fw_unit_put(struct fw_unit *unit)
 243 {
 244         put_device(&unit->device);
 245 }
 246 
 247 static inline struct fw_device *fw_parent_device(struct fw_unit *unit)
 248 {
 249         return fw_device(unit->device.parent);
 250 }
 251 
 252 struct ieee1394_device_id;
 253 
 254 struct fw_driver {
 255         struct device_driver driver;
 256         int (*probe)(struct fw_unit *unit, const struct ieee1394_device_id *id);
 257         /* Called when the parent device sits through a bus reset. */
 258         void (*update)(struct fw_unit *unit);
 259         void (*remove)(struct fw_unit *unit);
 260         const struct ieee1394_device_id *id_table;
 261 };
 262 
 263 struct fw_packet;
 264 struct fw_request;
 265 
 266 typedef void (*fw_packet_callback_t)(struct fw_packet *packet,
 267                                      struct fw_card *card, int status);
 268 typedef void (*fw_transaction_callback_t)(struct fw_card *card, int rcode,
 269                                           void *data, size_t length,
 270                                           void *callback_data);
 271 /*
 272  * This callback handles an inbound request subaction.  It is called in
 273  * RCU read-side context, therefore must not sleep.
 274  *
 275  * The callback should not initiate outbound request subactions directly.
 276  * Otherwise there is a danger of recursion of inbound and outbound
 277  * transactions from and to the local node.
 278  *
 279  * The callback is responsible that either fw_send_response() or kfree()
 280  * is called on the @request, except for FCP registers for which the core
 281  * takes care of that.
 282  */
 283 typedef void (*fw_address_callback_t)(struct fw_card *card,
 284                                       struct fw_request *request,
 285                                       int tcode, int destination, int source,
 286                                       int generation,
 287                                       unsigned long long offset,
 288                                       void *data, size_t length,
 289                                       void *callback_data);
 290 
 291 struct fw_packet {
 292         int speed;
 293         int generation;
 294         u32 header[4];
 295         size_t header_length;
 296         void *payload;
 297         size_t payload_length;
 298         dma_addr_t payload_bus;
 299         bool payload_mapped;
 300         u32 timestamp;
 301 
 302         /*
 303          * This callback is called when the packet transmission has completed.
 304          * For successful transmission, the status code is the ack received
 305          * from the destination.  Otherwise it is one of the juju-specific
 306          * rcodes:  RCODE_SEND_ERROR, _CANCELLED, _BUSY, _GENERATION, _NO_ACK.
 307          * The callback can be called from tasklet context and thus
 308          * must never block.
 309          */
 310         fw_packet_callback_t callback;
 311         int ack;
 312         struct list_head link;
 313         void *driver_data;
 314 };
 315 
 316 struct fw_transaction {
 317         int node_id; /* The generation is implied; it is always the current. */
 318         int tlabel;
 319         struct list_head link;
 320         struct fw_card *card;
 321         bool is_split_transaction;
 322         struct timer_list split_timeout_timer;
 323 
 324         struct fw_packet packet;
 325 
 326         /*
 327          * The data passed to the callback is valid only during the
 328          * callback.
 329          */
 330         fw_transaction_callback_t callback;
 331         void *callback_data;
 332 };
 333 
 334 struct fw_address_handler {
 335         u64 offset;
 336         u64 length;
 337         fw_address_callback_t address_callback;
 338         void *callback_data;
 339         struct list_head link;
 340 };
 341 
 342 struct fw_address_region {
 343         u64 start;
 344         u64 end;
 345 };
 346 
 347 extern const struct fw_address_region fw_high_memory_region;
 348 
 349 int fw_core_add_address_handler(struct fw_address_handler *handler,
 350                                 const struct fw_address_region *region);
 351 void fw_core_remove_address_handler(struct fw_address_handler *handler);
 352 void fw_send_response(struct fw_card *card,
 353                       struct fw_request *request, int rcode);
 354 int fw_get_request_speed(struct fw_request *request);
 355 void fw_send_request(struct fw_card *card, struct fw_transaction *t,
 356                      int tcode, int destination_id, int generation, int speed,
 357                      unsigned long long offset, void *payload, size_t length,
 358                      fw_transaction_callback_t callback, void *callback_data);
 359 int fw_cancel_transaction(struct fw_card *card,
 360                           struct fw_transaction *transaction);
 361 int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
 362                        int generation, int speed, unsigned long long offset,
 363                        void *payload, size_t length);
 364 const char *fw_rcode_string(int rcode);
 365 
 366 static inline int fw_stream_packet_destination_id(int tag, int channel, int sy)
 367 {
 368         return tag << 14 | channel << 8 | sy;
 369 }
 370 
 371 void fw_schedule_bus_reset(struct fw_card *card, bool delayed,
 372                            bool short_reset);
 373 
 374 struct fw_descriptor {
 375         struct list_head link;
 376         size_t length;
 377         u32 immediate;
 378         u32 key;
 379         const u32 *data;
 380 };
 381 
 382 int fw_core_add_descriptor(struct fw_descriptor *desc);
 383 void fw_core_remove_descriptor(struct fw_descriptor *desc);
 384 
 385 /*
 386  * The iso packet format allows for an immediate header/payload part
 387  * stored in 'header' immediately after the packet info plus an
 388  * indirect payload part that is pointer to by the 'payload' field.
 389  * Applications can use one or the other or both to implement simple
 390  * low-bandwidth streaming (e.g. audio) or more advanced
 391  * scatter-gather streaming (e.g. assembling video frame automatically).
 392  */
 393 struct fw_iso_packet {
 394         u16 payload_length;     /* Length of indirect payload           */
 395         u32 interrupt:1;        /* Generate interrupt on this packet    */
 396         u32 skip:1;             /* tx: Set to not send packet at all    */
 397                                 /* rx: Sync bit, wait for matching sy   */
 398         u32 tag:2;              /* tx: Tag in packet header             */
 399         u32 sy:4;               /* tx: Sy in packet header              */
 400         u32 header_length:8;    /* Length of immediate header           */
 401         u32 header[0];          /* tx: Top of 1394 isoch. data_block    */
 402 };
 403 
 404 #define FW_ISO_CONTEXT_TRANSMIT                 0
 405 #define FW_ISO_CONTEXT_RECEIVE                  1
 406 #define FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL     2
 407 
 408 #define FW_ISO_CONTEXT_MATCH_TAG0        1
 409 #define FW_ISO_CONTEXT_MATCH_TAG1        2
 410 #define FW_ISO_CONTEXT_MATCH_TAG2        4
 411 #define FW_ISO_CONTEXT_MATCH_TAG3        8
 412 #define FW_ISO_CONTEXT_MATCH_ALL_TAGS   15
 413 
 414 /*
 415  * An iso buffer is just a set of pages mapped for DMA in the
 416  * specified direction.  Since the pages are to be used for DMA, they
 417  * are not mapped into the kernel virtual address space.  We store the
 418  * DMA address in the page private. The helper function
 419  * fw_iso_buffer_map() will map the pages into a given vma.
 420  */
 421 struct fw_iso_buffer {
 422         enum dma_data_direction direction;
 423         struct page **pages;
 424         int page_count;
 425         int page_count_mapped;
 426 };
 427 
 428 int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
 429                        int page_count, enum dma_data_direction direction);
 430 void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
 431 size_t fw_iso_buffer_lookup(struct fw_iso_buffer *buffer, dma_addr_t completed);
 432 
 433 struct fw_iso_context;
 434 typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
 435                                   u32 cycle, size_t header_length,
 436                                   void *header, void *data);
 437 typedef void (*fw_iso_mc_callback_t)(struct fw_iso_context *context,
 438                                      dma_addr_t completed, void *data);
 439 struct fw_iso_context {
 440         struct fw_card *card;
 441         int type;
 442         int channel;
 443         int speed;
 444         bool drop_overflow_headers;
 445         size_t header_size;
 446         union {
 447                 fw_iso_callback_t sc;
 448                 fw_iso_mc_callback_t mc;
 449         } callback;
 450         void *callback_data;
 451 };
 452 
 453 struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
 454                 int type, int channel, int speed, size_t header_size,
 455                 fw_iso_callback_t callback, void *callback_data);
 456 int fw_iso_context_set_channels(struct fw_iso_context *ctx, u64 *channels);
 457 int fw_iso_context_queue(struct fw_iso_context *ctx,
 458                          struct fw_iso_packet *packet,
 459                          struct fw_iso_buffer *buffer,
 460                          unsigned long payload);
 461 void fw_iso_context_queue_flush(struct fw_iso_context *ctx);
 462 int fw_iso_context_flush_completions(struct fw_iso_context *ctx);
 463 int fw_iso_context_start(struct fw_iso_context *ctx,
 464                          int cycle, int sync, int tags);
 465 int fw_iso_context_stop(struct fw_iso_context *ctx);
 466 void fw_iso_context_destroy(struct fw_iso_context *ctx);
 467 void fw_iso_resource_manage(struct fw_card *card, int generation,
 468                             u64 channels_mask, int *channel, int *bandwidth,
 469                             bool allocate);
 470 
 471 extern struct workqueue_struct *fw_workqueue;
 472 
 473 #endif /* _LINUX_FIREWIRE_H */

/* [<][>][^][v][top][bottom][index][help] */