2 * dec_esp.c: Driver for SCSI chips on IOASIC based TURBOchannel DECstations
3 * and TURBOchannel PMAZ-A cards
5 * TURBOchannel changes by Harald Koerfgen
6 * PMAZ-A support by David Airlie
9 * Copyright (C) 1997 Thomas Bogendoerfer (tsbogend@alpha.franken.de)
11 * jazz_esp is based on David S. Miller's ESP driver and cyber_esp
13 * 20000819 - Small PMAZ-AA fixes by Florian Lohoff <flo@rfc822.org>
14 * Be warned the PMAZ-AA works currently as a single card.
15 * Dont try to put multiple cards in one machine - They are
16 * both detected but it may crash under high load garbling your
18 * 20001005 - Initialization fixes for 2.4.0-test9
19 * Florian Lohoff <flo@rfc822.org>
21 * Copyright (C) 2002, 2003 Maciej W. Rozycki
24 #include <linux/kernel.h>
25 #include <linux/delay.h>
26 #include <linux/types.h>
27 #include <linux/string.h>
28 #include <linux/slab.h>
29 #include <linux/blk.h>
30 #include <linux/proc_fs.h>
31 #include <linux/spinlock.h>
32 #include <linux/stat.h>
36 #include <asm/pgtable.h>
37 #include <asm/system.h>
39 #include <asm/dec/interrupts.h>
40 #include <asm/dec/ioasic.h>
41 #include <asm/dec/ioasic_addrs.h>
42 #include <asm/dec/ioasic_ints.h>
43 #include <asm/dec/machtype.h>
44 #include <asm/dec/tc.h>
52 static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count);
53 static void dma_drain(struct NCR_ESP *esp);
54 static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd * sp);
55 static void dma_dump_state(struct NCR_ESP *esp);
56 static void dma_init_read(struct NCR_ESP *esp, u32 vaddress, int length);
57 static void dma_init_write(struct NCR_ESP *esp, u32 vaddress, int length);
58 static void dma_ints_off(struct NCR_ESP *esp);
59 static void dma_ints_on(struct NCR_ESP *esp);
60 static int dma_irq_p(struct NCR_ESP *esp);
61 static int dma_ports_p(struct NCR_ESP *esp);
62 static void dma_setup(struct NCR_ESP *esp, u32 addr, int count, int write);
63 static void dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp);
64 static void dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd * sp);
65 static void dma_advance_sg(Scsi_Cmnd * sp);
67 static void pmaz_dma_drain(struct NCR_ESP *esp);
68 static void pmaz_dma_init_read(struct NCR_ESP *esp, u32 vaddress, int length);
69 static void pmaz_dma_init_write(struct NCR_ESP *esp, u32 vaddress, int length);
70 static void pmaz_dma_ints_off(struct NCR_ESP *esp);
71 static void pmaz_dma_ints_on(struct NCR_ESP *esp);
72 static void pmaz_dma_setup(struct NCR_ESP *esp, u32 addr, int count, int write);
73 static void pmaz_dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp);
75 #define TC_ESP_RAM_SIZE 0x20000
76 #define ESP_TGT_DMA_SIZE ((TC_ESP_RAM_SIZE/7) & ~(sizeof(int)-1))
79 #define TC_ESP_DMAR_MASK 0x1ffff
80 #define TC_ESP_DMAR_WRITE 0x80000000
81 #define TC_ESP_DMA_ADDR(x) ((unsigned)(x) & TC_ESP_DMAR_MASK)
84 int scsi_current_length;
86 volatile unsigned char cmd_buffer[16];
87 volatile unsigned char pmaz_cmd_buffer[16];
88 /* This is where all commands are put
89 * before they are trasfered to the ESP chip
93 static void scsi_dma_merr_int(int, void *, struct pt_regs *);
94 static void scsi_dma_err_int(int, void *, struct pt_regs *);
95 static void scsi_dma_int(int, void *, struct pt_regs *);
97 static Scsi_Host_Template driver_template = SCSI_DEC_ESP;
99 #include "scsi_module.c"
101 /***************************************************************** Detection */
102 int dec_esp_detect(Scsi_Host_Template * tpnt)
105 struct ConfigDev *esp_dev;
107 unsigned long mem_start;
111 esp = esp_allocate(tpnt, (void *) esp_dev);
113 /* Do command transfer with programmed I/O */
114 esp->do_pio_cmds = 1;
116 /* Required functions */
117 esp->dma_bytes_sent = &dma_bytes_sent;
118 esp->dma_can_transfer = &dma_can_transfer;
119 esp->dma_dump_state = &dma_dump_state;
120 esp->dma_init_read = &dma_init_read;
121 esp->dma_init_write = &dma_init_write;
122 esp->dma_ints_off = &dma_ints_off;
123 esp->dma_ints_on = &dma_ints_on;
124 esp->dma_irq_p = &dma_irq_p;
125 esp->dma_ports_p = &dma_ports_p;
126 esp->dma_setup = &dma_setup;
128 /* Optional functions */
129 esp->dma_barrier = 0;
130 esp->dma_drain = &dma_drain;
131 esp->dma_invalidate = 0;
132 esp->dma_irq_entry = 0;
133 esp->dma_irq_exit = 0;
136 esp->dma_led_off = 0;
139 /* virtual DMA functions */
140 esp->dma_mmu_get_scsi_one = &dma_mmu_get_scsi_one;
141 esp->dma_mmu_get_scsi_sgl = &dma_mmu_get_scsi_sgl;
142 esp->dma_mmu_release_scsi_one = 0;
143 esp->dma_mmu_release_scsi_sgl = 0;
144 esp->dma_advance_sg = &dma_advance_sg;
147 /* SCSI chip speed */
148 esp->cfreq = 25000000;
152 /* ESP register base */
153 esp->eregs = (struct ESP_regs *) (system_base + IOASIC_SCSI);
155 /* Set the command buffer */
156 esp->esp_command = (volatile unsigned char *) cmd_buffer;
158 /* get virtual dma address for command buffer */
159 esp->esp_command_dvma = virt_to_phys(cmd_buffer);
161 esp->irq = dec_interrupt[DEC_IRQ_ASC];
165 /* Check for differential SCSI-bus */
170 if (request_irq(esp->irq, esp_intr, SA_INTERRUPT,
173 if (request_irq(dec_interrupt[DEC_IRQ_ASC_MERR],
174 scsi_dma_merr_int, SA_INTERRUPT,
175 "ncr53c94 error", NULL))
177 if (request_irq(dec_interrupt[DEC_IRQ_ASC_ERR],
178 scsi_dma_err_int, SA_INTERRUPT,
179 "ncr53c94 overrun", NULL))
180 goto err_free_irq_merr;
181 if (request_irq(dec_interrupt[DEC_IRQ_ASC_DMA],
182 scsi_dma_int, SA_INTERRUPT,
183 "ncr53c94 dma", NULL))
184 goto err_free_irq_err;
189 while ((slot = search_tc_card("PMAZ-AA")) >= 0) {
193 esp = esp_allocate(tpnt, (void *) esp_dev);
195 mem_start = get_tc_base_addr(slot);
197 /* Store base addr into esp struct */
198 esp->slot = PHYSADDR(mem_start);
201 esp->eregs = (struct ESP_regs *) (mem_start + DEC_SCSI_SREG);
202 esp->do_pio_cmds = 1;
204 /* Set the command buffer */
205 esp->esp_command = (volatile unsigned char *) pmaz_cmd_buffer;
207 /* get virtual dma address for command buffer */
208 esp->esp_command_dvma = virt_to_phys(pmaz_cmd_buffer);
210 esp->cfreq = get_tc_speed();
212 esp->irq = get_tc_irq_nr(slot);
214 /* Required functions */
215 esp->dma_bytes_sent = &dma_bytes_sent;
216 esp->dma_can_transfer = &dma_can_transfer;
217 esp->dma_dump_state = &dma_dump_state;
218 esp->dma_init_read = &pmaz_dma_init_read;
219 esp->dma_init_write = &pmaz_dma_init_write;
220 esp->dma_ints_off = &pmaz_dma_ints_off;
221 esp->dma_ints_on = &pmaz_dma_ints_on;
222 esp->dma_irq_p = &dma_irq_p;
223 esp->dma_ports_p = &dma_ports_p;
224 esp->dma_setup = &pmaz_dma_setup;
226 /* Optional functions */
227 esp->dma_barrier = 0;
228 esp->dma_drain = &pmaz_dma_drain;
229 esp->dma_invalidate = 0;
230 esp->dma_irq_entry = 0;
231 esp->dma_irq_exit = 0;
234 esp->dma_led_off = 0;
237 esp->dma_mmu_get_scsi_one = pmaz_dma_mmu_get_scsi_one;
238 esp->dma_mmu_get_scsi_sgl = 0;
239 esp->dma_mmu_release_scsi_one = 0;
240 esp->dma_mmu_release_scsi_sgl = 0;
241 esp->dma_advance_sg = 0;
243 if (request_irq(esp->irq, esp_intr, SA_INTERRUPT,
246 release_tc_card(slot);
256 printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps, esps_in_use);
257 esps_running = esps_in_use;
263 free_irq(dec_interrupt[DEC_IRQ_ASC_ERR], scsi_dma_err_int);
265 free_irq(dec_interrupt[DEC_IRQ_ASC_MERR], scsi_dma_merr_int);
267 free_irq(esp->irq, esp_intr);
273 /************************************************************* DMA Functions */
274 static void scsi_dma_merr_int(int irq, void *dev_id, struct pt_regs *regs)
276 printk("Got unexpected SCSI DMA Interrupt! < ");
277 printk("SCSI_DMA_MEMRDERR ");
281 static void scsi_dma_err_int(int irq, void *dev_id, struct pt_regs *regs)
286 static void scsi_dma_int(int irq, void *dev_id, struct pt_regs *regs)
290 scsi_next_ptr = ioasic_read(IO_REG_SCSI_DMA_P);
293 scsi_next_ptr = (((scsi_next_ptr >> 3) + PAGE_SIZE) & PAGE_MASK) << 3;
294 ioasic_write(IO_REG_SCSI_DMA_BP, scsi_next_ptr);
298 static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count)
303 static void dma_drain(struct NCR_ESP *esp)
305 u32 nw, data0, data1, scsi_data_ptr;
308 nw = ioasic_read(IO_REG_SCSI_SCR);
311 * Is there something in the dma buffers left?
314 scsi_data_ptr = ioasic_read(IO_REG_SCSI_DMA_P) >> 3;
315 p = phys_to_virt(scsi_data_ptr);
318 data0 = ioasic_read(IO_REG_SCSI_SDR0);
319 p[0] = data0 & 0xffff;
322 data0 = ioasic_read(IO_REG_SCSI_SDR0);
323 p[0] = data0 & 0xffff;
324 p[1] = (data0 >> 16) & 0xffff;
327 data0 = ioasic_read(IO_REG_SCSI_SDR0);
328 data1 = ioasic_read(IO_REG_SCSI_SDR1);
329 p[0] = data0 & 0xffff;
330 p[1] = (data0 >> 16) & 0xffff;
331 p[2] = data1 & 0xffff;
334 printk("Strange: %d words in dma buffer left\n", nw);
340 static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd * sp)
342 return sp->SCp.this_residual;;
345 static void dma_dump_state(struct NCR_ESP *esp)
349 static void dma_init_read(struct NCR_ESP *esp, u32 vaddress, int length)
351 u32 scsi_next_ptr, ioasic_ssr;
355 panic("dec_esp.c: unable to handle partial word transfers, yet...");
357 dma_cache_wback_inv((unsigned long) phys_to_virt(vaddress), length);
359 spin_lock_irqsave(&ioasic_ssr_lock, flags);
362 ioasic_ssr = ioasic_read(IO_REG_SSR);
364 ioasic_ssr &= ~IO_SSR_SCSI_DMA_EN;
365 ioasic_write(IO_REG_SSR, ioasic_ssr);
368 ioasic_write(IO_REG_SCSI_SCR, 0);
369 ioasic_write(IO_REG_SCSI_DMA_P, vaddress << 3);
371 /* prepare for next page */
372 scsi_next_ptr = ((vaddress + PAGE_SIZE) & PAGE_MASK) << 3;
373 ioasic_write(IO_REG_SCSI_DMA_BP, scsi_next_ptr);
375 ioasic_ssr |= (IO_SSR_SCSI_DMA_DIR | IO_SSR_SCSI_DMA_EN);
377 ioasic_write(IO_REG_SSR, ioasic_ssr);
380 spin_unlock_irqrestore(&ioasic_ssr_lock, flags);
383 static void dma_init_write(struct NCR_ESP *esp, u32 vaddress, int length)
385 u32 scsi_next_ptr, ioasic_ssr;
389 panic("dec_esp.c: unable to handle partial word transfers, yet...");
391 dma_cache_wback_inv((unsigned long) phys_to_virt(vaddress), length);
393 spin_lock_irqsave(&ioasic_ssr_lock, flags);
396 ioasic_ssr = ioasic_read(IO_REG_SSR);
398 ioasic_ssr &= ~(IO_SSR_SCSI_DMA_DIR | IO_SSR_SCSI_DMA_EN);
399 ioasic_write(IO_REG_SSR, ioasic_ssr);
402 ioasic_write(IO_REG_SCSI_SCR, 0);
403 ioasic_write(IO_REG_SCSI_DMA_P, vaddress << 3);
405 /* prepare for next page */
406 scsi_next_ptr = ((vaddress + PAGE_SIZE) & PAGE_MASK) << 3;
407 ioasic_write(IO_REG_SCSI_DMA_BP, scsi_next_ptr);
409 ioasic_ssr |= IO_SSR_SCSI_DMA_EN;
411 ioasic_write(IO_REG_SSR, ioasic_ssr);
414 spin_unlock_irqrestore(&ioasic_ssr_lock, flags);
417 static void dma_ints_off(struct NCR_ESP *esp)
419 disable_irq(dec_interrupt[DEC_IRQ_ASC_DMA]);
422 static void dma_ints_on(struct NCR_ESP *esp)
424 enable_irq(dec_interrupt[DEC_IRQ_ASC_DMA]);
427 static int dma_irq_p(struct NCR_ESP *esp)
429 return (esp->eregs->esp_status & ESP_STAT_INTR);
432 static int dma_ports_p(struct NCR_ESP *esp)
435 * FIXME: what's this good for?
440 static void dma_setup(struct NCR_ESP *esp, u32 addr, int count, int write)
443 * DMA_ST_WRITE means "move data from device to memory"
444 * so when (write) is true, it actually means READ!
447 dma_init_read(esp, addr, count);
449 dma_init_write(esp, addr, count);
452 static void dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp)
454 sp->SCp.ptr = (char *)virt_to_phys(sp->request_buffer);
457 static void dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd * sp)
459 int sz = sp->SCp.buffers_residual;
460 struct scatterlist *sg = sp->SCp.buffer;
463 sg[sz].dma_address = virt_to_phys(sg[sz].address);
466 sp->SCp.ptr = (char *)(sp->SCp.buffer->dma_address);
469 static void dma_advance_sg(Scsi_Cmnd * sp)
471 sp->SCp.ptr = (char *)(sp->SCp.buffer->dma_address);
474 static void pmaz_dma_drain(struct NCR_ESP *esp)
476 memcpy(phys_to_virt(esp_virt_buffer),
477 (void *)KSEG1ADDR(esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE),
478 scsi_current_length);
481 static void pmaz_dma_init_read(struct NCR_ESP *esp, u32 vaddress, int length)
483 volatile u32 *dmareg =
484 (volatile u32 *)KSEG1ADDR(esp->slot + DEC_SCSI_DMAREG);
486 if (length > ESP_TGT_DMA_SIZE)
487 length = ESP_TGT_DMA_SIZE;
489 *dmareg = TC_ESP_DMA_ADDR(ESP_TGT_DMA_SIZE);
493 esp_virt_buffer = vaddress;
494 scsi_current_length = length;
497 static void pmaz_dma_init_write(struct NCR_ESP *esp, u32 vaddress, int length)
499 volatile u32 *dmareg =
500 (volatile u32 *)KSEG1ADDR(esp->slot + DEC_SCSI_DMAREG);
502 memcpy((void *)KSEG1ADDR(esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE),
503 phys_to_virt(vaddress), length);
506 *dmareg = TC_ESP_DMAR_WRITE | TC_ESP_DMA_ADDR(ESP_TGT_DMA_SIZE);
511 static void pmaz_dma_ints_off(struct NCR_ESP *esp)
515 static void pmaz_dma_ints_on(struct NCR_ESP *esp)
519 static void pmaz_dma_setup(struct NCR_ESP *esp, u32 addr, int count, int write)
522 * DMA_ST_WRITE means "move data from device to memory"
523 * so when (write) is true, it actually means READ!
526 pmaz_dma_init_read(esp, addr, count);
528 pmaz_dma_init_write(esp, addr, count);
531 static void pmaz_dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp)
533 sp->SCp.ptr = (char *)virt_to_phys(sp->request_buffer);