]> nv-tegra.nvidia Code Review - linux-2.6.git/blob - drivers/ata/sata_sx4.c
[libata] Remove ->irq_ack() hook, and ata_dummy_irq_on()
[linux-2.6.git] / drivers / ata / sata_sx4.c
1 /*
2  *  sata_sx4.c - Promise SATA
3  *
4  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com>
5  *                  Please ALWAYS copy linux-ide@vger.kernel.org
6  *                  on emails.
7  *
8  *  Copyright 2003-2004 Red Hat, Inc.
9  *
10  *
11  *  This program is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2, or (at your option)
14  *  any later version.
15  *
16  *  This program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; see the file COPYING.  If not, write to
23  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24  *
25  *
26  *  libata documentation is available via 'make {ps|pdf}docs',
27  *  as Documentation/DocBook/libata.*
28  *
29  *  Hardware documentation available under NDA.
30  *
31  */
32
33 /*
34         Theory of operation
35         -------------------
36
37         The SX4 (PDC20621) chip features a single Host DMA (HDMA) copy
38         engine, DIMM memory, and four ATA engines (one per SATA port).
39         Data is copied to/from DIMM memory by the HDMA engine, before
40         handing off to one (or more) of the ATA engines.  The ATA
41         engines operate solely on DIMM memory.
42
43         The SX4 behaves like a PATA chip, with no SATA controls or
44         knowledge whatsoever, leading to the presumption that
45         PATA<->SATA bridges exist on SX4 boards, external to the
46         PDC20621 chip itself.
47
48         The chip is quite capable, supporting an XOR engine and linked
49         hardware commands (permits a string to transactions to be
50         submitted and waited-on as a single unit), and an optional
51         microprocessor.
52
53         The limiting factor is largely software.  This Linux driver was
54         written to multiplex the single HDMA engine to copy disk
55         transactions into a fixed DIMM memory space, from where an ATA
56         engine takes over.  As a result, each WRITE looks like this:
57
58                 submit HDMA packet to hardware
59                 hardware copies data from system memory to DIMM
60                 hardware raises interrupt
61
62                 submit ATA packet to hardware
63                 hardware executes ATA WRITE command, w/ data in DIMM
64                 hardware raises interrupt
65         
66         and each READ looks like this:
67
68                 submit ATA packet to hardware
69                 hardware executes ATA READ command, w/ data in DIMM
70                 hardware raises interrupt
71         
72                 submit HDMA packet to hardware
73                 hardware copies data from DIMM to system memory
74                 hardware raises interrupt
75
76         This is a very slow, lock-step way of doing things that can
77         certainly be improved by motivated kernel hackers.
78
79  */
80
81 #include <linux/kernel.h>
82 #include <linux/module.h>
83 #include <linux/pci.h>
84 #include <linux/init.h>
85 #include <linux/blkdev.h>
86 #include <linux/delay.h>
87 #include <linux/interrupt.h>
88 #include <linux/device.h>
89 #include <scsi/scsi_host.h>
90 #include <scsi/scsi_cmnd.h>
91 #include <linux/libata.h>
92 #include "sata_promise.h"
93
94 #define DRV_NAME        "sata_sx4"
95 #define DRV_VERSION     "0.12"
96
97
98 enum {
99         PDC_MMIO_BAR            = 3,
100         PDC_DIMM_BAR            = 4,
101
102         PDC_PRD_TBL             = 0x44, /* Direct command DMA table addr */
103
104         PDC_PKT_SUBMIT          = 0x40, /* Command packet pointer addr */
105         PDC_HDMA_PKT_SUBMIT     = 0x100, /* Host DMA packet pointer addr */
106         PDC_INT_SEQMASK         = 0x40, /* Mask of asserted SEQ INTs */
107         PDC_HDMA_CTLSTAT        = 0x12C, /* Host DMA control / status */
108
109         PDC_CTLSTAT             = 0x60, /* IDEn control / status */
110
111         PDC_20621_SEQCTL        = 0x400,
112         PDC_20621_SEQMASK       = 0x480,
113         PDC_20621_GENERAL_CTL   = 0x484,
114         PDC_20621_PAGE_SIZE     = (32 * 1024),
115
116         /* chosen, not constant, values; we design our own DIMM mem map */
117         PDC_20621_DIMM_WINDOW   = 0x0C, /* page# for 32K DIMM window */
118         PDC_20621_DIMM_BASE     = 0x00200000,
119         PDC_20621_DIMM_DATA     = (64 * 1024),
120         PDC_DIMM_DATA_STEP      = (256 * 1024),
121         PDC_DIMM_WINDOW_STEP    = (8 * 1024),
122         PDC_DIMM_HOST_PRD       = (6 * 1024),
123         PDC_DIMM_HOST_PKT       = (128 * 0),
124         PDC_DIMM_HPKT_PRD       = (128 * 1),
125         PDC_DIMM_ATA_PKT        = (128 * 2),
126         PDC_DIMM_APKT_PRD       = (128 * 3),
127         PDC_DIMM_HEADER_SZ      = PDC_DIMM_APKT_PRD + 128,
128         PDC_PAGE_WINDOW         = 0x40,
129         PDC_PAGE_DATA           = PDC_PAGE_WINDOW +
130                                   (PDC_20621_DIMM_DATA / PDC_20621_PAGE_SIZE),
131         PDC_PAGE_SET            = PDC_DIMM_DATA_STEP / PDC_20621_PAGE_SIZE,
132
133         PDC_CHIP0_OFS           = 0xC0000, /* offset of chip #0 */
134
135         PDC_20621_ERR_MASK      = (1<<19) | (1<<20) | (1<<21) | (1<<22) |
136                                   (1<<23),
137
138         board_20621             = 0,    /* FastTrak S150 SX4 */
139
140         PDC_MASK_INT            = (1 << 10), /* HDMA/ATA mask int */
141         PDC_RESET               = (1 << 11), /* HDMA/ATA reset */
142         PDC_DMA_ENABLE          = (1 << 7),  /* DMA start/stop */
143
144         PDC_MAX_HDMA            = 32,
145         PDC_HDMA_Q_MASK         = (PDC_MAX_HDMA - 1),
146
147         PDC_DIMM0_SPD_DEV_ADDRESS       = 0x50,
148         PDC_DIMM1_SPD_DEV_ADDRESS       = 0x51,
149         PDC_I2C_CONTROL                 = 0x48,
150         PDC_I2C_ADDR_DATA               = 0x4C,
151         PDC_DIMM0_CONTROL               = 0x80,
152         PDC_DIMM1_CONTROL               = 0x84,
153         PDC_SDRAM_CONTROL               = 0x88,
154         PDC_I2C_WRITE                   = 0,            /* master -> slave */
155         PDC_I2C_READ                    = (1 << 6),     /* master <- slave */
156         PDC_I2C_START                   = (1 << 7),     /* start I2C proto */
157         PDC_I2C_MASK_INT                = (1 << 5),     /* mask I2C interrupt */
158         PDC_I2C_COMPLETE                = (1 << 16),    /* I2C normal compl. */
159         PDC_I2C_NO_ACK                  = (1 << 20),    /* slave no-ack addr */
160         PDC_DIMM_SPD_SUBADDRESS_START   = 0x00,
161         PDC_DIMM_SPD_SUBADDRESS_END     = 0x7F,
162         PDC_DIMM_SPD_ROW_NUM            = 3,
163         PDC_DIMM_SPD_COLUMN_NUM         = 4,
164         PDC_DIMM_SPD_MODULE_ROW         = 5,
165         PDC_DIMM_SPD_TYPE               = 11,
166         PDC_DIMM_SPD_FRESH_RATE         = 12,
167         PDC_DIMM_SPD_BANK_NUM           = 17,
168         PDC_DIMM_SPD_CAS_LATENCY        = 18,
169         PDC_DIMM_SPD_ATTRIBUTE          = 21,
170         PDC_DIMM_SPD_ROW_PRE_CHARGE     = 27,
171         PDC_DIMM_SPD_ROW_ACTIVE_DELAY   = 28,
172         PDC_DIMM_SPD_RAS_CAS_DELAY      = 29,
173         PDC_DIMM_SPD_ACTIVE_PRECHARGE   = 30,
174         PDC_DIMM_SPD_SYSTEM_FREQ        = 126,
175         PDC_CTL_STATUS                  = 0x08,
176         PDC_DIMM_WINDOW_CTLR            = 0x0C,
177         PDC_TIME_CONTROL                = 0x3C,
178         PDC_TIME_PERIOD                 = 0x40,
179         PDC_TIME_COUNTER                = 0x44,
180         PDC_GENERAL_CTLR                = 0x484,
181         PCI_PLL_INIT                    = 0x8A531824,
182         PCI_X_TCOUNT                    = 0xEE1E5CFF,
183
184         /* PDC_TIME_CONTROL bits */
185         PDC_TIMER_BUZZER                = (1 << 10),
186         PDC_TIMER_MODE_PERIODIC         = 0,            /* bits 9:8 == 00 */
187         PDC_TIMER_MODE_ONCE             = (1 << 8),     /* bits 9:8 == 01 */
188         PDC_TIMER_ENABLE                = (1 << 7),
189         PDC_TIMER_MASK_INT              = (1 << 5),
190         PDC_TIMER_SEQ_MASK              = 0x1f,         /* SEQ ID for timer */
191         PDC_TIMER_DEFAULT               = PDC_TIMER_MODE_ONCE |
192                                           PDC_TIMER_ENABLE |
193                                           PDC_TIMER_MASK_INT,
194 };
195
196
197 struct pdc_port_priv {
198         u8                      dimm_buf[(ATA_PRD_SZ * ATA_MAX_PRD) + 512];
199         u8                      *pkt;
200         dma_addr_t              pkt_dma;
201 };
202
203 struct pdc_host_priv {
204         unsigned int            doing_hdma;
205         unsigned int            hdma_prod;
206         unsigned int            hdma_cons;
207         struct {
208                 struct ata_queued_cmd *qc;
209                 unsigned int    seq;
210                 unsigned long   pkt_ofs;
211         } hdma[32];
212 };
213
214
215 static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
216 static void pdc_eng_timeout(struct ata_port *ap);
217 static void pdc_20621_phy_reset (struct ata_port *ap);
218 static int pdc_port_start(struct ata_port *ap);
219 static void pdc20621_qc_prep(struct ata_queued_cmd *qc);
220 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
221 static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
222 static unsigned int pdc20621_dimm_init(struct ata_host *host);
223 static int pdc20621_detect_dimm(struct ata_host *host);
224 static unsigned int pdc20621_i2c_read(struct ata_host *host,
225                                       u32 device, u32 subaddr, u32 *pdata);
226 static int pdc20621_prog_dimm0(struct ata_host *host);
227 static unsigned int pdc20621_prog_dimm_global(struct ata_host *host);
228 #ifdef ATA_VERBOSE_DEBUG
229 static void pdc20621_get_from_dimm(struct ata_host *host,
230                                    void *psource, u32 offset, u32 size);
231 #endif
232 static void pdc20621_put_to_dimm(struct ata_host *host,
233                                  void *psource, u32 offset, u32 size);
234 static void pdc20621_irq_clear(struct ata_port *ap);
235 static unsigned int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc);
236
237
238 static struct scsi_host_template pdc_sata_sht = {
239         .module                 = THIS_MODULE,
240         .name                   = DRV_NAME,
241         .ioctl                  = ata_scsi_ioctl,
242         .queuecommand           = ata_scsi_queuecmd,
243         .can_queue              = ATA_DEF_QUEUE,
244         .this_id                = ATA_SHT_THIS_ID,
245         .sg_tablesize           = LIBATA_MAX_PRD,
246         .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
247         .emulated               = ATA_SHT_EMULATED,
248         .use_clustering         = ATA_SHT_USE_CLUSTERING,
249         .proc_name              = DRV_NAME,
250         .dma_boundary           = ATA_DMA_BOUNDARY,
251         .slave_configure        = ata_scsi_slave_config,
252         .slave_destroy          = ata_scsi_slave_destroy,
253         .bios_param             = ata_std_bios_param,
254 };
255
256 static const struct ata_port_operations pdc_20621_ops = {
257         .port_disable           = ata_port_disable,
258         .tf_load                = pdc_tf_load_mmio,
259         .tf_read                = ata_tf_read,
260         .check_status           = ata_check_status,
261         .exec_command           = pdc_exec_command_mmio,
262         .dev_select             = ata_std_dev_select,
263         .phy_reset              = pdc_20621_phy_reset,
264         .qc_prep                = pdc20621_qc_prep,
265         .qc_issue               = pdc20621_qc_issue_prot,
266         .data_xfer              = ata_data_xfer,
267         .eng_timeout            = pdc_eng_timeout,
268         .irq_clear              = pdc20621_irq_clear,
269         .irq_on                 = ata_irq_on,
270         .port_start             = pdc_port_start,
271 };
272
273 static const struct ata_port_info pdc_port_info[] = {
274         /* board_20621 */
275         {
276                 .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
277                                   ATA_FLAG_SRST | ATA_FLAG_MMIO |
278                                   ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING,
279                 .pio_mask       = 0x1f, /* pio0-4 */
280                 .mwdma_mask     = 0x07, /* mwdma0-2 */
281                 .udma_mask      = ATA_UDMA6,
282                 .port_ops       = &pdc_20621_ops,
283         },
284
285 };
286
287 static const struct pci_device_id pdc_sata_pci_tbl[] = {
288         { PCI_VDEVICE(PROMISE, 0x6622), board_20621 },
289
290         { }     /* terminate list */
291 };
292
293 static struct pci_driver pdc_sata_pci_driver = {
294         .name                   = DRV_NAME,
295         .id_table               = pdc_sata_pci_tbl,
296         .probe                  = pdc_sata_init_one,
297         .remove                 = ata_pci_remove_one,
298 };
299
300
301 static int pdc_port_start(struct ata_port *ap)
302 {
303         struct device *dev = ap->host->dev;
304         struct pdc_port_priv *pp;
305         int rc;
306
307         rc = ata_port_start(ap);
308         if (rc)
309                 return rc;
310
311         pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
312         if (!pp)
313                 return -ENOMEM;
314
315         pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
316         if (!pp->pkt)
317                 return -ENOMEM;
318
319         ap->private_data = pp;
320
321         return 0;
322 }
323
324 static void pdc_20621_phy_reset (struct ata_port *ap)
325 {
326         VPRINTK("ENTER\n");
327         ap->cbl = ATA_CBL_SATA;
328         ata_port_probe(ap);
329         ata_bus_reset(ap);
330 }
331
332 static inline void pdc20621_ata_sg(struct ata_taskfile *tf, u8 *buf,
333                                            unsigned int portno,
334                                            unsigned int total_len)
335 {
336         u32 addr;
337         unsigned int dw = PDC_DIMM_APKT_PRD >> 2;
338         u32 *buf32 = (u32 *) buf;
339
340         /* output ATA packet S/G table */
341         addr = PDC_20621_DIMM_BASE + PDC_20621_DIMM_DATA +
342                (PDC_DIMM_DATA_STEP * portno);
343         VPRINTK("ATA sg addr 0x%x, %d\n", addr, addr);
344         buf32[dw] = cpu_to_le32(addr);
345         buf32[dw + 1] = cpu_to_le32(total_len | ATA_PRD_EOT);
346
347         VPRINTK("ATA PSG @ %x == (0x%x, 0x%x)\n",
348                 PDC_20621_DIMM_BASE +
349                        (PDC_DIMM_WINDOW_STEP * portno) +
350                        PDC_DIMM_APKT_PRD,
351                 buf32[dw], buf32[dw + 1]);
352 }
353
354 static inline void pdc20621_host_sg(struct ata_taskfile *tf, u8 *buf,
355                                             unsigned int portno,
356                                             unsigned int total_len)
357 {
358         u32 addr;
359         unsigned int dw = PDC_DIMM_HPKT_PRD >> 2;
360         u32 *buf32 = (u32 *) buf;
361
362         /* output Host DMA packet S/G table */
363         addr = PDC_20621_DIMM_BASE + PDC_20621_DIMM_DATA +
364                (PDC_DIMM_DATA_STEP * portno);
365
366         buf32[dw] = cpu_to_le32(addr);
367         buf32[dw + 1] = cpu_to_le32(total_len | ATA_PRD_EOT);
368
369         VPRINTK("HOST PSG @ %x == (0x%x, 0x%x)\n",
370                 PDC_20621_DIMM_BASE +
371                        (PDC_DIMM_WINDOW_STEP * portno) +
372                        PDC_DIMM_HPKT_PRD,
373                 buf32[dw], buf32[dw + 1]);
374 }
375
376 static inline unsigned int pdc20621_ata_pkt(struct ata_taskfile *tf,
377                                             unsigned int devno, u8 *buf,
378                                             unsigned int portno)
379 {
380         unsigned int i, dw;
381         u32 *buf32 = (u32 *) buf;
382         u8 dev_reg;
383
384         unsigned int dimm_sg = PDC_20621_DIMM_BASE +
385                                (PDC_DIMM_WINDOW_STEP * portno) +
386                                PDC_DIMM_APKT_PRD;
387         VPRINTK("ENTER, dimm_sg == 0x%x, %d\n", dimm_sg, dimm_sg);
388
389         i = PDC_DIMM_ATA_PKT;
390
391         /*
392          * Set up ATA packet
393          */
394         if ((tf->protocol == ATA_PROT_DMA) && (!(tf->flags & ATA_TFLAG_WRITE)))
395                 buf[i++] = PDC_PKT_READ;
396         else if (tf->protocol == ATA_PROT_NODATA)
397                 buf[i++] = PDC_PKT_NODATA;
398         else
399                 buf[i++] = 0;
400         buf[i++] = 0;                   /* reserved */
401         buf[i++] = portno + 1;          /* seq. id */
402         buf[i++] = 0xff;                /* delay seq. id */
403
404         /* dimm dma S/G, and next-pkt */
405         dw = i >> 2;
406         if (tf->protocol == ATA_PROT_NODATA)
407                 buf32[dw] = 0;
408         else
409                 buf32[dw] = cpu_to_le32(dimm_sg);
410         buf32[dw + 1] = 0;
411         i += 8;
412
413         if (devno == 0)
414                 dev_reg = ATA_DEVICE_OBS;
415         else
416                 dev_reg = ATA_DEVICE_OBS | ATA_DEV1;
417
418         /* select device */
419         buf[i++] = (1 << 5) | PDC_PKT_CLEAR_BSY | ATA_REG_DEVICE;
420         buf[i++] = dev_reg;
421
422         /* device control register */
423         buf[i++] = (1 << 5) | PDC_REG_DEVCTL;
424         buf[i++] = tf->ctl;
425
426         return i;
427 }
428
429 static inline void pdc20621_host_pkt(struct ata_taskfile *tf, u8 *buf,
430                                      unsigned int portno)
431 {
432         unsigned int dw;
433         u32 tmp, *buf32 = (u32 *) buf;
434
435         unsigned int host_sg = PDC_20621_DIMM_BASE +
436                                (PDC_DIMM_WINDOW_STEP * portno) +
437                                PDC_DIMM_HOST_PRD;
438         unsigned int dimm_sg = PDC_20621_DIMM_BASE +
439                                (PDC_DIMM_WINDOW_STEP * portno) +
440                                PDC_DIMM_HPKT_PRD;
441         VPRINTK("ENTER, dimm_sg == 0x%x, %d\n", dimm_sg, dimm_sg);
442         VPRINTK("host_sg == 0x%x, %d\n", host_sg, host_sg);
443
444         dw = PDC_DIMM_HOST_PKT >> 2;
445
446         /*
447          * Set up Host DMA packet
448          */
449         if ((tf->protocol == ATA_PROT_DMA) && (!(tf->flags & ATA_TFLAG_WRITE)))
450                 tmp = PDC_PKT_READ;
451         else
452                 tmp = 0;
453         tmp |= ((portno + 1 + 4) << 16);        /* seq. id */
454         tmp |= (0xff << 24);                    /* delay seq. id */
455         buf32[dw + 0] = cpu_to_le32(tmp);
456         buf32[dw + 1] = cpu_to_le32(host_sg);
457         buf32[dw + 2] = cpu_to_le32(dimm_sg);
458         buf32[dw + 3] = 0;
459
460         VPRINTK("HOST PKT @ %x == (0x%x 0x%x 0x%x 0x%x)\n",
461                 PDC_20621_DIMM_BASE + (PDC_DIMM_WINDOW_STEP * portno) +
462                         PDC_DIMM_HOST_PKT,
463                 buf32[dw + 0],
464                 buf32[dw + 1],
465                 buf32[dw + 2],
466                 buf32[dw + 3]);
467 }
468
469 static void pdc20621_dma_prep(struct ata_queued_cmd *qc)
470 {
471         struct scatterlist *sg;
472         struct ata_port *ap = qc->ap;
473         struct pdc_port_priv *pp = ap->private_data;
474         void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR];
475         void __iomem *dimm_mmio = ap->host->iomap[PDC_DIMM_BAR];
476         unsigned int portno = ap->port_no;
477         unsigned int i, idx, total_len = 0, sgt_len;
478         u32 *buf = (u32 *) &pp->dimm_buf[PDC_DIMM_HEADER_SZ];
479
480         WARN_ON(!(qc->flags & ATA_QCFLAG_DMAMAP));
481
482         VPRINTK("ata%u: ENTER\n", ap->print_id);
483
484         /* hard-code chip #0 */
485         mmio += PDC_CHIP0_OFS;
486
487         /*
488          * Build S/G table
489          */
490         idx = 0;
491         ata_for_each_sg(sg, qc) {
492                 buf[idx++] = cpu_to_le32(sg_dma_address(sg));
493                 buf[idx++] = cpu_to_le32(sg_dma_len(sg));
494                 total_len += sg_dma_len(sg);
495         }
496         buf[idx - 1] |= cpu_to_le32(ATA_PRD_EOT);
497         sgt_len = idx * 4;
498
499         /*
500          * Build ATA, host DMA packets
501          */
502         pdc20621_host_sg(&qc->tf, &pp->dimm_buf[0], portno, total_len);
503         pdc20621_host_pkt(&qc->tf, &pp->dimm_buf[0], portno);
504
505         pdc20621_ata_sg(&qc->tf, &pp->dimm_buf[0], portno, total_len);
506         i = pdc20621_ata_pkt(&qc->tf, qc->dev->devno, &pp->dimm_buf[0], portno);
507
508         if (qc->tf.flags & ATA_TFLAG_LBA48)
509                 i = pdc_prep_lba48(&qc->tf, &pp->dimm_buf[0], i);
510         else
511                 i = pdc_prep_lba28(&qc->tf, &pp->dimm_buf[0], i);
512
513         pdc_pkt_footer(&qc->tf, &pp->dimm_buf[0], i);
514
515         /* copy three S/G tables and two packets to DIMM MMIO window */
516         memcpy_toio(dimm_mmio + (portno * PDC_DIMM_WINDOW_STEP),
517                     &pp->dimm_buf, PDC_DIMM_HEADER_SZ);
518         memcpy_toio(dimm_mmio + (portno * PDC_DIMM_WINDOW_STEP) +
519                     PDC_DIMM_HOST_PRD,
520                     &pp->dimm_buf[PDC_DIMM_HEADER_SZ], sgt_len);
521
522         /* force host FIFO dump */
523         writel(0x00000001, mmio + PDC_20621_GENERAL_CTL);
524
525         readl(dimm_mmio);       /* MMIO PCI posting flush */
526
527         VPRINTK("ata pkt buf ofs %u, prd size %u, mmio copied\n", i, sgt_len);
528 }
529
530 static void pdc20621_nodata_prep(struct ata_queued_cmd *qc)
531 {
532         struct ata_port *ap = qc->ap;
533         struct pdc_port_priv *pp = ap->private_data;
534         void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR];
535         void __iomem *dimm_mmio = ap->host->iomap[PDC_DIMM_BAR];
536         unsigned int portno = ap->port_no;
537         unsigned int i;
538
539         VPRINTK("ata%u: ENTER\n", ap->print_id);
540
541         /* hard-code chip #0 */
542         mmio += PDC_CHIP0_OFS;
543
544         i = pdc20621_ata_pkt(&qc->tf, qc->dev->devno, &pp->dimm_buf[0], portno);
545
546         if (qc->tf.flags & ATA_TFLAG_LBA48)
547                 i = pdc_prep_lba48(&qc->tf, &pp->dimm_buf[0], i);
548         else
549                 i = pdc_prep_lba28(&qc->tf, &pp->dimm_buf[0], i);
550
551         pdc_pkt_footer(&qc->tf, &pp->dimm_buf[0], i);
552
553         /* copy three S/G tables and two packets to DIMM MMIO window */
554         memcpy_toio(dimm_mmio + (portno * PDC_DIMM_WINDOW_STEP),
555                     &pp->dimm_buf, PDC_DIMM_HEADER_SZ);
556
557         /* force host FIFO dump */
558         writel(0x00000001, mmio + PDC_20621_GENERAL_CTL);
559
560         readl(dimm_mmio);       /* MMIO PCI posting flush */
561
562         VPRINTK("ata pkt buf ofs %u, mmio copied\n", i);
563 }
564
565 static void pdc20621_qc_prep(struct ata_queued_cmd *qc)
566 {
567         switch (qc->tf.protocol) {
568         case ATA_PROT_DMA:
569                 pdc20621_dma_prep(qc);
570                 break;
571         case ATA_PROT_NODATA:
572                 pdc20621_nodata_prep(qc);
573                 break;
574         default:
575                 break;
576         }
577 }
578
579 static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
580                                  unsigned int seq,
581                                  u32 pkt_ofs)
582 {
583         struct ata_port *ap = qc->ap;
584         struct ata_host *host = ap->host;
585         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
586
587         /* hard-code chip #0 */
588         mmio += PDC_CHIP0_OFS;
589
590         writel(0x00000001, mmio + PDC_20621_SEQCTL + (seq * 4));
591         readl(mmio + PDC_20621_SEQCTL + (seq * 4));     /* flush */
592
593         writel(pkt_ofs, mmio + PDC_HDMA_PKT_SUBMIT);
594         readl(mmio + PDC_HDMA_PKT_SUBMIT);      /* flush */
595 }
596
597 static void pdc20621_push_hdma(struct ata_queued_cmd *qc,
598                                 unsigned int seq,
599                                 u32 pkt_ofs)
600 {
601         struct ata_port *ap = qc->ap;
602         struct pdc_host_priv *pp = ap->host->private_data;
603         unsigned int idx = pp->hdma_prod & PDC_HDMA_Q_MASK;
604
605         if (!pp->doing_hdma) {
606                 __pdc20621_push_hdma(qc, seq, pkt_ofs);
607                 pp->doing_hdma = 1;
608                 return;
609         }
610
611         pp->hdma[idx].qc = qc;
612         pp->hdma[idx].seq = seq;
613         pp->hdma[idx].pkt_ofs = pkt_ofs;
614         pp->hdma_prod++;
615 }
616
617 static void pdc20621_pop_hdma(struct ata_queued_cmd *qc)
618 {
619         struct ata_port *ap = qc->ap;
620         struct pdc_host_priv *pp = ap->host->private_data;
621         unsigned int idx = pp->hdma_cons & PDC_HDMA_Q_MASK;
622
623         /* if nothing on queue, we're done */
624         if (pp->hdma_prod == pp->hdma_cons) {
625                 pp->doing_hdma = 0;
626                 return;
627         }
628
629         __pdc20621_push_hdma(pp->hdma[idx].qc, pp->hdma[idx].seq,
630                              pp->hdma[idx].pkt_ofs);
631         pp->hdma_cons++;
632 }
633
634 #ifdef ATA_VERBOSE_DEBUG
635 static void pdc20621_dump_hdma(struct ata_queued_cmd *qc)
636 {
637         struct ata_port *ap = qc->ap;
638         unsigned int port_no = ap->port_no;
639         void __iomem *dimm_mmio = ap->host->iomap[PDC_DIMM_BAR];
640
641         dimm_mmio += (port_no * PDC_DIMM_WINDOW_STEP);
642         dimm_mmio += PDC_DIMM_HOST_PKT;
643
644         printk(KERN_ERR "HDMA[0] == 0x%08X\n", readl(dimm_mmio));
645         printk(KERN_ERR "HDMA[1] == 0x%08X\n", readl(dimm_mmio + 4));
646         printk(KERN_ERR "HDMA[2] == 0x%08X\n", readl(dimm_mmio + 8));
647         printk(KERN_ERR "HDMA[3] == 0x%08X\n", readl(dimm_mmio + 12));
648 }
649 #else
650 static inline void pdc20621_dump_hdma(struct ata_queued_cmd *qc) { }
651 #endif /* ATA_VERBOSE_DEBUG */
652
653 static void pdc20621_packet_start(struct ata_queued_cmd *qc)
654 {
655         struct ata_port *ap = qc->ap;
656         struct ata_host *host = ap->host;
657         unsigned int port_no = ap->port_no;
658         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
659         unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
660         u8 seq = (u8) (port_no + 1);
661         unsigned int port_ofs;
662
663         /* hard-code chip #0 */
664         mmio += PDC_CHIP0_OFS;
665
666         VPRINTK("ata%u: ENTER\n", ap->print_id);
667
668         wmb();                  /* flush PRD, pkt writes */
669
670         port_ofs = PDC_20621_DIMM_BASE + (PDC_DIMM_WINDOW_STEP * port_no);
671
672         /* if writing, we (1) DMA to DIMM, then (2) do ATA command */
673         if (rw && qc->tf.protocol == ATA_PROT_DMA) {
674                 seq += 4;
675
676                 pdc20621_dump_hdma(qc);
677                 pdc20621_push_hdma(qc, seq, port_ofs + PDC_DIMM_HOST_PKT);
678                 VPRINTK("queued ofs 0x%x (%u), seq %u\n",
679                         port_ofs + PDC_DIMM_HOST_PKT,
680                         port_ofs + PDC_DIMM_HOST_PKT,
681                         seq);
682         } else {
683                 writel(0x00000001, mmio + PDC_20621_SEQCTL + (seq * 4));
684                 readl(mmio + PDC_20621_SEQCTL + (seq * 4));     /* flush */
685
686                 writel(port_ofs + PDC_DIMM_ATA_PKT,
687                        ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
688                 readl(ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
689                 VPRINTK("submitted ofs 0x%x (%u), seq %u\n",
690                         port_ofs + PDC_DIMM_ATA_PKT,
691                         port_ofs + PDC_DIMM_ATA_PKT,
692                         seq);
693         }
694 }
695
696 static unsigned int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc)
697 {
698         switch (qc->tf.protocol) {
699         case ATA_PROT_DMA:
700         case ATA_PROT_NODATA:
701                 pdc20621_packet_start(qc);
702                 return 0;
703
704         case ATA_PROT_ATAPI_DMA:
705                 BUG();
706                 break;
707
708         default:
709                 break;
710         }
711
712         return ata_qc_issue_prot(qc);
713 }
714
715 static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
716                                           struct ata_queued_cmd *qc,
717                                           unsigned int doing_hdma,
718                                           void __iomem *mmio)
719 {
720         unsigned int port_no = ap->port_no;
721         unsigned int port_ofs =
722                 PDC_20621_DIMM_BASE + (PDC_DIMM_WINDOW_STEP * port_no);
723         u8 status;
724         unsigned int handled = 0;
725
726         VPRINTK("ENTER\n");
727
728         if ((qc->tf.protocol == ATA_PROT_DMA) &&        /* read */
729             (!(qc->tf.flags & ATA_TFLAG_WRITE))) {
730
731                 /* step two - DMA from DIMM to host */
732                 if (doing_hdma) {
733                         VPRINTK("ata%u: read hdma, 0x%x 0x%x\n", ap->print_id,
734                                 readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
735                         /* get drive status; clear intr; complete txn */
736                         qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
737                         ata_qc_complete(qc);
738                         pdc20621_pop_hdma(qc);
739                 }
740
741                 /* step one - exec ATA command */
742                 else {
743                         u8 seq = (u8) (port_no + 1 + 4);
744                         VPRINTK("ata%u: read ata, 0x%x 0x%x\n", ap->print_id,
745                                 readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
746
747                         /* submit hdma pkt */
748                         pdc20621_dump_hdma(qc);
749                         pdc20621_push_hdma(qc, seq,
750                                            port_ofs + PDC_DIMM_HOST_PKT);
751                 }
752                 handled = 1;
753
754         } else if (qc->tf.protocol == ATA_PROT_DMA) {   /* write */
755
756                 /* step one - DMA from host to DIMM */
757                 if (doing_hdma) {
758                         u8 seq = (u8) (port_no + 1);
759                         VPRINTK("ata%u: write hdma, 0x%x 0x%x\n", ap->print_id,
760                                 readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
761
762                         /* submit ata pkt */
763                         writel(0x00000001, mmio + PDC_20621_SEQCTL + (seq * 4));
764                         readl(mmio + PDC_20621_SEQCTL + (seq * 4));
765                         writel(port_ofs + PDC_DIMM_ATA_PKT,
766                                ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
767                         readl(ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
768                 }
769
770                 /* step two - execute ATA command */
771                 else {
772                         VPRINTK("ata%u: write ata, 0x%x 0x%x\n", ap->print_id,
773                                 readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
774                         /* get drive status; clear intr; complete txn */
775                         qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
776                         ata_qc_complete(qc);
777                         pdc20621_pop_hdma(qc);
778                 }
779                 handled = 1;
780
781         /* command completion, but no data xfer */
782         } else if (qc->tf.protocol == ATA_PROT_NODATA) {
783
784                 status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
785                 DPRINTK("BUS_NODATA (drv_stat 0x%X)\n", status);
786                 qc->err_mask |= ac_err_mask(status);
787                 ata_qc_complete(qc);
788                 handled = 1;
789
790         } else {
791                 ap->stats.idle_irq++;
792         }
793
794         return handled;
795 }
796
797 static void pdc20621_irq_clear(struct ata_port *ap)
798 {
799         struct ata_host *host = ap->host;
800         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
801
802         mmio += PDC_CHIP0_OFS;
803
804         readl(mmio + PDC_20621_SEQMASK);
805 }
806
807 static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance)
808 {
809         struct ata_host *host = dev_instance;
810         struct ata_port *ap;
811         u32 mask = 0;
812         unsigned int i, tmp, port_no;
813         unsigned int handled = 0;
814         void __iomem *mmio_base;
815
816         VPRINTK("ENTER\n");
817
818         if (!host || !host->iomap[PDC_MMIO_BAR]) {
819                 VPRINTK("QUICK EXIT\n");
820                 return IRQ_NONE;
821         }
822
823         mmio_base = host->iomap[PDC_MMIO_BAR];
824
825         /* reading should also clear interrupts */
826         mmio_base += PDC_CHIP0_OFS;
827         mask = readl(mmio_base + PDC_20621_SEQMASK);
828         VPRINTK("mask == 0x%x\n", mask);
829
830         if (mask == 0xffffffff) {
831                 VPRINTK("QUICK EXIT 2\n");
832                 return IRQ_NONE;
833         }
834         mask &= 0xffff;         /* only 16 tags possible */
835         if (!mask) {
836                 VPRINTK("QUICK EXIT 3\n");
837                 return IRQ_NONE;
838         }
839
840         spin_lock(&host->lock);
841
842         for (i = 1; i < 9; i++) {
843                 port_no = i - 1;
844                 if (port_no > 3)
845                         port_no -= 4;
846                 if (port_no >= host->n_ports)
847                         ap = NULL;
848                 else
849                         ap = host->ports[port_no];
850                 tmp = mask & (1 << i);
851                 VPRINTK("seq %u, port_no %u, ap %p, tmp %x\n", i, port_no, ap, tmp);
852                 if (tmp && ap &&
853                     !(ap->flags & ATA_FLAG_DISABLED)) {
854                         struct ata_queued_cmd *qc;
855
856                         qc = ata_qc_from_tag(ap, ap->link.active_tag);
857                         if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
858                                 handled += pdc20621_host_intr(ap, qc, (i > 4),
859                                                               mmio_base);
860                 }
861         }
862
863         spin_unlock(&host->lock);
864
865         VPRINTK("mask == 0x%x\n", mask);
866
867         VPRINTK("EXIT\n");
868
869         return IRQ_RETVAL(handled);
870 }
871
872 static void pdc_eng_timeout(struct ata_port *ap)
873 {
874         u8 drv_stat;
875         struct ata_host *host = ap->host;
876         struct ata_queued_cmd *qc;
877         unsigned long flags;
878
879         DPRINTK("ENTER\n");
880
881         spin_lock_irqsave(&host->lock, flags);
882
883         qc = ata_qc_from_tag(ap, ap->link.active_tag);
884
885         switch (qc->tf.protocol) {
886         case ATA_PROT_DMA:
887         case ATA_PROT_NODATA:
888                 ata_port_printk(ap, KERN_ERR, "command timeout\n");
889                 qc->err_mask |= __ac_err_mask(ata_wait_idle(ap));
890                 break;
891
892         default:
893                 drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
894
895                 ata_port_printk(ap, KERN_ERR,
896                                 "unknown timeout, cmd 0x%x stat 0x%x\n",
897                                 qc->tf.command, drv_stat);
898
899                 qc->err_mask |= ac_err_mask(drv_stat);
900                 break;
901         }
902
903         spin_unlock_irqrestore(&host->lock, flags);
904         ata_eh_qc_complete(qc);
905         DPRINTK("EXIT\n");
906 }
907
908 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
909 {
910         WARN_ON (tf->protocol == ATA_PROT_DMA ||
911                  tf->protocol == ATA_PROT_NODATA);
912         ata_tf_load(ap, tf);
913 }
914
915
916 static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
917 {
918         WARN_ON (tf->protocol == ATA_PROT_DMA ||
919                  tf->protocol == ATA_PROT_NODATA);
920         ata_exec_command(ap, tf);
921 }
922
923
924 static void pdc_sata_setup_port(struct ata_ioports *port, void __iomem *base)
925 {
926         port->cmd_addr          = base;
927         port->data_addr         = base;
928         port->feature_addr      =
929         port->error_addr        = base + 0x4;
930         port->nsect_addr        = base + 0x8;
931         port->lbal_addr         = base + 0xc;
932         port->lbam_addr         = base + 0x10;
933         port->lbah_addr         = base + 0x14;
934         port->device_addr       = base + 0x18;
935         port->command_addr      =
936         port->status_addr       = base + 0x1c;
937         port->altstatus_addr    =
938         port->ctl_addr          = base + 0x38;
939 }
940
941
942 #ifdef ATA_VERBOSE_DEBUG
943 static void pdc20621_get_from_dimm(struct ata_host *host, void *psource,
944                                    u32 offset, u32 size)
945 {
946         u32 window_size;
947         u16 idx;
948         u8 page_mask;
949         long dist;
950         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
951         void __iomem *dimm_mmio = host->iomap[PDC_DIMM_BAR];
952
953         /* hard-code chip #0 */
954         mmio += PDC_CHIP0_OFS;
955
956         page_mask = 0x00;
957         window_size = 0x2000 * 4; /* 32K byte uchar size */
958         idx = (u16) (offset / window_size);
959
960         writel(0x01, mmio + PDC_GENERAL_CTLR);
961         readl(mmio + PDC_GENERAL_CTLR);
962         writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
963         readl(mmio + PDC_DIMM_WINDOW_CTLR);
964
965         offset -= (idx * window_size);
966         idx++;
967         dist = ((long) (window_size - (offset + size))) >= 0 ? size :
968                 (long) (window_size - offset);
969         memcpy_fromio((char *) psource, (char *) (dimm_mmio + offset / 4),
970                       dist);
971
972         psource += dist;
973         size -= dist;
974         for (; (long) size >= (long) window_size ;) {
975                 writel(0x01, mmio + PDC_GENERAL_CTLR);
976                 readl(mmio + PDC_GENERAL_CTLR);
977                 writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
978                 readl(mmio + PDC_DIMM_WINDOW_CTLR);
979                 memcpy_fromio((char *) psource, (char *) (dimm_mmio),
980                               window_size / 4);
981                 psource += window_size;
982                 size -= window_size;
983                 idx ++;
984         }
985
986         if (size) {
987                 writel(0x01, mmio + PDC_GENERAL_CTLR);
988                 readl(mmio + PDC_GENERAL_CTLR);
989                 writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
990                 readl(mmio + PDC_DIMM_WINDOW_CTLR);
991                 memcpy_fromio((char *) psource, (char *) (dimm_mmio),
992                               size / 4);
993         }
994 }
995 #endif
996
997
998 static void pdc20621_put_to_dimm(struct ata_host *host, void *psource,
999                                  u32 offset, u32 size)
1000 {
1001         u32 window_size;
1002         u16 idx;
1003         u8 page_mask;
1004         long dist;
1005         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
1006         void __iomem *dimm_mmio = host->iomap[PDC_DIMM_BAR];
1007
1008         /* hard-code chip #0 */
1009         mmio += PDC_CHIP0_OFS;
1010
1011         page_mask = 0x00;
1012         window_size = 0x2000 * 4;       /* 32K byte uchar size */
1013         idx = (u16) (offset / window_size);
1014
1015         writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
1016         readl(mmio + PDC_DIMM_WINDOW_CTLR);
1017         offset -= (idx * window_size);
1018         idx++;
1019         dist = ((long)(s32)(window_size - (offset + size))) >= 0 ? size :
1020                 (long) (window_size - offset);
1021         memcpy_toio(dimm_mmio + offset / 4, psource, dist);
1022         writel(0x01, mmio + PDC_GENERAL_CTLR);
1023         readl(mmio + PDC_GENERAL_CTLR);
1024
1025         psource += dist;
1026         size -= dist;
1027         for (; (long) size >= (long) window_size ;) {
1028                 writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
1029                 readl(mmio + PDC_DIMM_WINDOW_CTLR);
1030                 memcpy_toio(dimm_mmio, psource, window_size / 4);
1031                 writel(0x01, mmio + PDC_GENERAL_CTLR);
1032                 readl(mmio + PDC_GENERAL_CTLR);
1033                 psource += window_size;
1034                 size -= window_size;
1035                 idx ++;
1036         }
1037
1038         if (size) {
1039                 writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
1040                 readl(mmio + PDC_DIMM_WINDOW_CTLR);
1041                 memcpy_toio(dimm_mmio, psource, size / 4);
1042                 writel(0x01, mmio + PDC_GENERAL_CTLR);
1043                 readl(mmio + PDC_GENERAL_CTLR);
1044         }
1045 }
1046
1047
1048 static unsigned int pdc20621_i2c_read(struct ata_host *host, u32 device,
1049                                       u32 subaddr, u32 *pdata)
1050 {
1051         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
1052         u32 i2creg  = 0;
1053         u32 status;
1054         u32 count =0;
1055
1056         /* hard-code chip #0 */
1057         mmio += PDC_CHIP0_OFS;
1058
1059         i2creg |= device << 24;
1060         i2creg |= subaddr << 16;
1061
1062         /* Set the device and subaddress */
1063         writel(i2creg, mmio + PDC_I2C_ADDR_DATA);
1064         readl(mmio + PDC_I2C_ADDR_DATA);
1065
1066         /* Write Control to perform read operation, mask int */
1067         writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT,
1068                mmio + PDC_I2C_CONTROL);
1069
1070         for (count = 0; count <= 1000; count ++) {
1071                 status = readl(mmio + PDC_I2C_CONTROL);
1072                 if (status & PDC_I2C_COMPLETE) {
1073                         status = readl(mmio + PDC_I2C_ADDR_DATA);
1074                         break;
1075                 } else if (count == 1000)
1076                         return 0;
1077         }
1078
1079         *pdata = (status >> 8) & 0x000000ff;
1080         return 1;
1081 }
1082
1083
1084 static int pdc20621_detect_dimm(struct ata_host *host)
1085 {
1086         u32 data=0 ;
1087         if (pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS,
1088                              PDC_DIMM_SPD_SYSTEM_FREQ, &data)) {
1089                 if (data == 100)
1090                         return 100;
1091         } else
1092                 return 0;
1093
1094         if (pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS, 9, &data)) {
1095                 if(data <= 0x75)
1096                         return 133;
1097         } else
1098                 return 0;
1099
1100         return 0;
1101 }
1102
1103
1104 static int pdc20621_prog_dimm0(struct ata_host *host)
1105 {
1106         u32 spd0[50];
1107         u32 data = 0;
1108         int size, i;
1109         u8 bdimmsize;
1110         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
1111         static const struct {
1112                 unsigned int reg;
1113                 unsigned int ofs;
1114         } pdc_i2c_read_data [] = {
1115                 { PDC_DIMM_SPD_TYPE, 11 },
1116                 { PDC_DIMM_SPD_FRESH_RATE, 12 },
1117                 { PDC_DIMM_SPD_COLUMN_NUM, 4 },
1118                 { PDC_DIMM_SPD_ATTRIBUTE, 21 },
1119                 { PDC_DIMM_SPD_ROW_NUM, 3 },
1120                 { PDC_DIMM_SPD_BANK_NUM, 17 },
1121                 { PDC_DIMM_SPD_MODULE_ROW, 5 },
1122                 { PDC_DIMM_SPD_ROW_PRE_CHARGE, 27 },
1123                 { PDC_DIMM_SPD_ROW_ACTIVE_DELAY, 28 },
1124                 { PDC_DIMM_SPD_RAS_CAS_DELAY, 29 },
1125                 { PDC_DIMM_SPD_ACTIVE_PRECHARGE, 30 },
1126                 { PDC_DIMM_SPD_CAS_LATENCY, 18 },
1127         };
1128
1129         /* hard-code chip #0 */
1130         mmio += PDC_CHIP0_OFS;
1131
1132         for(i=0; i<ARRAY_SIZE(pdc_i2c_read_data); i++)
1133                 pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS,
1134                                   pdc_i2c_read_data[i].reg,
1135                                   &spd0[pdc_i2c_read_data[i].ofs]);
1136
1137         data |= (spd0[4] - 8) | ((spd0[21] != 0) << 3) | ((spd0[3]-11) << 4);
1138         data |= ((spd0[17] / 4) << 6) | ((spd0[5] / 2) << 7) |
1139                 ((((spd0[27] + 9) / 10) - 1) << 8) ;
1140         data |= (((((spd0[29] > spd0[28])
1141                     ? spd0[29] : spd0[28]) + 9) / 10) - 1) << 10;
1142         data |= ((spd0[30] - spd0[29] + 9) / 10 - 2) << 12;
1143
1144         if (spd0[18] & 0x08)
1145                 data |= ((0x03) << 14);
1146         else if (spd0[18] & 0x04)
1147                 data |= ((0x02) << 14);
1148         else if (spd0[18] & 0x01)
1149                 data |= ((0x01) << 14);
1150         else
1151                 data |= (0 << 14);
1152
1153         /*
1154            Calculate the size of bDIMMSize (power of 2) and
1155            merge the DIMM size by program start/end address.
1156         */
1157
1158         bdimmsize = spd0[4] + (spd0[5] / 2) + spd0[3] + (spd0[17] / 2) + 3;
1159         size = (1 << bdimmsize) >> 20;  /* size = xxx(MB) */
1160         data |= (((size / 16) - 1) << 16);
1161         data |= (0 << 23);
1162         data |= 8;
1163         writel(data, mmio + PDC_DIMM0_CONTROL);
1164         readl(mmio + PDC_DIMM0_CONTROL);
1165         return size;
1166 }
1167
1168
1169 static unsigned int pdc20621_prog_dimm_global(struct ata_host *host)
1170 {
1171         u32 data, spd0;
1172         int error, i;
1173         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
1174
1175         /* hard-code chip #0 */
1176         mmio += PDC_CHIP0_OFS;
1177
1178         /*
1179           Set To Default : DIMM Module Global Control Register (0x022259F1)
1180           DIMM Arbitration Disable (bit 20)
1181           DIMM Data/Control Output Driving Selection (bit12 - bit15)
1182           Refresh Enable (bit 17)
1183         */
1184
1185         data = 0x022259F1;
1186         writel(data, mmio + PDC_SDRAM_CONTROL);
1187         readl(mmio + PDC_SDRAM_CONTROL);
1188
1189         /* Turn on for ECC */
1190         pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS,
1191                           PDC_DIMM_SPD_TYPE, &spd0);
1192         if (spd0 == 0x02) {
1193                 data |= (0x01 << 16);
1194                 writel(data, mmio + PDC_SDRAM_CONTROL);
1195                 readl(mmio + PDC_SDRAM_CONTROL);
1196                 printk(KERN_ERR "Local DIMM ECC Enabled\n");
1197         }
1198
1199         /* DIMM Initialization Select/Enable (bit 18/19) */
1200         data &= (~(1<<18));
1201         data |= (1<<19);
1202         writel(data, mmio + PDC_SDRAM_CONTROL);
1203
1204         error = 1;
1205         for (i = 1; i <= 10; i++) {   /* polling ~5 secs */
1206                 data = readl(mmio + PDC_SDRAM_CONTROL);
1207                 if (!(data & (1<<19))) {
1208                         error = 0;
1209                         break;
1210                 }
1211                 msleep(i*100);
1212         }
1213         return error;
1214 }
1215
1216
1217 static unsigned int pdc20621_dimm_init(struct ata_host *host)
1218 {
1219         int speed, size, length;
1220         u32 addr,spd0,pci_status;
1221         u32 tmp=0;
1222         u32 time_period=0;
1223         u32 tcount=0;
1224         u32 ticks=0;
1225         u32 clock=0;
1226         u32 fparam=0;
1227         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
1228
1229         /* hard-code chip #0 */
1230         mmio += PDC_CHIP0_OFS;
1231
1232         /* Initialize PLL based upon PCI Bus Frequency */
1233
1234         /* Initialize Time Period Register */
1235         writel(0xffffffff, mmio + PDC_TIME_PERIOD);
1236         time_period = readl(mmio + PDC_TIME_PERIOD);
1237         VPRINTK("Time Period Register (0x40): 0x%x\n", time_period);
1238
1239         /* Enable timer */
1240         writel(PDC_TIMER_DEFAULT, mmio + PDC_TIME_CONTROL);
1241         readl(mmio + PDC_TIME_CONTROL);
1242
1243         /* Wait 3 seconds */
1244         msleep(3000);
1245
1246         /*
1247            When timer is enabled, counter is decreased every internal
1248            clock cycle.
1249         */
1250
1251         tcount = readl(mmio + PDC_TIME_COUNTER);
1252         VPRINTK("Time Counter Register (0x44): 0x%x\n", tcount);
1253
1254         /*
1255            If SX4 is on PCI-X bus, after 3 seconds, the timer counter
1256            register should be >= (0xffffffff - 3x10^8).
1257         */
1258         if(tcount >= PCI_X_TCOUNT) {
1259                 ticks = (time_period - tcount);
1260                 VPRINTK("Num counters 0x%x (%d)\n", ticks, ticks);
1261
1262                 clock = (ticks / 300000);
1263                 VPRINTK("10 * Internal clk = 0x%x (%d)\n", clock, clock);
1264
1265                 clock = (clock * 33);
1266                 VPRINTK("10 * Internal clk * 33 = 0x%x (%d)\n", clock, clock);
1267
1268                 /* PLL F Param (bit 22:16) */
1269                 fparam = (1400000 / clock) - 2;
1270                 VPRINTK("PLL F Param: 0x%x (%d)\n", fparam, fparam);
1271
1272                 /* OD param = 0x2 (bit 31:30), R param = 0x5 (bit 29:25) */
1273                 pci_status = (0x8a001824 | (fparam << 16));
1274         } else
1275                 pci_status = PCI_PLL_INIT;
1276
1277         /* Initialize PLL. */
1278         VPRINTK("pci_status: 0x%x\n", pci_status);
1279         writel(pci_status, mmio + PDC_CTL_STATUS);
1280         readl(mmio + PDC_CTL_STATUS);
1281
1282         /*
1283            Read SPD of DIMM by I2C interface,
1284            and program the DIMM Module Controller.
1285         */
1286         if (!(speed = pdc20621_detect_dimm(host))) {
1287                 printk(KERN_ERR "Detect Local DIMM Fail\n");
1288                 return 1;       /* DIMM error */
1289         }
1290         VPRINTK("Local DIMM Speed = %d\n", speed);
1291
1292         /* Programming DIMM0 Module Control Register (index_CID0:80h) */
1293         size = pdc20621_prog_dimm0(host);
1294         VPRINTK("Local DIMM Size = %dMB\n",size);
1295
1296         /* Programming DIMM Module Global Control Register (index_CID0:88h) */
1297         if (pdc20621_prog_dimm_global(host)) {
1298                 printk(KERN_ERR "Programming DIMM Module Global Control Register Fail\n");
1299                 return 1;
1300         }
1301
1302 #ifdef ATA_VERBOSE_DEBUG
1303         {
1304                 u8 test_parttern1[40] = {0x55,0xAA,'P','r','o','m','i','s','e',' ',
1305                                 'N','o','t',' ','Y','e','t',' ','D','e','f','i','n','e','d',' ',
1306                                  '1','.','1','0',
1307                                 '9','8','0','3','1','6','1','2',0,0};
1308                 u8 test_parttern2[40] = {0};
1309
1310                 pdc20621_put_to_dimm(host, (void *) test_parttern2, 0x10040, 40);
1311                 pdc20621_put_to_dimm(host, (void *) test_parttern2, 0x40, 40);
1312
1313                 pdc20621_put_to_dimm(host, (void *) test_parttern1, 0x10040, 40);
1314                 pdc20621_get_from_dimm(host, (void *) test_parttern2, 0x40, 40);
1315                 printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0],
1316                        test_parttern2[1], &(test_parttern2[2]));
1317                 pdc20621_get_from_dimm(host, (void *) test_parttern2, 0x10040,
1318                                        40);
1319                 printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0],
1320                        test_parttern2[1], &(test_parttern2[2]));
1321
1322                 pdc20621_put_to_dimm(host, (void *) test_parttern1, 0x40, 40);
1323                 pdc20621_get_from_dimm(host, (void *) test_parttern2, 0x40, 40);
1324                 printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0],
1325                        test_parttern2[1], &(test_parttern2[2]));
1326         }
1327 #endif
1328
1329         /* ECC initiliazation. */
1330
1331         pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS,
1332                           PDC_DIMM_SPD_TYPE, &spd0);
1333         if (spd0 == 0x02) {
1334                 VPRINTK("Start ECC initialization\n");
1335                 addr = 0;
1336                 length = size * 1024 * 1024;
1337                 while (addr < length) {
1338                         pdc20621_put_to_dimm(host, (void *) &tmp, addr,
1339                                              sizeof(u32));
1340                         addr += sizeof(u32);
1341                 }
1342                 VPRINTK("Finish ECC initialization\n");
1343         }
1344         return 0;
1345 }
1346
1347
1348 static void pdc_20621_init(struct ata_host *host)
1349 {
1350         u32 tmp;
1351         void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
1352
1353         /* hard-code chip #0 */
1354         mmio += PDC_CHIP0_OFS;
1355
1356         /*
1357          * Select page 0x40 for our 32k DIMM window
1358          */
1359         tmp = readl(mmio + PDC_20621_DIMM_WINDOW) & 0xffff0000;
1360         tmp |= PDC_PAGE_WINDOW; /* page 40h; arbitrarily selected */
1361         writel(tmp, mmio + PDC_20621_DIMM_WINDOW);
1362
1363         /*
1364          * Reset Host DMA
1365          */
1366         tmp = readl(mmio + PDC_HDMA_CTLSTAT);
1367         tmp |= PDC_RESET;
1368         writel(tmp, mmio + PDC_HDMA_CTLSTAT);
1369         readl(mmio + PDC_HDMA_CTLSTAT);         /* flush */
1370
1371         udelay(10);
1372
1373         tmp = readl(mmio + PDC_HDMA_CTLSTAT);
1374         tmp &= ~PDC_RESET;
1375         writel(tmp, mmio + PDC_HDMA_CTLSTAT);
1376         readl(mmio + PDC_HDMA_CTLSTAT);         /* flush */
1377 }
1378
1379 static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
1380 {
1381         static int printed_version;
1382         const struct ata_port_info *ppi[] =
1383                 { &pdc_port_info[ent->driver_data], NULL };
1384         struct ata_host *host;
1385         void __iomem *base;
1386         struct pdc_host_priv *hpriv;
1387         int rc;
1388
1389         if (!printed_version++)
1390                 dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
1391
1392         /* allocate host */
1393         host = ata_host_alloc_pinfo(&pdev->dev, ppi, 4);
1394         hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
1395         if (!host || !hpriv)
1396                 return -ENOMEM;
1397
1398         host->private_data = hpriv;
1399
1400         /* acquire resources and fill host */
1401         rc = pcim_enable_device(pdev);
1402         if (rc)
1403                 return rc;
1404
1405         rc = pcim_iomap_regions(pdev, (1 << PDC_MMIO_BAR) | (1 << PDC_DIMM_BAR),
1406                                 DRV_NAME);
1407         if (rc == -EBUSY)
1408                 pcim_pin_device(pdev);
1409         if (rc)
1410                 return rc;
1411         host->iomap = pcim_iomap_table(pdev);
1412
1413         base = host->iomap[PDC_MMIO_BAR] + PDC_CHIP0_OFS;
1414         pdc_sata_setup_port(&host->ports[0]->ioaddr, base + 0x200);
1415         pdc_sata_setup_port(&host->ports[1]->ioaddr, base + 0x280);
1416         pdc_sata_setup_port(&host->ports[2]->ioaddr, base + 0x300);
1417         pdc_sata_setup_port(&host->ports[3]->ioaddr, base + 0x380);
1418
1419         /* configure and activate */
1420         rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
1421         if (rc)
1422                 return rc;
1423         rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
1424         if (rc)
1425                 return rc;
1426
1427         if (pdc20621_dimm_init(host))
1428                 return -ENOMEM;
1429         pdc_20621_init(host);
1430
1431         pci_set_master(pdev);
1432         return ata_host_activate(host, pdev->irq, pdc20621_interrupt,
1433                                  IRQF_SHARED, &pdc_sata_sht);
1434 }
1435
1436
1437 static int __init pdc_sata_init(void)
1438 {
1439         return pci_register_driver(&pdc_sata_pci_driver);
1440 }
1441
1442
1443 static void __exit pdc_sata_exit(void)
1444 {
1445         pci_unregister_driver(&pdc_sata_pci_driver);
1446 }
1447
1448
1449 MODULE_AUTHOR("Jeff Garzik");
1450 MODULE_DESCRIPTION("Promise SATA low-level driver");
1451 MODULE_LICENSE("GPL");
1452 MODULE_DEVICE_TABLE(pci, pdc_sata_pci_tbl);
1453 MODULE_VERSION(DRV_VERSION);
1454
1455 module_init(pdc_sata_init);
1456 module_exit(pdc_sata_exit);