linux/include/linux/firewire.h

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_FIREWIRE_H
#define _LINUX_FIREWIRE_H

#include <linux/completion.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/kernel.h>
#include <linux/kref.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/sysfs.h>
#include <linux/timer.h>
#include <linux/types.h>
#include <linux/workqueue.h>

#include <linux/atomic.h>
#include <asm/byteorder.h>

#define CSR_REGISTER_BASE

/* register offsets are relative to CSR_REGISTER_BASE */
#define CSR_STATE_CLEAR
#define CSR_STATE_SET
#define CSR_NODE_IDS
#define CSR_RESET_START
#define CSR_SPLIT_TIMEOUT_HI
#define CSR_SPLIT_TIMEOUT_LO
#define CSR_CYCLE_TIME
#define CSR_BUS_TIME
#define CSR_BUSY_TIMEOUT
#define CSR_PRIORITY_BUDGET
#define CSR_BUS_MANAGER_ID
#define CSR_BANDWIDTH_AVAILABLE
#define CSR_CHANNELS_AVAILABLE
#define CSR_CHANNELS_AVAILABLE_HI
#define CSR_CHANNELS_AVAILABLE_LO
#define CSR_MAINT_UTILITY
#define CSR_BROADCAST_CHANNEL
#define CSR_CONFIG_ROM
#define CSR_CONFIG_ROM_END
#define CSR_OMPR
#define CSR_OPCR(i)
#define CSR_IMPR
#define CSR_IPCR(i)
#define CSR_FCP_COMMAND
#define CSR_FCP_RESPONSE
#define CSR_FCP_END
#define CSR_TOPOLOGY_MAP
#define CSR_TOPOLOGY_MAP_END
#define CSR_SPEED_MAP
#define CSR_SPEED_MAP_END

#define CSR_OFFSET
#define CSR_LEAF
#define CSR_DIRECTORY

#define CSR_DESCRIPTOR
#define CSR_VENDOR
#define CSR_HARDWARE_VERSION
#define CSR_UNIT
#define CSR_SPECIFIER_ID
#define CSR_VERSION
#define CSR_DEPENDENT_INFO
#define CSR_MODEL
#define CSR_DIRECTORY_ID

struct fw_csr_iterator {};

void fw_csr_iterator_init(struct fw_csr_iterator *ci, const u32 *p);
int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value);
int fw_csr_string(const u32 *directory, int key, char *buf, size_t size);

extern const struct bus_type fw_bus_type;

struct fw_card_driver;
struct fw_node;

struct fw_card {};

static inline struct fw_card *fw_card_get(struct fw_card *card)
{}

void fw_card_release(struct kref *kref);

static inline void fw_card_put(struct fw_card *card)
{}

int fw_card_read_cycle_time(struct fw_card *card, u32 *cycle_time);

struct fw_attribute_group {};

enum fw_device_state {};

/*
 * Note, fw_device.generation always has to be read before fw_device.node_id.
 * Use SMP memory barriers to ensure this.  Otherwise requests will be sent
 * to an outdated node_id if the generation was updated in the meantime due
 * to a bus reset.
 *
 * Likewise, fw-core will take care to update .node_id before .generation so
 * that whenever fw_device.generation is current WRT the actual bus generation,
 * fw_device.node_id is guaranteed to be current too.
 *
 * The same applies to fw_device.card->node_id vs. fw_device.generation.
 *
 * fw_device.config_rom and fw_device.config_rom_length may be accessed during
 * the lifetime of any fw_unit belonging to the fw_device, before device_del()
 * was called on the last fw_unit.  Alternatively, they may be accessed while
 * holding fw_device_rwsem.
 */
struct fw_device {};

#define fw_device(dev)

static inline int fw_device_is_shutdown(struct fw_device *device)
{}

int fw_device_enable_phys_dma(struct fw_device *device);

/*
 * fw_unit.directory must not be accessed after device_del(&fw_unit.device).
 */
struct fw_unit {};

#define fw_unit(dev)

static inline struct fw_unit *fw_unit_get(struct fw_unit *unit)
{}

static inline void fw_unit_put(struct fw_unit *unit)
{}

#define fw_parent_device(unit)

struct ieee1394_device_id;

struct fw_driver {};

struct fw_packet;
struct fw_request;

fw_packet_callback_t;
fw_transaction_callback_t;
fw_transaction_callback_with_tstamp_t;

fw_transaction_callback;

/*
 * This callback handles an inbound request subaction.  It is called in
 * RCU read-side context, therefore must not sleep.
 *
 * The callback should not initiate outbound request subactions directly.
 * Otherwise there is a danger of recursion of inbound and outbound
 * transactions from and to the local node.
 *
 * The callback is responsible that fw_send_response() is called on the @request, except for FCP
 * registers for which the core takes care of that.
 */
fw_address_callback_t;

struct fw_packet {};

struct fw_transaction {};

struct fw_address_handler {};

struct fw_address_region {};

extern const struct fw_address_region fw_high_memory_region;

int fw_core_add_address_handler(struct fw_address_handler *handler,
				const struct fw_address_region *region);
void fw_core_remove_address_handler(struct fw_address_handler *handler);
void fw_send_response(struct fw_card *card,
		      struct fw_request *request, int rcode);
int fw_get_request_speed(struct fw_request *request);
u32 fw_request_get_timestamp(const struct fw_request *request);

void __fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
		int destination_id, int generation, int speed, unsigned long long offset,
		void *payload, size_t length, union fw_transaction_callback callback,
		bool with_tstamp, void *callback_data);

/**
 * fw_send_request() - submit a request packet for transmission to generate callback for response
 *		       subaction without time stamp.
 * @card:		interface to send the request at
 * @t:			transaction instance to which the request belongs
 * @tcode:		transaction code
 * @destination_id:	destination node ID, consisting of bus_ID and phy_ID
 * @generation:		bus generation in which request and response are valid
 * @speed:		transmission speed
 * @offset:		48bit wide offset into destination's address space
 * @payload:		data payload for the request subaction
 * @length:		length of the payload, in bytes
 * @callback:		function to be called when the transaction is completed
 * @callback_data:	data to be passed to the transaction completion callback
 *
 * A variation of __fw_send_request() to generate callback for response subaction without time
 * stamp.
 */
static inline void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
				   int destination_id, int generation, int speed,
				   unsigned long long offset, void *payload, size_t length,
				   fw_transaction_callback_t callback, void *callback_data)
{}

/**
 * fw_send_request_with_tstamp() - submit a request packet for transmission to generate callback for
 *				   response with time stamp.
 * @card:		interface to send the request at
 * @t:			transaction instance to which the request belongs
 * @tcode:		transaction code
 * @destination_id:	destination node ID, consisting of bus_ID and phy_ID
 * @generation:		bus generation in which request and response are valid
 * @speed:		transmission speed
 * @offset:		48bit wide offset into destination's address space
 * @payload:		data payload for the request subaction
 * @length:		length of the payload, in bytes
 * @callback:		function to be called when the transaction is completed
 * @callback_data:	data to be passed to the transaction completion callback
 *
 * A variation of __fw_send_request() to generate callback for response subaction with time stamp.
 */
static inline void fw_send_request_with_tstamp(struct fw_card *card, struct fw_transaction *t,
	int tcode, int destination_id, int generation, int speed, unsigned long long offset,
	void *payload, size_t length, fw_transaction_callback_with_tstamp_t callback,
	void *callback_data)
{}

int fw_cancel_transaction(struct fw_card *card,
			  struct fw_transaction *transaction);
int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
		       int generation, int speed, unsigned long long offset,
		       void *payload, size_t length);
const char *fw_rcode_string(int rcode);

static inline int fw_stream_packet_destination_id(int tag, int channel, int sy)
{}

void fw_schedule_bus_reset(struct fw_card *card, bool delayed,
			   bool short_reset);

struct fw_descriptor {};

int fw_core_add_descriptor(struct fw_descriptor *desc);
void fw_core_remove_descriptor(struct fw_descriptor *desc);

/*
 * The iso packet format allows for an immediate header/payload part
 * stored in 'header' immediately after the packet info plus an
 * indirect payload part that is pointer to by the 'payload' field.
 * Applications can use one or the other or both to implement simple
 * low-bandwidth streaming (e.g. audio) or more advanced
 * scatter-gather streaming (e.g. assembling video frame automatically).
 */
struct fw_iso_packet {};

#define FW_ISO_CONTEXT_TRANSMIT
#define FW_ISO_CONTEXT_RECEIVE
#define FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL

#define FW_ISO_CONTEXT_MATCH_TAG0
#define FW_ISO_CONTEXT_MATCH_TAG1
#define FW_ISO_CONTEXT_MATCH_TAG2
#define FW_ISO_CONTEXT_MATCH_TAG3
#define FW_ISO_CONTEXT_MATCH_ALL_TAGS

/*
 * An iso buffer is just a set of pages mapped for DMA in the
 * specified direction.  Since the pages are to be used for DMA, they
 * are not mapped into the kernel virtual address space.  We store the
 * DMA address in the page private. The helper function
 * fw_iso_buffer_map() will map the pages into a given vma.
 */
struct fw_iso_buffer {};

int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
		       int page_count, enum dma_data_direction direction);
void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
size_t fw_iso_buffer_lookup(struct fw_iso_buffer *buffer, dma_addr_t completed);

struct fw_iso_context;
fw_iso_callback_t;
fw_iso_mc_callback_t;

fw_iso_callback;

struct fw_iso_context {};

struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
		int type, int channel, int speed, size_t header_size,
		fw_iso_callback_t callback, void *callback_data);
int fw_iso_context_set_channels(struct fw_iso_context *ctx, u64 *channels);
int fw_iso_context_queue(struct fw_iso_context *ctx,
			 struct fw_iso_packet *packet,
			 struct fw_iso_buffer *buffer,
			 unsigned long payload);
void fw_iso_context_queue_flush(struct fw_iso_context *ctx);
int fw_iso_context_flush_completions(struct fw_iso_context *ctx);

/**
 * fw_iso_context_schedule_flush_completions() - schedule work item to process isochronous context.
 * @ctx: the isochronous context
 *
 * Schedule a work item on workqueue to process the isochronous context. The registered callback
 * function is called by the worker when a queued packet buffer with the interrupt flag is
 * completed, either after transmission in the IT context or after being filled in the IR context.
 * The callback function is also called when the header buffer in the context becomes full, If it
 * is required to process the context in the current context, fw_iso_context_flush_completions() is
 * available instead.
 *
 * Context: Any context.
 */
static inline void fw_iso_context_schedule_flush_completions(struct fw_iso_context *ctx)
{}

int fw_iso_context_start(struct fw_iso_context *ctx,
			 int cycle, int sync, int tags);
int fw_iso_context_stop(struct fw_iso_context *ctx);
void fw_iso_context_destroy(struct fw_iso_context *ctx);
void fw_iso_resource_manage(struct fw_card *card, int generation,
			    u64 channels_mask, int *channel, int *bandwidth,
			    bool allocate);

extern struct workqueue_struct *fw_workqueue;

#endif /* _LINUX_FIREWIRE_H */