1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (c) 2014 Hannes Reinecke, SUSE Linux GmbH
7 #include <linux/kernel.h>
8 #include <linux/module.h>
9 #include <linux/init.h>
10 #include <linux/delay.h>
11 #include <linux/pci.h>
12 #include <linux/interrupt.h>
14 #include <scsi/scsi_host.h>
18 #define DRV_MODULE_NAME "am53c974"
19 #define DRV_MODULE_VERSION "1.00"
21 static bool am53c974_debug
;
22 static bool am53c974_fenab
= true;
24 #define esp_dma_log(f, a...) \
27 shost_printk(KERN_DEBUG, esp->host, f, ##a); \
30 #define ESP_DMA_CMD 0x10
31 #define ESP_DMA_STC 0x11
32 #define ESP_DMA_SPA 0x12
33 #define ESP_DMA_WBC 0x13
34 #define ESP_DMA_WAC 0x14
35 #define ESP_DMA_STATUS 0x15
36 #define ESP_DMA_SMDLA 0x16
37 #define ESP_DMA_WMAC 0x17
39 #define ESP_DMA_CMD_IDLE 0x00
40 #define ESP_DMA_CMD_BLAST 0x01
41 #define ESP_DMA_CMD_ABORT 0x02
42 #define ESP_DMA_CMD_START 0x03
43 #define ESP_DMA_CMD_MASK 0x03
44 #define ESP_DMA_CMD_DIAG 0x04
45 #define ESP_DMA_CMD_MDL 0x10
46 #define ESP_DMA_CMD_INTE_P 0x20
47 #define ESP_DMA_CMD_INTE_D 0x40
48 #define ESP_DMA_CMD_DIR 0x80
50 #define ESP_DMA_STAT_PWDN 0x01
51 #define ESP_DMA_STAT_ERROR 0x02
52 #define ESP_DMA_STAT_ABORT 0x04
53 #define ESP_DMA_STAT_DONE 0x08
54 #define ESP_DMA_STAT_SCSIINT 0x10
55 #define ESP_DMA_STAT_BCMPLT 0x20
57 /* EEPROM is accessed with 16-bit values */
58 #define DC390_EEPROM_READ 0x80
59 #define DC390_EEPROM_LEN 0x40
64 * 8 * 4 bytes of per-device options
65 * followed by HBA specific options
68 /* Per-device options */
69 #define DC390_EE_MODE1 0x00
70 #define DC390_EE_SPEED 0x01
72 /* HBA-specific options */
73 #define DC390_EE_ADAPT_SCSI_ID 0x40
74 #define DC390_EE_MODE2 0x41
75 #define DC390_EE_DELAY 0x42
76 #define DC390_EE_TAG_CMD_NUM 0x43
78 #define DC390_EE_MODE1_PARITY_CHK 0x01
79 #define DC390_EE_MODE1_SYNC_NEGO 0x02
80 #define DC390_EE_MODE1_EN_DISC 0x04
81 #define DC390_EE_MODE1_SEND_START 0x08
82 #define DC390_EE_MODE1_TCQ 0x10
84 #define DC390_EE_MODE2_MORE_2DRV 0x01
85 #define DC390_EE_MODE2_GREATER_1G 0x02
86 #define DC390_EE_MODE2_RST_SCSI_BUS 0x04
87 #define DC390_EE_MODE2_ACTIVE_NEGATION 0x08
88 #define DC390_EE_MODE2_NO_SEEK 0x10
89 #define DC390_EE_MODE2_LUN_CHECK 0x20
96 static void pci_esp_dma_drain(struct esp
*esp
);
98 static inline struct pci_esp_priv
*pci_esp_get_priv(struct esp
*esp
)
100 return dev_get_drvdata(esp
->dev
);
103 static void pci_esp_write8(struct esp
*esp
, u8 val
, unsigned long reg
)
105 iowrite8(val
, esp
->regs
+ (reg
* 4UL));
108 static u8
pci_esp_read8(struct esp
*esp
, unsigned long reg
)
110 return ioread8(esp
->regs
+ (reg
* 4UL));
113 static void pci_esp_write32(struct esp
*esp
, u32 val
, unsigned long reg
)
115 return iowrite32(val
, esp
->regs
+ (reg
* 4UL));
118 static int pci_esp_irq_pending(struct esp
*esp
)
120 struct pci_esp_priv
*pep
= pci_esp_get_priv(esp
);
122 pep
->dma_status
= pci_esp_read8(esp
, ESP_DMA_STATUS
);
123 esp_dma_log("dma intr dreg[%02x]\n", pep
->dma_status
);
125 if (pep
->dma_status
& (ESP_DMA_STAT_ERROR
|
128 ESP_DMA_STAT_SCSIINT
))
134 static void pci_esp_reset_dma(struct esp
*esp
)
136 /* Nothing to do ? */
139 static void pci_esp_dma_drain(struct esp
*esp
)
145 if ((esp
->sreg
& ESP_STAT_PMASK
) == ESP_DOP
||
146 (esp
->sreg
& ESP_STAT_PMASK
) == ESP_DIP
)
147 /* Data-In or Data-Out, nothing to be done */
151 resid
= pci_esp_read8(esp
, ESP_FFLAGS
) & ESP_FF_FBYTES
;
158 * When there is a residual BCMPLT will never be set
159 * (obviously). But we still have to issue the BLAST
160 * command, otherwise the data will not being transferred.
161 * But we'll never know when the BLAST operation is
162 * finished. So check for some time and give up eventually.
165 pci_esp_write8(esp
, ESP_DMA_CMD_DIR
| ESP_DMA_CMD_BLAST
, ESP_DMA_CMD
);
166 while (pci_esp_read8(esp
, ESP_DMA_STATUS
) & ESP_DMA_STAT_BCMPLT
) {
171 pci_esp_write8(esp
, ESP_DMA_CMD_DIR
| ESP_DMA_CMD_IDLE
, ESP_DMA_CMD
);
172 esp_dma_log("DMA blast done (%d tries, %d bytes left)\n", lim
, resid
);
173 /* BLAST residual handling is currently untested */
174 if (WARN_ON_ONCE(resid
== 1)) {
175 struct esp_cmd_entry
*ent
= esp
->active_cmd
;
177 ent
->flags
|= ESP_CMD_FLAG_RESIDUAL
;
181 static void pci_esp_dma_invalidate(struct esp
*esp
)
183 struct pci_esp_priv
*pep
= pci_esp_get_priv(esp
);
185 esp_dma_log("invalidate DMA\n");
187 pci_esp_write8(esp
, ESP_DMA_CMD_IDLE
, ESP_DMA_CMD
);
191 static int pci_esp_dma_error(struct esp
*esp
)
193 struct pci_esp_priv
*pep
= pci_esp_get_priv(esp
);
195 if (pep
->dma_status
& ESP_DMA_STAT_ERROR
) {
196 u8 dma_cmd
= pci_esp_read8(esp
, ESP_DMA_CMD
);
198 if ((dma_cmd
& ESP_DMA_CMD_MASK
) == ESP_DMA_CMD_START
)
199 pci_esp_write8(esp
, ESP_DMA_CMD_ABORT
, ESP_DMA_CMD
);
203 if (pep
->dma_status
& ESP_DMA_STAT_ABORT
) {
204 pci_esp_write8(esp
, ESP_DMA_CMD_IDLE
, ESP_DMA_CMD
);
205 pep
->dma_status
= pci_esp_read8(esp
, ESP_DMA_CMD
);
211 static void pci_esp_send_dma_cmd(struct esp
*esp
, u32 addr
, u32 esp_count
,
212 u32 dma_count
, int write
, u8 cmd
)
214 struct pci_esp_priv
*pep
= pci_esp_get_priv(esp
);
217 BUG_ON(!(cmd
& ESP_CMD_DMA
));
221 /* Set DMA engine to IDLE */
223 /* DMA write direction logic is inverted */
224 val
|= ESP_DMA_CMD_DIR
;
225 pci_esp_write8(esp
, ESP_DMA_CMD_IDLE
| val
, ESP_DMA_CMD
);
227 pci_esp_write8(esp
, (esp_count
>> 0) & 0xff, ESP_TCLOW
);
228 pci_esp_write8(esp
, (esp_count
>> 8) & 0xff, ESP_TCMED
);
229 if (esp
->config2
& ESP_CONFIG2_FENAB
)
230 pci_esp_write8(esp
, (esp_count
>> 16) & 0xff, ESP_TCHI
);
232 pci_esp_write32(esp
, esp_count
, ESP_DMA_STC
);
233 pci_esp_write32(esp
, addr
, ESP_DMA_SPA
);
235 esp_dma_log("start dma addr[%x] count[%d:%d]\n",
236 addr
, esp_count
, dma_count
);
238 scsi_esp_cmd(esp
, cmd
);
239 /* Send DMA Start command */
240 pci_esp_write8(esp
, ESP_DMA_CMD_START
| val
, ESP_DMA_CMD
);
243 static u32
pci_esp_dma_length_limit(struct esp
*esp
, u32 dma_addr
, u32 dma_len
)
249 * If CONFIG2_FENAB is set we can
250 * handle up to 24 bit addresses
252 if (esp
->config2
& ESP_CONFIG2_FENAB
)
255 if (dma_len
> (1U << dma_limit
))
256 dma_len
= (1U << dma_limit
);
259 * Prevent crossing a 24-bit address boundary.
261 base
= dma_addr
& ((1U << 24) - 1U);
262 end
= base
+ dma_len
;
263 if (end
> (1U << 24))
265 dma_len
= end
- base
;
270 static const struct esp_driver_ops pci_esp_ops
= {
271 .esp_write8
= pci_esp_write8
,
272 .esp_read8
= pci_esp_read8
,
273 .irq_pending
= pci_esp_irq_pending
,
274 .reset_dma
= pci_esp_reset_dma
,
275 .dma_drain
= pci_esp_dma_drain
,
276 .dma_invalidate
= pci_esp_dma_invalidate
,
277 .send_dma_cmd
= pci_esp_send_dma_cmd
,
278 .dma_error
= pci_esp_dma_error
,
279 .dma_length_limit
= pci_esp_dma_length_limit
,
285 static void dc390_eeprom_prepare_read(struct pci_dev
*pdev
, u8 cmd
)
287 u8 carry_flag
= 1, j
= 0x80, bval
;
290 for (i
= 0; i
< 9; i
++) {
292 pci_write_config_byte(pdev
, 0x80, 0x40);
298 pci_write_config_byte(pdev
, 0x80, bval
);
300 pci_write_config_byte(pdev
, 0x80, 0);
303 carry_flag
= (cmd
& j
) ? 1 : 0;
308 static u16
dc390_eeprom_get_data(struct pci_dev
*pdev
)
314 for (i
= 0; i
< 16; i
++) {
317 pci_write_config_byte(pdev
, 0x80, 0x80);
319 pci_write_config_byte(pdev
, 0x80, 0x40);
321 pci_read_config_byte(pdev
, 0x00, &bval
);
330 static void dc390_read_eeprom(struct pci_dev
*pdev
, u16
*ptr
)
332 u8 cmd
= DC390_EEPROM_READ
, i
;
334 for (i
= 0; i
< DC390_EEPROM_LEN
; i
++) {
335 pci_write_config_byte(pdev
, 0xc0, 0);
338 dc390_eeprom_prepare_read(pdev
, cmd
++);
339 *ptr
++ = dc390_eeprom_get_data(pdev
);
341 pci_write_config_byte(pdev
, 0x80, 0);
342 pci_write_config_byte(pdev
, 0x80, 0);
347 static void dc390_check_eeprom(struct esp
*esp
)
349 struct pci_dev
*pdev
= to_pci_dev(esp
->dev
);
351 u16
*ptr
= (u16
*)EEbuf
, wval
= 0;
354 dc390_read_eeprom(pdev
, ptr
);
356 for (i
= 0; i
< DC390_EEPROM_LEN
; i
++, ptr
++)
359 /* no Tekram EEprom found */
360 if (wval
!= 0x1234) {
361 dev_printk(KERN_INFO
, &pdev
->dev
,
362 "No valid Tekram EEprom found\n");
365 esp
->scsi_id
= EEbuf
[DC390_EE_ADAPT_SCSI_ID
];
366 esp
->num_tags
= 2 << EEbuf
[DC390_EE_TAG_CMD_NUM
];
367 if (EEbuf
[DC390_EE_MODE2
] & DC390_EE_MODE2_ACTIVE_NEGATION
)
368 esp
->config4
|= ESP_CONFIG4_RADE
| ESP_CONFIG4_RAE
;
371 static int pci_esp_probe_one(struct pci_dev
*pdev
,
372 const struct pci_device_id
*id
)
374 struct scsi_host_template
*hostt
= &scsi_esp_template
;
376 struct Scsi_Host
*shost
;
378 struct pci_esp_priv
*pep
;
380 if (pci_enable_device(pdev
)) {
381 dev_printk(KERN_INFO
, &pdev
->dev
, "cannot enable device\n");
385 if (dma_set_mask(&pdev
->dev
, DMA_BIT_MASK(32))) {
386 dev_printk(KERN_INFO
, &pdev
->dev
,
387 "failed to set 32bit DMA mask\n");
388 goto fail_disable_device
;
391 shost
= scsi_host_alloc(hostt
, sizeof(struct esp
));
393 dev_printk(KERN_INFO
, &pdev
->dev
,
394 "failed to allocate scsi host\n");
396 goto fail_disable_device
;
399 pep
= kzalloc(sizeof(struct pci_esp_priv
), GFP_KERNEL
);
401 dev_printk(KERN_INFO
, &pdev
->dev
,
402 "failed to allocate esp_priv\n");
404 goto fail_host_alloc
;
407 esp
= shost_priv(shost
);
409 esp
->dev
= &pdev
->dev
;
410 esp
->ops
= &pci_esp_ops
;
412 * The am53c974 HBA has a design flaw of generating
413 * spurious DMA completion interrupts when using
414 * DMA for command submission.
416 esp
->flags
|= ESP_FLAG_USE_FIFO
;
418 * Enable CONFIG2_FENAB to allow for large DMA transfers
421 esp
->config2
|= ESP_CONFIG2_FENAB
;
425 if (pci_request_regions(pdev
, DRV_MODULE_NAME
)) {
426 dev_printk(KERN_ERR
, &pdev
->dev
,
427 "pci memory selection failed\n");
428 goto fail_priv_alloc
;
431 esp
->regs
= pci_iomap(pdev
, 0, pci_resource_len(pdev
, 0));
433 dev_printk(KERN_ERR
, &pdev
->dev
, "pci I/O map failed\n");
435 goto fail_release_regions
;
437 esp
->dma_regs
= esp
->regs
;
439 pci_set_master(pdev
);
441 esp
->command_block
= dma_alloc_coherent(&pdev
->dev
, 16,
442 &esp
->command_block_dma
, GFP_KERNEL
);
443 if (!esp
->command_block
) {
444 dev_printk(KERN_ERR
, &pdev
->dev
,
445 "failed to allocate command block\n");
447 goto fail_unmap_regs
;
450 pci_set_drvdata(pdev
, pep
);
452 err
= request_irq(pdev
->irq
, scsi_esp_intr
, IRQF_SHARED
,
453 DRV_MODULE_NAME
, esp
);
455 dev_printk(KERN_ERR
, &pdev
->dev
, "failed to register IRQ\n");
456 goto fail_unmap_command_block
;
460 dc390_check_eeprom(esp
);
462 shost
->this_id
= esp
->scsi_id
;
464 shost
->irq
= pdev
->irq
;
465 shost
->io_port
= pci_resource_start(pdev
, 0);
466 shost
->n_io_port
= pci_resource_len(pdev
, 0);
467 shost
->unique_id
= shost
->io_port
;
468 esp
->scsi_id_mask
= (1 << esp
->scsi_id
);
469 /* Assume 40MHz clock */
470 esp
->cfreq
= 40000000;
472 err
= scsi_esp_register(esp
);
479 free_irq(pdev
->irq
, esp
);
480 fail_unmap_command_block
:
481 pci_set_drvdata(pdev
, NULL
);
482 dma_free_coherent(&pdev
->dev
, 16, esp
->command_block
,
483 esp
->command_block_dma
);
485 pci_iounmap(pdev
, esp
->regs
);
486 fail_release_regions
:
487 pci_release_regions(pdev
);
491 scsi_host_put(shost
);
493 pci_disable_device(pdev
);
498 static void pci_esp_remove_one(struct pci_dev
*pdev
)
500 struct pci_esp_priv
*pep
= pci_get_drvdata(pdev
);
501 struct esp
*esp
= pep
->esp
;
503 scsi_esp_unregister(esp
);
504 free_irq(pdev
->irq
, esp
);
505 pci_set_drvdata(pdev
, NULL
);
506 dma_free_coherent(&pdev
->dev
, 16, esp
->command_block
,
507 esp
->command_block_dma
);
508 pci_iounmap(pdev
, esp
->regs
);
509 pci_release_regions(pdev
);
510 pci_disable_device(pdev
);
513 scsi_host_put(esp
->host
);
516 static struct pci_device_id am53c974_pci_tbl
[] = {
517 { PCI_VENDOR_ID_AMD
, PCI_DEVICE_ID_AMD_SCSI
,
518 PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0 },
521 MODULE_DEVICE_TABLE(pci
, am53c974_pci_tbl
);
523 static struct pci_driver am53c974_driver
= {
524 .name
= DRV_MODULE_NAME
,
525 .id_table
= am53c974_pci_tbl
,
526 .probe
= pci_esp_probe_one
,
527 .remove
= pci_esp_remove_one
,
530 module_pci_driver(am53c974_driver
);
532 MODULE_DESCRIPTION("AM53C974 SCSI driver");
533 MODULE_AUTHOR("Hannes Reinecke <hare@suse.de>");
534 MODULE_LICENSE("GPL");
535 MODULE_VERSION(DRV_MODULE_VERSION
);
536 MODULE_ALIAS("tmscsim");
538 module_param(am53c974_debug
, bool, 0644);
539 MODULE_PARM_DESC(am53c974_debug
, "Enable debugging");
541 module_param(am53c974_fenab
, bool, 0444);
542 MODULE_PARM_DESC(am53c974_fenab
, "Enable 24-bit DMA transfer sizes");