linux/include/linux/firewire.h
<<
>>
Prefs
   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
  69struct fw_csr_iterator {
  70        const u32 *p;
  71        const u32 *end;
  72};
  73
  74void fw_csr_iterator_init(struct fw_csr_iterator *ci, const u32 *p);
  75int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value);
  76int fw_csr_string(const u32 *directory, int key, char *buf, size_t size);
  77
  78extern struct bus_type fw_bus_type;
  79
  80struct fw_card_driver;
  81struct fw_node;
  82
  83struct 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
 139static inline struct fw_card *fw_card_get(struct fw_card *card)
 140{
 141        kref_get(&card->kref);
 142
 143        return card;
 144}
 145
 146void fw_card_release(struct kref *kref);
 147
 148static inline void fw_card_put(struct fw_card *card)
 149{
 150        kref_put(&card->kref, fw_card_release);
 151}
 152
 153struct fw_attribute_group {
 154        struct attribute_group *groups[2];
 155        struct attribute_group group;
 156        struct attribute *attrs[13];
 157};
 158
 159enum 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 */
 183struct 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
 209static inline struct fw_device *fw_device(struct device *dev)
 210{
 211        return container_of(dev, struct fw_device, device);
 212}
 213
 214static inline int fw_device_is_shutdown(struct fw_device *device)
 215{
 216        return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN;
 217}
 218
 219int 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 */
 224struct fw_unit {
 225        struct device device;
 226        const u32 *directory;
 227        struct fw_attribute_group attribute_group;
 228};
 229
 230static inline struct fw_unit *fw_unit(struct device *dev)
 231{
 232        return container_of(dev, struct fw_unit, device);
 233}
 234
 235static inline struct fw_unit *fw_unit_get(struct fw_unit *unit)
 236{
 237        get_device(&unit->device);
 238
 239        return unit;
 240}
 241
 242static inline void fw_unit_put(struct fw_unit *unit)
 243{
 244        put_device(&unit->device);
 245}
 246
 247static inline struct fw_device *fw_parent_device(struct fw_unit *unit)
 248{
 249        return fw_device(unit->device.parent);
 250}
 251
 252struct ieee1394_device_id;
 253
 254struct 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
 263struct fw_packet;
 264struct fw_request;
 265
 266typedef void (*fw_packet_callback_t)(struct fw_packet *packet,
 267                                     struct fw_card *card, int status);
 268typedef 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 */
 283typedef 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
 291struct 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
 316struct 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
 334struct 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
 342struct fw_address_region {
 343        u64 start;
 344        u64 end;
 345};
 346
 347extern const struct fw_address_region fw_high_memory_region;
 348
 349int fw_core_add_address_handler(struct fw_address_handler *handler,
 350                                const struct fw_address_region *region);
 351void fw_core_remove_address_handler(struct fw_address_handler *handler);
 352void fw_send_response(struct fw_card *card,
 353                      struct fw_request *request, int rcode);
 354int fw_get_request_speed(struct fw_request *request);
 355void 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);
 359int fw_cancel_transaction(struct fw_card *card,
 360                          struct fw_transaction *transaction);
 361int 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);
 364const char *fw_rcode_string(int rcode);
 365
 366static inline int fw_stream_packet_destination_id(int tag, int channel, int sy)
 367{
 368        return tag << 14 | channel << 8 | sy;
 369}
 370
 371void fw_schedule_bus_reset(struct fw_card *card, bool delayed,
 372                           bool short_reset);
 373
 374struct fw_descriptor {
 375        struct list_head link;
 376        size_t length;
 377        u32 immediate;
 378        u32 key;
 379        const u32 *data;
 380};
 381
 382int fw_core_add_descriptor(struct fw_descriptor *desc);
 383void 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 */
 393struct 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 */
 421struct fw_iso_buffer {
 422        enum dma_data_direction direction;
 423        struct page **pages;
 424        int page_count;
 425        int page_count_mapped;
 426};
 427
 428int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
 429                       int page_count, enum dma_data_direction direction);
 430void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
 431size_t fw_iso_buffer_lookup(struct fw_iso_buffer *buffer, dma_addr_t completed);
 432
 433struct fw_iso_context;
 434typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
 435                                  u32 cycle, size_t header_length,
 436                                  void *header, void *data);
 437typedef void (*fw_iso_mc_callback_t)(struct fw_iso_context *context,
 438                                     dma_addr_t completed, void *data);
 439struct 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
 453struct 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);
 456int fw_iso_context_set_channels(struct fw_iso_context *ctx, u64 *channels);
 457int 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);
 461void fw_iso_context_queue_flush(struct fw_iso_context *ctx);
 462int fw_iso_context_flush_completions(struct fw_iso_context *ctx);
 463int fw_iso_context_start(struct fw_iso_context *ctx,
 464                         int cycle, int sync, int tags);
 465int fw_iso_context_stop(struct fw_iso_context *ctx);
 466void fw_iso_context_destroy(struct fw_iso_context *ctx);
 467void fw_iso_resource_manage(struct fw_card *card, int generation,
 468                            u64 channels_mask, int *channel, int *bandwidth,
 469                            bool allocate);
 470
 471extern struct workqueue_struct *fw_workqueue;
 472
 473#endif /* _LINUX_FIREWIRE_H */
 474