2 * ohci1394.h - driver for OHCI 1394 boards
3 * Copyright (C)1999,2000 Sebastien Rougeaux <sebastien.rougeaux@anu.edu.au>
4 * Gord Peters <GordPeters@smarttech.com>
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.
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.
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.
24 #include "ieee1394_types.h"
26 #define IEEE1394_USE_BOTTOM_HALVES 0
28 #define OHCI1394_DRIVER_NAME "ohci1394"
30 #ifndef PCI_DEVICE_ID_TI_OHCI1394_LV22
31 #define PCI_DEVICE_ID_TI_OHCI1394_LV22 0x8009
34 #ifndef PCI_DEVICE_ID_TI_OHCI1394_LV23
35 #define PCI_DEVICE_ID_TI_OHCI1394_LV23 0x8019
38 #ifndef PCI_DEVICE_ID_TI_OHCI1394_LV26
39 #define PCI_DEVICE_ID_TI_OHCI1394_LV26 0x8020
42 #ifndef PCI_DEVICE_ID_VIA_OHCI1394
43 #define PCI_DEVICE_ID_VIA_OHCI1394 0x3044
46 #ifndef PCI_VENDOR_ID_SONY
47 #define PCI_VENDOR_ID_SONY 0x104d
50 #ifndef PCI_DEVICE_ID_SONY_CXD3222
51 #define PCI_DEVICE_ID_SONY_CXD3222 0x8039
54 #ifndef PCI_DEVICE_ID_NEC_1394
55 #define PCI_DEVICE_ID_NEC_1394 0x00cd
58 #ifndef PCI_DEVICE_ID_NEC_UPD72862
59 #define PCI_DEVICE_ID_NEC_UPD72862 0x0063
62 #ifndef PCI_DEVICE_ID_NEC_UPD72870
63 #define PCI_DEVICE_ID_NEC_UPD72870 0x00cd
66 #ifndef PCI_DEVICE_ID_NEC_UPD72871
67 #define PCI_DEVICE_ID_NEC_UPD72871 0x00ce
70 #ifndef PCI_DEVICE_ID_APPLE_UNI_N_FW
71 #define PCI_DEVICE_ID_APPLE_UNI_N_FW 0x0018
74 #ifndef PCI_DEVICE_ID_ALI_OHCI1394_M5251
75 #define PCI_DEVICE_ID_ALI_OHCI1394_M5251 0x5251
78 #ifndef PCI_VENDOR_ID_LUCENT
79 #define PCI_VENDOR_ID_LUCENT 0x11c1
82 #ifndef PCI_DEVICE_ID_LUCENT_FW323
83 #define PCI_DEVICE_ID_LUCENT_FW323 0x5811
86 #define MAX_OHCI1394_CARDS 4
88 #define OHCI1394_MAX_AT_REQ_RETRIES 0x2
89 #define OHCI1394_MAX_AT_RESP_RETRIES 0x2
90 #define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8
91 #define OHCI1394_MAX_SELF_ID_ERRORS 16
93 #define AR_REQ_NUM_DESC 4 /* number of AR req descriptors */
94 #define AR_REQ_BUF_SIZE 4096 /* size of AR req buffers */
95 #define AR_REQ_SPLIT_BUF_SIZE 4096 /* split packet buffer */
97 #define AR_RESP_NUM_DESC 4 /* number of AR resp descriptors */
98 #define AR_RESP_BUF_SIZE 4096 /* size of AR resp buffers */
99 #define AR_RESP_SPLIT_BUF_SIZE 4096 /* split packet buffer */
101 #define IR_NUM_DESC 16 /* number of IR descriptors */
102 #define IR_BUF_SIZE 4096 /* 6480 bytes/buffer */
103 #define IR_SPLIT_BUF_SIZE 4096 /* split packet buffer */
105 #define AT_REQ_NUM_DESC 32 /* number of AT req descriptors */
106 #define AT_RESP_NUM_DESC 32 /* number of AT resp descriptors */
116 struct dma_cmd begin
;
121 /* DMA receive context */
125 unsigned int num_desc
;
126 unsigned int buf_size
;
127 unsigned int split_buf_size
;
129 /* dma block descriptors */
130 struct dma_cmd
**prg_cpu
;
137 unsigned int buf_ind
;
138 unsigned int buf_offset
;
141 struct tq_struct task
;
147 /* DMA transmit context */
151 unsigned int num_desc
;
153 /* dma block descriptors */
154 struct at_dma_prg
**prg_cpu
;
157 unsigned int prg_ind
;
158 unsigned int sent_ind
;
160 quadlet_t
*branchAddrPtr
;
162 /* list of packets inserted in the AT FIFO */
163 struct hpsb_packet
*fifo_first
;
164 struct hpsb_packet
*fifo_last
;
166 /* list of pending packets to be inserted in the AT FIFO */
167 struct hpsb_packet
*pending_first
;
168 struct hpsb_packet
*pending_last
;
171 struct tq_struct task
;
177 /* video device template */
178 struct video_template
{
179 void (*irq_handler
) (int card
, quadlet_t isoRecvEvent
,
180 quadlet_t isoXmitEvent
);
185 int id
; /* sequential card number */
191 /* remapped memory spaces */
194 /* dma buffer for self-id packets */
195 quadlet_t
*selfid_buf_cpu
;
196 dma_addr_t selfid_buf_bus
;
198 /* buffer for csr config rom */
199 quadlet_t
*csr_config_rom_cpu
;
200 dma_addr_t csr_config_rom_bus
;
202 unsigned int max_packet_size
;
205 struct dma_rcv_ctx
*ar_resp_context
;
206 struct dma_rcv_ctx
*ar_req_context
;
209 struct dma_trm_ctx
*at_resp_context
;
210 struct dma_trm_ctx
*at_req_context
;
213 struct dma_rcv_ctx
*ir_context
;
214 u64 IR_channel_usage
;
215 spinlock_t IR_channel_lock
;
221 /* IEEE-1394 part follows */
222 struct hpsb_host
*host
;
226 spinlock_t phy_reg_lock
;
232 struct video_template
*video_tmpl
;
235 inline static int cross_bound(unsigned long addr
, unsigned int size
)
238 if (size
>PAGE_SIZE
) {
239 cross
= size
/PAGE_SIZE
;
240 size
-= cross
*PAGE_SIZE
;
242 if ((PAGE_SIZE
-addr
%PAGE_SIZE
)<size
)
248 * Register read and write helper functions.
250 inline static void reg_write(const struct ti_ohci
*ohci
, int offset
, u32 data
)
252 writel(data
, ohci
->registers
+ offset
);
255 inline static u32
reg_read(const struct ti_ohci
*ohci
, int offset
)
257 return readl(ohci
->registers
+ offset
);
260 /* This structure is not properly initialized ... it is taken from
261 the lynx_csr_rom written by Andreas ... Some fields in the root
262 directory and the module dependent info needs to be modified
263 I do not have the proper doc */
264 quadlet_t ohci_csr_rom
[] = {
266 0x04040000, /* info/CRC length, CRC */
267 0x31333934, /* 1394 magic number */
268 0xf07da002, /* cyc_clk_acc = 125us, max_rec = 1024 */
269 0x00000000, /* vendor ID, chip ID high (written from card info) */
270 0x00000000, /* chip ID low (written from card info) */
271 /* root directory - FIXME */
272 0x00090000, /* CRC length, CRC */
273 0x03080028, /* vendor ID (Texas Instr.) */
274 0x81000009, /* offset to textual ID */
275 0x0c000200, /* node capabilities */
276 0x8d00000e, /* offset to unique ID */
277 0xc7000010, /* offset to module independent info */
278 0x04000000, /* module hardware version */
279 0x81000026, /* offset to textual ID */
280 0x09000000, /* node hardware version */
281 0x81000026, /* offset to textual ID */
282 /* module vendor ID textual */
283 0x00080000, /* CRC length, CRC */
286 0x54455841, /* "Texas Instruments" */
291 /* node unique ID leaf */
292 0x00020000, /* CRC length, CRC */
293 0x08002856, /* vendor ID, chip ID high */
294 0x0000083E, /* chip ID low */
295 /* module dependent info - FIXME */
296 0x00060000, /* CRC length, CRC */
297 0xb8000006, /* ??? offset to module textual ID */
298 0x81000004, /* ??? textual descriptor */
299 0x00000000, /* SRAM size */
300 0x00000000, /* AUXRAM size */
301 0x00000000, /* AUX device */
302 /* module textual ID */
303 0x00050000, /* CRC length, CRC */
306 0x54534231, /* "TSB12LV22" */
310 0x00060000, /* CRC length, CRC */
313 0x39383036, /* "9806000-0001" */
317 /* module hardware version textual */
318 0x00050000, /* CRC length, CRC */
321 0x5453424b, /* "TSBKOHCI403" */
324 /* node hardware version textual */
325 0x00050000, /* CRC length, CRC */
328 0x54534234, /* "TSB41LV03" */
334 /* 2 KiloBytes of register space */
335 #define OHCI1394_REGISTER_SIZE 0x800
338 #define OHCI1394_Version 0x000
339 #define OHCI1394_GUID_ROM 0x004
340 #define OHCI1394_ATRetries 0x008
341 #define OHCI1394_CSRData 0x00C
342 #define OHCI1394_CSRCompareData 0x010
343 #define OHCI1394_CSRControl 0x014
344 #define OHCI1394_ConfigROMhdr 0x018
345 #define OHCI1394_BusID 0x01C
346 #define OHCI1394_BusOptions 0x020
347 #define OHCI1394_GUIDHi 0x024
348 #define OHCI1394_GUIDLo 0x028
349 #define OHCI1394_ConfigROMmap 0x034
350 #define OHCI1394_PostedWriteAddressLo 0x038
351 #define OHCI1394_PostedWriteAddressHi 0x03C
352 #define OHCI1394_VendorID 0x040
353 #define OHCI1394_HCControlSet 0x050
354 #define OHCI1394_HCControlClear 0x054
355 #define OHCI1394_SelfIDBuffer 0x064
356 #define OHCI1394_SelfIDCount 0x068
357 #define OHCI1394_IRMultiChanMaskHiSet 0x070
358 #define OHCI1394_IRMultiChanMaskHiClear 0x074
359 #define OHCI1394_IRMultiChanMaskLoSet 0x078
360 #define OHCI1394_IRMultiChanMaskLoClear 0x07C
361 #define OHCI1394_IntEventSet 0x080
362 #define OHCI1394_IntEventClear 0x084
363 #define OHCI1394_IntMaskSet 0x088
364 #define OHCI1394_IntMaskClear 0x08C
365 #define OHCI1394_IsoXmitIntEventSet 0x090
366 #define OHCI1394_IsoXmitIntEventClear 0x094
367 #define OHCI1394_IsoXmitIntMaskSet 0x098
368 #define OHCI1394_IsoXmitIntMaskClear 0x09C
369 #define OHCI1394_IsoRecvIntEventSet 0x0A0
370 #define OHCI1394_IsoRecvIntEventClear 0x0A4
371 #define OHCI1394_IsoRecvIntMaskSet 0x0A8
372 #define OHCI1394_IsoRecvIntMaskClear 0x0AC
373 #define OHCI1394_FairnessControl 0x0DC
374 #define OHCI1394_LinkControlSet 0x0E0
375 #define OHCI1394_LinkControlClear 0x0E4
376 #define OHCI1394_NodeID 0x0E8
377 #define OHCI1394_PhyControl 0x0EC
378 #define OHCI1394_IsochronousCycleTimer 0x0F0
379 #define OHCI1394_AsReqFilterHiSet 0x100
380 #define OHCI1394_AsReqFilterHiClear 0x104
381 #define OHCI1394_AsReqFilterLoSet 0x108
382 #define OHCI1394_AsReqFilterLoClear 0x10C
383 #define OHCI1394_PhyReqFilterHiSet 0x110
384 #define OHCI1394_PhyReqFilterHiClear 0x114
385 #define OHCI1394_PhyReqFilterLoSet 0x118
386 #define OHCI1394_PhyReqFilterLoClear 0x11C
387 #define OHCI1394_PhyUpperBound 0x120
388 #define OHCI1394_AsReqTrContextControlSet 0x180
389 #define OHCI1394_AsReqTrContextControlClear 0x184
390 #define OHCI1394_AsReqTrCommandPtr 0x18C
391 #define OHCI1394_AsRspTrContextControlSet 0x1A0
392 #define OHCI1394_AsRspTrContextControlClear 0x1A4
393 #define OHCI1394_AsRspTrCommandPtr 0x1AC
394 #define OHCI1394_AsReqRcvContextControlSet 0x1C0
395 #define OHCI1394_AsReqRcvContextControlClear 0x1C4
396 #define OHCI1394_AsReqRcvCommandPtr 0x1CC
397 #define OHCI1394_AsRspRcvContextControlSet 0x1E0
398 #define OHCI1394_AsRspRcvContextControlClear 0x1E4
399 #define OHCI1394_AsRspRcvCommandPtr 0x1EC
401 /* Isochronous transmit registers */
402 /* Add (32 * n) for context n */
403 #define OHCI1394_IsoXmitContextControlSet 0x200
404 #define OHCI1394_IsoXmitContextControlClear 0x204
405 #define OHCI1394_IsoXmitCommandPtr 0x20C
407 /* Isochronous receive registers */
408 /* Add (32 * n) for context n */
409 #define OHCI1394_IsoRcvContextControlSet 0x400
410 #define OHCI1394_IsoRcvContextControlClear 0x404
411 #define OHCI1394_IsoRcvCommandPtr 0x40C
412 #define OHCI1394_IsoRcvContextMatch 0x410
414 /* Interrupts Mask/Events */
416 #define OHCI1394_reqTxComplete 0x00000001
417 #define OHCI1394_respTxComplete 0x00000002
418 #define OHCI1394_ARRQ 0x00000004
419 #define OHCI1394_ARRS 0x00000008
420 #define OHCI1394_RQPkt 0x00000010
421 #define OHCI1394_RSPkt 0x00000020
422 #define OHCI1394_isochTx 0x00000040
423 #define OHCI1394_isochRx 0x00000080
424 #define OHCI1394_postedWriteErr 0x00000100
425 #define OHCI1394_lockRespErr 0x00000200
426 #define OHCI1394_selfIDComplete 0x00010000
427 #define OHCI1394_busReset 0x00020000
428 #define OHCI1394_phy 0x00080000
429 #define OHCI1394_cycleSynch 0x00100000
430 #define OHCI1394_cycle64Seconds 0x00200000
431 #define OHCI1394_cycleLost 0x00400000
432 #define OHCI1394_cycleInconsistent 0x00800000
433 #define OHCI1394_unrecoverableError 0x01000000
434 #define OHCI1394_cycleTooLong 0x02000000
435 #define OHCI1394_phyRegRcvd 0x04000000
436 #define OHCI1394_masterIntEnable 0x80000000
438 #define OUTPUT_MORE 0x00000000
439 #define OUTPUT_MORE_IMMEDIATE 0x02000000
440 #define OUTPUT_LAST 0x103c0000
441 #define OUTPUT_LAST_IMMEDIATE 0x123c0000
443 #define DMA_SPEED_100 0x0
444 #define DMA_SPEED_200 0x1
445 #define DMA_SPEED_400 0x2
447 void ohci1394_stop_context(struct ti_ohci
*ohci
, int reg
, char *msg
);
448 struct ti_ohci
*ohci1394_get_struct(int card_num
);
449 int ohci1394_register_video(struct ti_ohci
*ohci
,
450 struct video_template
*tmpl
);
451 void ohci1394_unregister_video(struct ti_ohci
*ohci
,
452 struct video_template
*tmpl
);