#ifndef _SYS_1394_TARGETS_AV1394_ISOCH_H
#define _SYS_1394_TARGETS_AV1394_ISOCH_H
#include <sys/note.h>
#ifdef __cplusplus
extern "C" {
#endif
#define COOKIES 100
typedef struct av1394_isoch_seg_s {
caddr_t is_kaddr;
int is_size;
ddi_umem_cookie_t is_umem_cookie;
size_t is_umem_size;
ddi_dma_handle_t is_dma_hdl;
ddi_dma_cookie_t is_dma_cookie[COOKIES];
uint_t is_dma_ncookies;
} av1394_isoch_seg_t;
typedef struct av1394_isoch_pool_s {
av1394_isoch_seg_t *ip_seg;
int ip_nsegs;
int ip_alloc_size;
int ip_size;
int ip_umem_size;
} av1394_isoch_pool_t;
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_isoch_seg_s))
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_isoch_pool_s))
typedef struct av1394_ir_ixl_data_s {
ixl1394_label_t rd_label;
ixl1394_callback_t rd_cb;
ixl1394_jump_t rd_jump;
} av1394_ir_ixl_data_t;
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_ir_ixl_data_s))
typedef struct av1394_ir_s {
av1394_isoch_pool_t ir_data_pool;
ixl1394_command_t *ir_ixlp;
av1394_ir_ixl_data_t *ir_ixl_data;
ixl1394_xfer_buf_t *ir_ixl_buf;
int ir_ixl_nbufs;
size_t ir_ixl_bpf;
size_t ir_ixl_bufsz;
size_t ir_ixl_tailsz;
int ir_nfull;
int ir_first_full;
int ir_nempty;
int ir_last_empty;
int ir_hiwat;
int ir_lowat;
int ir_overflow_idx;
int ir_read_idx;
int ir_read_cnt;
off_t ir_read_off;
} av1394_ir_t;
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_ir_s::{
ir_ixlp
ir_ixl_buf
ir_ixl_nbufs
ir_ixl_bpf
ir_ixl_bufsz
ir_ixl_tailsz
}))
enum { AV1394_IT_IXL_BEGIN_NPOST = 3 };
typedef struct av1394_it_ixl_begin_s {
ixl1394_label_t be_label;
ixl1394_xfer_pkt_t be_empty_pre;
ixl1394_store_timestamp_t be_store_ts;
ixl1394_callback_t be_cb;
ixl1394_xfer_pkt_t be_empty_post[AV1394_IT_IXL_BEGIN_NPOST];
ixl1394_jump_t be_jump;
} av1394_it_ixl_begin_t;
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_it_ixl_begin_s))
typedef struct av1394_it_ixl_common_s {
struct av1394_it_ixl_common_s *tc_next;
int tc_size;
} av1394_it_ixl_common_t;
typedef struct av1394_it_ixl_buf_s {
av1394_it_ixl_common_t tb_common;
int tb_flags;
int tb_framenum;
struct av1394_ic_s *tb_icp;
ixl1394_label_t tb_label;
ixl1394_xfer_buf_t tb_buf;
ixl1394_store_timestamp_t tb_store_ts;
ixl1394_callback_t tb_cb;
ixl1394_jump_t tb_jump;
} av1394_it_ixl_buf_t;
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_it_ixl_buf_s))
enum {
AV1394_IT_IXL_BUF_NEXT_EMPTY = 0x01,
AV1394_IT_IXL_BUF_SOF = 0x02,
AV1394_IT_IXL_BUF_EOF = 0x04
};
typedef struct av1394_it_ixl_empty_cip_s {
av1394_it_ixl_common_t te_common;
ixl1394_label_t te_label;
ixl1394_xfer_pkt_t te_pkt;
ixl1394_jump_t te_jump;
} av1394_it_ixl_empty_cip_t;
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_it_ixl_empty_cip_s))
typedef struct av1394_it_frame_info_s {
caddr_t fi_ts_off;
int fi_ncycs;
av1394_it_ixl_buf_t *fi_first_buf;
av1394_it_ixl_buf_t *fi_last_buf;
} av1394_it_frame_info_t;
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_it_frame_info_s))
typedef union av1394_it_ts {
uint16_t ts_syt;
} av1394_it_ts_t;
typedef struct av1394_it_s {
av1394_isoch_pool_t it_data_pool;
ixl1394_command_t *it_ixlp;
av1394_it_ixl_begin_t it_ixl_begin;
av1394_it_ixl_common_t *it_ixl_data;
av1394_it_frame_info_t *it_frame_info;
av1394_it_ixl_empty_cip_t *it_skipped_cip;
int it_first_empty;
int it_nempty;
int it_last_full;
int it_nfull;
int it_hiwat;
int it_lowat;
int it_start_thre;
av1394_it_ts_t it_ts_init;
int it_underrun_idx;
ixl1394_command_t *it_saved_label;
int it_write_idx;
int it_write_cnt;
off_t it_write_off;
} av1394_it_t;
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_it_s::{
it_ixlp
it_ixl_begin
it_ixl_data
it_frame_info
it_ts_init
it_skipped_cip
}))
typedef struct av1394_ic_param_s {
int cp_bus_speed;
int cp_dbs;
int cp_fn;
int cp_n;
int cp_d;
int cp_ts_mode;
} av1394_ic_param_t;
typedef enum {
AV1394_IC_IDLE,
AV1394_IC_STARTED,
AV1394_IC_DMA,
AV1394_IC_SUSPENDED
} av1394_ic_state_t;
typedef struct av1394_ic_s {
kmutex_t ic_mutex;
struct av1394_inst_s *ic_avp;
int ic_num;
int ic_dir;
av1394_ic_state_t ic_state;
int ic_pktsz;
int ic_npkts;
size_t ic_framesz;
int ic_nframes;
av1394_ic_param_t ic_param;
size_t ic_mmap_sz;
off_t ic_mmap_off;
t1394_isoch_single_handle_t ic_sii_hdl;
t1394_isoch_dma_handle_t ic_isoch_hdl;
kcondvar_t ic_xfer_cv;
int ic_preq;
av1394_ir_t ic_ir;
av1394_it_t ic_it;
} av1394_ic_t;
_NOTE(MUTEX_PROTECTS_DATA(av1394_ic_s::ic_mutex, av1394_ic_s))
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_ic_s::{
ic_avp
ic_num
ic_dir
ic_sii_hdl
ic_isoch_hdl
ic_pktsz
ic_npkts
ic_framesz
ic_nframes
ic_param
ic_mmap_sz
ic_mmap_off
}))
enum {
AV1394_IR,
AV1394_IT
};
enum {
AV1394_CIP_FULL,
AV1394_CIP_EMPTY
};
enum {
AV1394_IC_FRAME_SIZE_MAX = 1024 * 1024,
AV1394_MEM_MAX_PERCENT = (100/10),
AV1394_SEGSZ_MAX_SHIFT = 16,
AV1394_SEGSZ_MAX = (1UL << AV1394_SEGSZ_MAX_SHIFT),
AV1394_SEGSZ_MAX_OFFSET = AV1394_SEGSZ_MAX - 1,
AV1394_IXL_BUFSZ_MAX = 57344,
AV1394_IR_NFRAMES_MIN = 3,
AV1394_IT_NFRAMES_MIN = 3,
AV1394_CIPSZ = 8,
AV1394_DV_NTSC_FRAMESZ = 250,
AV1394_DV_PAL_FRAMESZ = 300
};
#define AV1394_TS_MODE_GET_OFF(mode) ((mode) & 0xff)
#define AV1394_TS_MODE_GET_SIZE(mode) (((mode) >> 8) & 0xff)
#define IEC61883_PRIV_ISOCH_NOALLOC 0x40000000
typedef struct av1394_isoch_autoxmit_s {
uchar_t ax_ciph[AV1394_CIPSZ];
boolean_t ax_copy_ciph;
int ax_fmt;
} av1394_isoch_autoxmit_t;
enum {
AV1394_ISOCH_AUTOXMIT_DV = 0x10,
AV1394_ISOCH_AUTOXMIT_UNKNOWN = 0,
AV1394_ISOCH_AUTOXMIT_DV_NTSC = 1 | AV1394_ISOCH_AUTOXMIT_DV,
AV1394_ISOCH_AUTOXMIT_DV_PAL = 2 | AV1394_ISOCH_AUTOXMIT_DV
};
typedef struct av1394_as_s {
off_t as_end;
} av1394_as_t;
#define AV1394_PCR_ADDR_START 0xFFFFF0000900
#define AV1394_PCR_ADDR_OMPR 0xFFFFF0000900
#define AV1394_PCR_ADDR_OPCR0 0xFFFFF0000904
#define AV1394_PCR_ADDR_NOPCR 31
#define AV1394_PCR_ADDR_IMPR 0xFFFFF0000980
#define AV1394_PCR_ADDR_IPCR0 0xFFFFF0000984
#define AV1394_PCR_ADDR_NIPCR 31
#define AV1394_OMPR_INIT_VAL 0xBFFFFF00
#define AV1394_IMPR_INIT_VAL 0x80FFFF00
#define AV1394_PCR_INIT_VAL 0x00000000
#define AV1394_OPCR_BR_CLEAR_MASK 0x7FC03C00
#define AV1394_IPCR_BR_CLEAR_MASK 0x7FC0FFFF
typedef struct av1394_pcr_s {
uint32_t pcr_val;
t1394_addr_handle_t pcr_addr_hdl;
} av1394_pcr_t;
enum {
AV1394_OMPR_IDX = 0,
AV1394_OPCR0_IDX = 1,
AV1394_IMPR_IDX = 32,
AV1394_IPCR0_IDX = 33,
AV1394_NPCR = 64
};
enum {
AV1394_PCR_REMOTE = 0x40000000
};
typedef struct av1394_cmp_s {
krwlock_t cmp_pcr_rwlock;
av1394_pcr_t *cmp_pcr[AV1394_NPCR];
} av1394_cmp_t;
_NOTE(SCHEME_PROTECTS_DATA("cmp_pcr_rwlock", av1394_cmp_s::cmp_pcr))
typedef struct av1394_isoch_s {
kmutex_t i_mutex;
int i_nopen;
av1394_cmp_t i_cmp;
av1394_ic_t *i_ic[64];
av1394_as_t i_mmap_as;
ddi_softintr_t i_softintr_id;
uint64_t i_softintr_ch;
av1394_isoch_autoxmit_t i_autoxmit;
} av1394_isoch_t;
_NOTE(MUTEX_PROTECTS_DATA(av1394_isoch_s::i_mutex, av1394_isoch_s))
_NOTE(DATA_READABLE_WITHOUT_LOCK(av1394_isoch_s::{
i_ic
i_softintr_id
}))
_NOTE(SCHEME_PROTECTS_DATA("single-threaded", av1394_isoch_autoxmit_s))
_NOTE(LOCK_ORDER(av1394_isoch_s::i_mutex av1394_ic_s::ic_mutex))
enum {
AV1394_PREQ_IR_OVERFLOW = 0x01,
AV1394_PREQ_IT_UNDERRUN = 0x02
};
int av1394_ic_open(struct av1394_inst_s *, int);
int av1394_ic_close(struct av1394_inst_s *, int);
int av1394_ic_init(struct av1394_inst_s *avp, iec61883_isoch_init_t *ii,
av1394_ic_t **icpp);
void av1394_ic_fini(av1394_ic_t *icp);
int av1394_ic_alloc_pool(av1394_isoch_pool_t *pool, size_t segsz, int cnt,
int mincnt);
void av1394_ic_free_pool(av1394_isoch_pool_t *pool);
int av1394_ic_dma_setup(av1394_ic_t *icp, av1394_isoch_pool_t *pool);
void av1394_ic_dma_cleanup(av1394_ic_t *icp, av1394_isoch_pool_t *pool);
int av1394_ic_ixl_seg_decomp(size_t segsz, size_t pktsz, size_t *bufszp,
size_t *tailszp);
void av1394_ic_dma_sync_frames(av1394_ic_t *icp, int idx, int cnt,
av1394_isoch_pool_t *pool, uint_t type);
int av1394_ic_start(av1394_ic_t *icp);
int av1394_ic_stop(av1394_ic_t *icp);
void av1394_ic_ixl_dump(ixl1394_command_t *cmd);
void av1394_ic_trigger_softintr(av1394_ic_t *icp, int num, int preq);
int av1394_ir_init(av1394_ic_t *icp, int *error);
void av1394_ir_fini(av1394_ic_t *icp);
int av1394_ir_start(av1394_ic_t *icp);
int av1394_ir_stop(av1394_ic_t *icp);
int av1394_ir_recv(av1394_ic_t *icp, iec61883_recv_t *recv);
int av1394_ir_read(av1394_ic_t *icp, struct uio *uiop);
void av1394_ir_overflow(av1394_ic_t *icp);
int av1394_it_init(av1394_ic_t *icp, int *error);
void av1394_it_fini(av1394_ic_t *icp);
int av1394_it_start(av1394_ic_t *icp);
int av1394_it_stop(av1394_ic_t *icp);
int av1394_it_xmit(av1394_ic_t *icp, iec61883_xmit_t *xmit);
int av1394_it_write(av1394_ic_t *icp, struct uio *uiop);
void av1394_it_underrun(av1394_ic_t *icp);
void av1394_as_init(av1394_as_t *as);
void av1394_as_fini(av1394_as_t *as);
off_t av1394_as_alloc(av1394_as_t *as, size_t size);
void av1394_as_free(av1394_as_t *as, off_t);
int av1394_cmp_init(struct av1394_inst_s *avp);
void av1394_cmp_fini(struct av1394_inst_s *avp);
void av1394_cmp_bus_reset(struct av1394_inst_s *avp);
void av1394_cmp_close(struct av1394_inst_s *avp);
int av1394_ioctl_plug_init(struct av1394_inst_s *, void *, int);
int av1394_ioctl_plug_fini(struct av1394_inst_s *, void *, int);
int av1394_ioctl_plug_reg_read(struct av1394_inst_s *, void *, int);
int av1394_ioctl_plug_reg_cas(struct av1394_inst_s *, void *, int);
int av1394_isoch_attach(struct av1394_inst_s *);
void av1394_isoch_detach(struct av1394_inst_s *);
int av1394_isoch_cpr_suspend(struct av1394_inst_s *);
int av1394_isoch_cpr_resume(struct av1394_inst_s *);
void av1394_isoch_bus_reset(struct av1394_inst_s *);
void av1394_isoch_disconnect(struct av1394_inst_s *);
void av1394_isoch_reconnect(struct av1394_inst_s *);
int av1394_isoch_open(struct av1394_inst_s *, int);
int av1394_isoch_close(struct av1394_inst_s *, int);
int av1394_isoch_read(struct av1394_inst_s *, struct uio *);
int av1394_isoch_write(struct av1394_inst_s *, struct uio *);
int av1394_isoch_ioctl(struct av1394_inst_s *, int, intptr_t, int, int *);
int av1394_isoch_devmap(struct av1394_inst_s *, devmap_cookie_t, offset_t,
size_t, size_t *, uint_t);
#ifdef __cplusplus
}
#endif
#endif