OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [ide/] [pci/] [alim15x3.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 * linux/drivers/ide/pci/alim15x3.c             Version 0.17    2003/03/05
3
 *
4
 *  Copyright (C) 1998-2000 Michel Aubry, Maintainer
5
 *  Copyright (C) 1998-2000 Andrzej Krzysztofowicz, Maintainer
6
 *  Copyright (C) 1999-2000 CJ, cjtsai@ali.com.tw, Maintainer
7
 *
8
 *  Copyright (C) 1998-2000 Andre Hedrick (andre@linux-ide.org)
9
 *  May be copied or modified under the terms of the GNU General Public License
10
 *  Copyright (C) 2002 Alan Cox <alan@redhat.com>
11
 *
12
 *  Changes for ALi 156x ported from RH 8.0 driver changes by
13
 *                      Clear Zang
14
 *
15
 *  (U)DMA capable version of ali 1533/1543(C), 1535(D)
16
 *
17
 **********************************************************************
18
 *  9/7/99 --Parts from the above author are included and need to be
19
 *  converted into standard interface, once I finish the thought.
20
 *
21
 *  Recent changes
22
 *      Don't use LBA48 mode on ALi <= 0xC4
23
 *      Don't poke 0x79 with a non ALi northbridge
24
 *      Don't flip undefined bits on newer chipsets (fix Fujitsu laptop hang)
25
 *
26
 *  Documentation
27
 *      Chipset documentation available under NDA only
28
 *
29
 */
30
 
31
#include <linux/config.h>
32
#include <linux/module.h>
33
#include <linux/types.h>
34
#include <linux/kernel.h>
35
#include <linux/pci.h>
36
#include <linux/delay.h>
37
#include <linux/hdreg.h>
38
#include <linux/ide.h>
39
#include <linux/init.h>
40
 
41
#include <asm/io.h>
42
 
43
#include "ide_modes.h"
44
#include "alim15x3.h"
45
 
46
/*
47
 *      ALi devices are not plug in. Otherwise these static values would
48
 *      need to go. They ought to go away anyway
49
 */
50
 
51
static u8 m5229_revision;
52
static u8 chip_is_1543c_e;
53
static struct pci_dev *isa_dev;
54
 
55
#if defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_PROC_FS)
56
#include <linux/stat.h>
57
#include <linux/proc_fs.h>
58
 
59
static u8 ali_proc = 0;
60
 
61
static struct pci_dev *bmide_dev;
62
 
63
static char *fifo[4] = {
64
        "FIFO Off",
65
        "FIFO On ",
66
        "DMA mode",
67
        "PIO mode" };
68
 
69
static char *udmaT[8] = {
70
        "1.5T",
71
        "  2T",
72
        "2.5T",
73
        "  3T",
74
        "3.5T",
75
        "  4T",
76
        "  6T",
77
        "  8T"
78
};
79
 
80
static char *channel_status[8] = {
81
        "OK            ",
82
        "busy          ",
83
        "DRQ           ",
84
        "DRQ busy      ",
85
        "error         ",
86
        "error busy    ",
87
        "error DRQ     ",
88
        "error DRQ busy"
89
};
90
 
91
/**
92
 *      ali_get_info            -       generate proc file for ALi IDE
93
 *      @buffer: buffer to fill
94
 *      @addr: address of user start in buffer
95
 *      @offset: offset into 'file'
96
 *      @count: buffer count
97
 *
98
 *      Walks the Ali devices and outputs summary data on the tuning and
99
 *      anything else that will help with debugging
100
 */
101
 
102
static int ali_get_info (char *buffer, char **addr, off_t offset, int count)
103
{
104
        unsigned long bibma;
105
        u8 reg53h, reg5xh, reg5yh, reg5xh1, reg5yh1, c0, c1, rev, tmp;
106
        char *q, *p = buffer;
107
 
108
        /* fetch rev. */
109
        pci_read_config_byte(bmide_dev, 0x08, &rev);
110
        if (rev >= 0xc1)        /* M1543C or newer */
111
                udmaT[7] = " ???";
112
        else
113
                fifo[3]  = "   ???  ";
114
 
115
        /* first fetch bibma: */
116
 
117
        bibma = pci_resource_start(bmide_dev, 4);
118
 
119
        /*
120
         * at that point bibma+0x2 et bibma+0xa are byte
121
         * registers to investigate:
122
         */
123
        c0 = inb(bibma + 0x02);
124
        c1 = inb(bibma + 0x0a);
125
 
126
        p += sprintf(p,
127
                "\n                                Ali M15x3 Chipset.\n");
128
        p += sprintf(p,
129
                "                                ------------------\n");
130
        pci_read_config_byte(bmide_dev, 0x78, &reg53h);
131
        p += sprintf(p, "PCI Clock: %d.\n", reg53h);
132
 
133
        pci_read_config_byte(bmide_dev, 0x53, &reg53h);
134
        p += sprintf(p,
135
                "CD_ROM FIFO:%s, CD_ROM DMA:%s\n",
136
                (reg53h & 0x02) ? "Yes" : "No ",
137
                (reg53h & 0x01) ? "Yes" : "No " );
138
        pci_read_config_byte(bmide_dev, 0x74, &reg53h);
139
        p += sprintf(p,
140
                "FIFO Status: contains %d Words, runs%s%s\n\n",
141
                (reg53h & 0x3f),
142
                (reg53h & 0x40) ? " OVERWR" : "",
143
                (reg53h & 0x80) ? " OVERRD." : "." );
144
 
145
        p += sprintf(p,
146
                "-------------------primary channel"
147
                "-------------------secondary channel"
148
                "---------\n\n");
149
 
150
        pci_read_config_byte(bmide_dev, 0x09, &reg53h);
151
        p += sprintf(p,
152
                "channel status:       %s"
153
                "                               %s\n",
154
                (reg53h & 0x20) ? "On " : "Off",
155
                (reg53h & 0x10) ? "On " : "Off" );
156
 
157
        p += sprintf(p,
158
                "both channels togth:  %s"
159
                "                               %s\n",
160
                (c0&0x80) ? "No " : "Yes",
161
                (c1&0x80) ? "No " : "Yes" );
162
 
163
        pci_read_config_byte(bmide_dev, 0x76, &reg53h);
164
        p += sprintf(p,
165
                "Channel state:        %s                    %s\n",
166
                channel_status[reg53h & 0x07],
167
                channel_status[(reg53h & 0x70) >> 4] );
168
 
169
        pci_read_config_byte(bmide_dev, 0x58, &reg5xh);
170
        pci_read_config_byte(bmide_dev, 0x5c, &reg5yh);
171
        p += sprintf(p,
172
                "Add. Setup Timing:    %dT"
173
                "                                %dT\n",
174
                (reg5xh & 0x07) ? (reg5xh & 0x07) : 8,
175
                (reg5yh & 0x07) ? (reg5yh & 0x07) : 8 );
176
 
177
        pci_read_config_byte(bmide_dev, 0x59, &reg5xh);
178
        pci_read_config_byte(bmide_dev, 0x5d, &reg5yh);
179
        p += sprintf(p,
180
                "Command Act. Count:   %dT"
181
                "                                %dT\n"
182
                "Command Rec. Count:   %dT"
183
                "                               %dT\n\n",
184
                (reg5xh & 0x70) ? ((reg5xh & 0x70) >> 4) : 8,
185
                (reg5yh & 0x70) ? ((reg5yh & 0x70) >> 4) : 8,
186
                (reg5xh & 0x0f) ? (reg5xh & 0x0f) : 16,
187
                (reg5yh & 0x0f) ? (reg5yh & 0x0f) : 16 );
188
 
189
        p += sprintf(p,
190
                "----------------drive0-----------drive1"
191
                "------------drive0-----------drive1------\n\n");
192
        p += sprintf(p,
193
                "DMA enabled:      %s              %s"
194
                "               %s              %s\n",
195
                (c0&0x20) ? "Yes" : "No ",
196
                (c0&0x40) ? "Yes" : "No ",
197
                (c1&0x20) ? "Yes" : "No ",
198
                (c1&0x40) ? "Yes" : "No " );
199
 
200
        pci_read_config_byte(bmide_dev, 0x54, &reg5xh);
201
        pci_read_config_byte(bmide_dev, 0x55, &reg5yh);
202
        q = "FIFO threshold:   %2d Words         %2d Words"
203
                "          %2d Words         %2d Words\n";
204
        if (rev < 0xc1) {
205
                if ((rev == 0x20) &&
206
                    (pci_read_config_byte(bmide_dev, 0x4f, &tmp), (tmp &= 0x20))) {
207
                        p += sprintf(p, q, 8, 8, 8, 8);
208
                } else {
209
                        p += sprintf(p, q,
210
                                (reg5xh & 0x03) + 12,
211
                                ((reg5xh & 0x30)>>4) + 12,
212
                                (reg5yh & 0x03) + 12,
213
                                ((reg5yh & 0x30)>>4) + 12 );
214
                }
215
        } else {
216
                int t1 = (tmp = (reg5xh & 0x03)) ? (tmp << 3) : 4;
217
                int t2 = (tmp = ((reg5xh & 0x30)>>4)) ? (tmp << 3) : 4;
218
                int t3 = (tmp = (reg5yh & 0x03)) ? (tmp << 3) : 4;
219
                int t4 = (tmp = ((reg5yh & 0x30)>>4)) ? (tmp << 3) : 4;
220
                p += sprintf(p, q, t1, t2, t3, t4);
221
        }
222
 
223
#if 0
224
        p += sprintf(p,
225
                "FIFO threshold:   %2d Words         %2d Words"
226
                "          %2d Words         %2d Words\n",
227
                (reg5xh & 0x03) + 12,
228
                ((reg5xh & 0x30)>>4) + 12,
229
                (reg5yh & 0x03) + 12,
230
                ((reg5yh & 0x30)>>4) + 12 );
231
#endif
232
 
233
        p += sprintf(p,
234
                "FIFO mode:        %s         %s          %s         %s\n",
235
                fifo[((reg5xh & 0x0c) >> 2)],
236
                fifo[((reg5xh & 0xc0) >> 6)],
237
                fifo[((reg5yh & 0x0c) >> 2)],
238
                fifo[((reg5yh & 0xc0) >> 6)] );
239
 
240
        pci_read_config_byte(bmide_dev, 0x5a, &reg5xh);
241
        pci_read_config_byte(bmide_dev, 0x5b, &reg5xh1);
242
        pci_read_config_byte(bmide_dev, 0x5e, &reg5yh);
243
        pci_read_config_byte(bmide_dev, 0x5f, &reg5yh1);
244
 
245
        p += sprintf(p,/*
246
                "------------------drive0-----------drive1"
247
                "------------drive0-----------drive1------\n")*/
248
                "Dt RW act. Cnt    %2dT              %2dT"
249
                "               %2dT              %2dT\n"
250
                "Dt RW rec. Cnt    %2dT              %2dT"
251
                "               %2dT              %2dT\n\n",
252
                (reg5xh & 0x70) ? ((reg5xh & 0x70) >> 4) : 8,
253
                (reg5xh1 & 0x70) ? ((reg5xh1 & 0x70) >> 4) : 8,
254
                (reg5yh & 0x70) ? ((reg5yh & 0x70) >> 4) : 8,
255
                (reg5yh1 & 0x70) ? ((reg5yh1 & 0x70) >> 4) : 8,
256
                (reg5xh & 0x0f) ? (reg5xh & 0x0f) : 16,
257
                (reg5xh1 & 0x0f) ? (reg5xh1 & 0x0f) : 16,
258
                (reg5yh & 0x0f) ? (reg5yh & 0x0f) : 16,
259
                (reg5yh1 & 0x0f) ? (reg5yh1 & 0x0f) : 16 );
260
 
261
        p += sprintf(p,
262
                "-----------------------------------UDMA Timings"
263
                "--------------------------------\n\n");
264
 
265
        pci_read_config_byte(bmide_dev, 0x56, &reg5xh);
266
        pci_read_config_byte(bmide_dev, 0x57, &reg5yh);
267
        p += sprintf(p,
268
                "UDMA:             %s               %s"
269
                "                %s               %s\n"
270
                "UDMA timings:     %s             %s"
271
                "              %s             %s\n\n",
272
                (reg5xh & 0x08) ? "OK" : "No",
273
                (reg5xh & 0x80) ? "OK" : "No",
274
                (reg5yh & 0x08) ? "OK" : "No",
275
                (reg5yh & 0x80) ? "OK" : "No",
276
                udmaT[(reg5xh & 0x07)],
277
                udmaT[(reg5xh & 0x70) >> 4],
278
                udmaT[reg5yh & 0x07],
279
                udmaT[(reg5yh & 0x70) >> 4] );
280
 
281
        return p-buffer; /* => must be less than 4k! */
282
}
283
#endif  /* defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_PROC_FS) */
284
 
285
/**
286
 *      ali15x3_tune_drive      -       set up a drive
287
 *      @drive: drive to tune
288
 *      @pio: unused
289
 *
290
 *      Select the best PIO timing for the drive in question. Then
291
 *      program the controller for this drive set up
292
 */
293
 
294
static void ali15x3_tune_drive (ide_drive_t *drive, u8 pio)
295
{
296
        ide_pio_data_t d;
297
        ide_hwif_t *hwif = HWIF(drive);
298
        struct pci_dev *dev = hwif->pci_dev;
299
        int s_time, a_time, c_time;
300
        u8 s_clc, a_clc, r_clc;
301
        unsigned long flags;
302
        int bus_speed = system_bus_clock();
303
        int port = hwif->channel ? 0x5c : 0x58;
304
        int portFIFO = hwif->channel ? 0x55 : 0x54;
305
        u8 cd_dma_fifo = 0;
306
        int unit = drive->select.b.unit & 1;
307
 
308
        pio = ide_get_best_pio_mode(drive, pio, 5, &d);
309
        s_time = ide_pio_timings[pio].setup_time;
310
        a_time = ide_pio_timings[pio].active_time;
311
        if ((s_clc = (s_time * bus_speed + 999) / 1000) >= 8)
312
                s_clc = 0;
313
        if ((a_clc = (a_time * bus_speed + 999) / 1000) >= 8)
314
                a_clc = 0;
315
        c_time = ide_pio_timings[pio].cycle_time;
316
 
317
#if 0
318
        if ((r_clc = ((c_time - s_time - a_time) * bus_speed + 999) / 1000) >= 16)
319
                r_clc = 0;
320
#endif
321
 
322
        if (!(r_clc = (c_time * bus_speed + 999) / 1000 - a_clc - s_clc)) {
323
                r_clc = 1;
324
        } else {
325
                if (r_clc >= 16)
326
                        r_clc = 0;
327
        }
328
        local_irq_save(flags);
329
 
330
        /*
331
         * PIO mode => ATA FIFO on, ATAPI FIFO off
332
         */
333
        pci_read_config_byte(dev, portFIFO, &cd_dma_fifo);
334
        if (drive->media==ide_disk) {
335
                if (unit) {
336
                        pci_write_config_byte(dev, portFIFO, (cd_dma_fifo & 0x0F) | 0x50);
337
                } else {
338
                        pci_write_config_byte(dev, portFIFO, (cd_dma_fifo & 0xF0) | 0x05);
339
                }
340
        } else {
341
                if (unit) {
342
                        pci_write_config_byte(dev, portFIFO, cd_dma_fifo & 0x0F);
343
                } else {
344
                        pci_write_config_byte(dev, portFIFO, cd_dma_fifo & 0xF0);
345
                }
346
        }
347
 
348
        pci_write_config_byte(dev, port, s_clc);
349
        pci_write_config_byte(dev, port+drive->select.b.unit+2, (a_clc << 4) | r_clc);
350
        local_irq_restore(flags);
351
 
352
        /*
353
         * setup   active  rec
354
         * { 70,   165,    365 },   PIO Mode 0
355
         * { 50,   125,    208 },   PIO Mode 1
356
         * { 30,   100,    110 },   PIO Mode 2
357
         * { 30,   80,     70  },   PIO Mode 3 with IORDY
358
         * { 25,   70,     25  },   PIO Mode 4 with IORDY  ns
359
         * { 20,   50,     30  }    PIO Mode 5 with IORDY (nonstandard)
360
         */
361
 
362
}
363
 
364
/**
365
 *      ali15x3_can_ultra       -       check for ultra DMA support
366
 *      @drive: drive to do the check
367
 *
368
 *      Check the drive and controller revisions. Return 0 if UDMA is
369
 *      not available, or 1 if UDMA can be used. The actual rules for
370
 *      the ALi are
371
 *              No UDMA on revisions <= 0xC1
372
 *              Disk only for revisions < 0xC2
373
 *              Not WDC drives for revisions < 0xC2
374
 *
375
 *      FIXME: WDC ifdef needs to die
376
 */
377
 
378
static u8 ali15x3_can_ultra (ide_drive_t *drive)
379
{
380
#ifndef CONFIG_WDC_ALI15X3
381
        struct hd_driveid *id   = drive->id;
382
#endif /* CONFIG_WDC_ALI15X3 */
383
 
384
        if (m5229_revision < 0xC1) {    /* According to ALi */
385
                return 0;
386
        } else if ((m5229_revision < 0xC2) &&
387
#ifndef CONFIG_WDC_ALI15X3
388
                   ((chip_is_1543c_e && strstr(id->model, "WDC ")) ||
389
                    (drive->media!=ide_disk))) {
390
#else /* CONFIG_WDC_ALI15X3 */
391
                   (drive->media!=ide_disk)) {
392
#endif /* CONFIG_WDC_ALI15X3 */
393
                return 0;
394
        } else {
395
                return 1;
396
        }
397
}
398
 
399
/**
400
 *      ali15x3_ratemask        -       generate DMA mode list
401
 *      @drive: drive to compute against
402
 *
403
 *      Generate a list of the available DMA modes for the drive.
404
 *      FIXME: this function contains lots of bogus masking we can dump
405
 *
406
 *      Return the highest available mode (UDMA33, UDMA66, UDMA100,..)
407
 */
408
 
409
static u8 ali15x3_ratemask (ide_drive_t *drive)
410
{
411
        u8 mode = 0, can_ultra   = ali15x3_can_ultra(drive);
412
 
413
        if (m5229_revision >= 0xC4 && can_ultra) {
414
                mode = 4;
415
        } else if (m5229_revision >= 0xC2 && can_ultra) {
416
                mode = 2;
417
        } else if (can_ultra) {
418
                return 1;
419
        } else {
420
                return 0;
421
        }
422
 
423
        /*
424
         *      If the drive sees no suitable cable then UDMA 33
425
         *      is the highest permitted mode
426
         */
427
 
428
        if (!eighty_ninty_three(drive))
429
                mode = min(mode, (u8)1);
430
        return mode;
431
}
432
 
433
/**
434
 *      ali15x3_tune_chipset    -       set up chiset for new speed
435
 *      @drive: drive to configure for
436
 *      @xferspeed: desired speed
437
 *
438
 *      Configure the hardware for the desired IDE transfer mode.
439
 *      We also do the needed drive configuration through helpers
440
 */
441
 
442
static int ali15x3_tune_chipset (ide_drive_t *drive, u8 xferspeed)
443
{
444
        ide_hwif_t *hwif        = HWIF(drive);
445
        struct pci_dev *dev     = hwif->pci_dev;
446
        u8 speed                = ide_rate_filter(ali15x3_ratemask(drive), xferspeed);
447
        u8 speed1               = speed;
448
        u8 unit                 = (drive->select.b.unit & 0x01);
449
        u8 tmpbyte              = 0x00;
450
        int m5229_udma          = (hwif->channel) ? 0x57 : 0x56;
451
 
452
        if (speed == XFER_UDMA_6)
453
        {
454
                speed1 = 0x47;
455
                if(m5229_revision == 0xC4)
456
                        speed1 --;
457
        }
458
        if (speed < XFER_UDMA_0) {
459
                u8 ultra_enable = (unit) ? 0x7f : 0xf7;
460
                /*
461
                 * clear "ultra enable" bit
462
                 */
463
                pci_read_config_byte(dev, m5229_udma, &tmpbyte);
464
                tmpbyte &= ultra_enable;
465
                pci_write_config_byte(dev, m5229_udma, tmpbyte);
466
 
467
                if (speed < XFER_SW_DMA_0)
468
                        ali15x3_tune_drive(drive, speed);
469
        } else {
470
                pci_read_config_byte(dev, m5229_udma, &tmpbyte);
471
                tmpbyte &= (0x0f << ((1-unit) << 2));
472
                /*
473
                 * enable ultra dma and set timing
474
                 */
475
                tmpbyte |= ((0x08 | ((4-speed1)&0x07)) << (unit << 2));
476
                pci_write_config_byte(dev, m5229_udma, tmpbyte);
477
                if (speed >= XFER_UDMA_3) {
478
                        pci_read_config_byte(dev, 0x4b, &tmpbyte);
479
                        tmpbyte |= 1;
480
                        pci_write_config_byte(dev, 0x4b, tmpbyte);
481
                }
482
        }
483
        return (ide_config_drive_speed(drive, speed));
484
}
485
 
486
 
487
/**
488
 *      config_chipset_for_dma  -       set up DMA mode
489
 *      @drive: drive to configure for
490
 *
491
 *      Place a drive into DMA mode and tune the chipset for
492
 *      the selected speed.
493
 *
494
 *      Returns true if DMA mode can be used
495
 */
496
 
497
static int config_chipset_for_dma (ide_drive_t *drive)
498
{
499
        u8 speed = ide_dma_speed(drive, ali15x3_ratemask(drive));
500
 
501
        if (!(speed))
502
                return 0;
503
 
504
        (void) ali15x3_tune_chipset(drive, speed);
505
        return ide_dma_enable(drive);
506
}
507
 
508
/**
509
 *      ali15x3_config_drive_for_dma    -       configure for DMA
510
 *      @drive: drive to configure
511
 *
512
 *      Configure a drive for DMA operation. If DMA is not possible we
513
 *      drop the drive into PIO mode instead.
514
 *
515
 *      FIXME: exactly what are we trying to return here
516
 */
517
 
518
static int ali15x3_config_drive_for_dma(ide_drive_t *drive)
519
{
520
        ide_hwif_t *hwif        = HWIF(drive);
521
        struct hd_driveid *id   = drive->id;
522
 
523
        if ((m5229_revision<=0x20) && (drive->media!=ide_disk))
524
                return hwif->ide_dma_off_quietly(drive);
525
 
526
        drive->init_speed = 0;
527
 
528
        /* Set reasonable PIO timings first - some of them are needed
529
           for DMA as well. */
530
        hwif->tuneproc(drive, 255);
531
 
532
        if ((id->capability & 1) != 0 && drive->autodma) {
533
                /* Consult the list of known "bad" drives */
534
                if (hwif->ide_dma_bad_drive(drive))
535
                        goto no_dma_set;
536
                if ((id->field_valid & 4) && (m5229_revision >= 0xC2)) {
537
                        if (id->dma_ultra & hwif->ultra_mask) {
538
                                /* Force if Capable UltraDMA */
539
                                int dma = config_chipset_for_dma(drive);
540
                                if ((id->field_valid & 2) && !dma)
541
                                        goto try_dma_modes;
542
                        }
543
                } else if (id->field_valid & 2) {
544
try_dma_modes:
545
                        if ((id->dma_mword & hwif->mwdma_mask) ||
546
                            (id->dma_1word & hwif->swdma_mask)) {
547
                                /* Force if Capable regular DMA modes */
548
                                if (!config_chipset_for_dma(drive))
549
                                        goto no_dma_set;
550
                        }
551
                } else if (hwif->ide_dma_good_drive(drive) &&
552
                           (id->eide_dma_time < 150)) {
553
                        /* Consult the list of known "good" drives */
554
                        if (!config_chipset_for_dma(drive))
555
                                goto no_dma_set;
556
                } else {
557
                        goto no_dma_set;
558
                }
559
        } else {
560
no_dma_set:
561
                return hwif->ide_dma_off_quietly(drive);
562
        }
563
        return hwif->ide_dma_on(drive);
564
}
565
 
566
/**
567
 *      ali15x3_dma_write       -       do a DMA IDE write
568
 *      @drive: drive to issue write for
569
 *
570
 *      Returns 1 if the DMA write cannot be performed, zero on
571
 *      success.
572
 */
573
 
574
static int ali15x3_dma_write (ide_drive_t *drive)
575
{
576
        if ((m5229_revision < 0xC2) && (drive->media != ide_disk))
577
                return 1;       /* try PIO instead of DMA */
578
        return __ide_dma_write(drive);
579
}
580
 
581
/**
582
 *      init_chipset_ali15x3    -       Initialise an ALi IDE controller
583
 *      @dev: PCI device
584
 *      @name: Name of the controller
585
 *
586
 *      This function initializes the ALI IDE controller and where
587
 *      appropriate also sets up the 1533 southbridge.
588
 */
589
 
590
static unsigned int __init init_chipset_ali15x3 (struct pci_dev *dev, const char *name)
591
{
592
        unsigned long flags;
593
        u8 tmpbyte;
594
        struct pci_dev *north = pci_find_slot(0, PCI_DEVFN(0,0));
595
 
596
        pci_read_config_byte(dev, PCI_REVISION_ID, &m5229_revision);
597
 
598
        isa_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL);
599
 
600
#if defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_PROC_FS)
601
        if (!ali_proc) {
602
                ali_proc = 1;
603
                bmide_dev = dev;
604
                ide_pci_register_host_proc(&ali_procs[0]);
605
        }
606
#endif  /* defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_PROC_FS) */
607
 
608
        local_irq_save(flags);
609
 
610
        if (m5229_revision < 0xC2) {
611
                /*
612
                 * revision 0x20 (1543-E, 1543-F)
613
                 * revision 0xC0, 0xC1 (1543C-C, 1543C-D, 1543C-E)
614
                 * clear CD-ROM DMA write bit, m5229, 0x4b, bit 7
615
                 */
616
                pci_read_config_byte(dev, 0x4b, &tmpbyte);
617
                /*
618
                 * clear bit 7
619
                 */
620
                pci_write_config_byte(dev, 0x4b, tmpbyte & 0x7F);
621
                local_irq_restore(flags);
622
                return 0;
623
        }
624
 
625
        /*
626
         * 1543C-B?, 1535, 1535D, 1553
627
         * Note 1: not all "motherboard" support this detection
628
         * Note 2: if no udma 66 device, the detection may "error".
629
         *         but in this case, we will not set the device to
630
         *         ultra 66, the detection result is not important
631
         */
632
 
633
        /*
634
         * enable "Cable Detection", m5229, 0x4b, bit3
635
         */
636
        pci_read_config_byte(dev, 0x4b, &tmpbyte);
637
        pci_write_config_byte(dev, 0x4b, tmpbyte | 0x08);
638
 
639
        /*
640
         * We should only tune the 1533 enable if we are using an ALi
641
         * North bridge. We might have no north found on some zany
642
         * box without a device at 0:0.0. The ALi bridge will be at
643
         * 0:0.0 so if we didn't find one we know what is cooking.
644
         */
645
        if (north && north->vendor != PCI_VENDOR_ID_AL) {
646
                local_irq_restore(flags);
647
                return 0;
648
        }
649
 
650
        if (m5229_revision < 0xC5 && isa_dev)
651
        {
652
                /*
653
                 * set south-bridge's enable bit, m1533, 0x79
654
                 */
655
 
656
                pci_read_config_byte(isa_dev, 0x79, &tmpbyte);
657
                if (m5229_revision == 0xC2) {
658
                        /*
659
                         * 1543C-B0 (m1533, 0x79, bit 2)
660
                         */
661
                        pci_write_config_byte(isa_dev, 0x79, tmpbyte | 0x04);
662
                } else if (m5229_revision >= 0xC3) {
663
                        /*
664
                         * 1553/1535 (m1533, 0x79, bit 1)
665
                         */
666
                        pci_write_config_byte(isa_dev, 0x79, tmpbyte | 0x02);
667
                }
668
        }
669
        local_irq_restore(flags);
670
        return 0;
671
}
672
 
673
/**
674
 *      ata66_ali15x3   -       check for UDMA 66 support
675
 *      @hwif: IDE interface
676
 *
677
 *      This checks if the controller and the cable are capable
678
 *      of UDMA66 transfers. It doesn't check the drives.
679
 */
680
 
681
static unsigned int __init ata66_ali15x3 (ide_hwif_t *hwif)
682
{
683
        struct pci_dev *dev     = hwif->pci_dev;
684
        unsigned int ata66      = 0;
685
        u8 cable_80_pin[2]      = { 0, 0 };
686
 
687
        unsigned long flags;
688
        u8 tmpbyte;
689
 
690
        /* Revision C5 and higher we must rely on drive side */
691
        if (m5229_revision >= 0xC5)
692
                return 1;
693
 
694
        local_irq_save(flags);
695
 
696
        if (m5229_revision >= 0xC2) {
697
                /*
698
                 * Ultra66 cable detection (from Host View)
699
                 * m5229, 0x4a, bit0: primary, bit1: secondary 80 pin
700
                 */
701
                pci_read_config_byte(dev, 0x4a, &tmpbyte);
702
                /*
703
                 * 0x4a, bit0 is 0 => primary channel
704
                 * has 80-pin (from host view)
705
                 */
706
                if (!(tmpbyte & 0x01)) cable_80_pin[0] = 1;
707
                /*
708
                 * 0x4a, bit1 is 0 => secondary channel
709
                 * has 80-pin (from host view)
710
                 */
711
                if (!(tmpbyte & 0x02)) cable_80_pin[1] = 1;
712
                /*
713
                 * Allow ata66 if cable of current channel has 80 pins
714
                 */
715
                ata66 = (hwif->channel)?cable_80_pin[1]:cable_80_pin[0];
716
        } else {
717
                /*
718
                 * check m1533, 0x5e, bit 1~4 == 1001 => & 00011110 = 00010010
719
                 */
720
                pci_read_config_byte(isa_dev, 0x5e, &tmpbyte);
721
                chip_is_1543c_e = ((tmpbyte & 0x1e) == 0x12) ? 1: 0;
722
        }
723
 
724
        /*
725
         * CD_ROM DMA on (m5229, 0x53, bit0)
726
         *      Enable this bit even if we want to use PIO
727
         * PIO FIFO off (m5229, 0x53, bit1)
728
         *      The hardware will use 0x54h and 0x55h to control PIO FIFO
729
         *      (Not on later devices it seems)
730
         *
731
         *      0x53 changes meaning on later revs - we must no touch
732
         *      bit 1 on them. Need to check if 0x20 is the right break
733
         */
734
 
735
        pci_read_config_byte(dev, 0x53, &tmpbyte);
736
 
737
        if(m5229_revision <= 0x20)
738
                tmpbyte = (tmpbyte & (~0x02)) | 0x01;
739
        else
740
                tmpbyte |= 0x01;
741
 
742
        pci_write_config_byte(dev, 0x53, tmpbyte);
743
 
744
        local_irq_restore(flags);
745
 
746
        return(ata66);
747
}
748
 
749
/**
750
 *      init_hwif_common_ali15x3        -       Set up ALI IDE hardware
751
 *      @hwif: IDE interface
752
 *
753
 *      Initialize the IDE structure side of the ALi 15x3 driver.
754
 */
755
 
756
static void __init init_hwif_common_ali15x3 (ide_hwif_t *hwif)
757
{
758
        hwif->autodma = 0;
759
        hwif->tuneproc = &ali15x3_tune_drive;
760
        hwif->speedproc = &ali15x3_tune_chipset;
761
 
762
        /* Don't use LBA48 on ALi devices before rev 0xC5 */
763
        hwif->addressing = (m5229_revision <= 0xC4) ? 1 : 0;
764
 
765
        if (!hwif->dma_base) {
766
                hwif->drives[0].autotune = 1;
767
                hwif->drives[1].autotune = 1;
768
                return;
769
        }
770
 
771
        hwif->atapi_dma = 1;
772
 
773
        if (m5229_revision > 0x20)
774
                hwif->ultra_mask = 0x3f;
775
        hwif->mwdma_mask = 0x07;
776
        hwif->swdma_mask = 0x07;
777
 
778
        if (m5229_revision >= 0x20) {
779
                /*
780
                 * M1543C or newer for DMAing
781
                 */
782
                hwif->ide_dma_check = &ali15x3_config_drive_for_dma;
783
                hwif->ide_dma_write = &ali15x3_dma_write;
784
                if (!noautodma)
785
                        hwif->autodma = 1;
786
                if (!(hwif->udma_four))
787
                        hwif->udma_four = ata66_ali15x3(hwif);
788
        }
789
        hwif->drives[0].autodma = hwif->autodma;
790
        hwif->drives[1].autodma = hwif->autodma;
791
}
792
 
793
/**
794
 *      init_hwif_ali15x3       -       Initialize the ALI IDE x86 stuff
795
 *      @hwif: interface to configure
796
 *
797
 *      Obtain the IRQ tables for an ALi based IDE solution on the PC
798
 *      class platforms. This part of the code isn't applicable to the
799
 *      Sparc systems
800
 */
801
 
802
static void __init init_hwif_ali15x3 (ide_hwif_t *hwif)
803
{
804
        u8 ideic, inmir;
805
        s8 irq_routing_table[] = { -1,  9, 3, 10, 4,  5, 7,  6,
806
                                      1, 11, 0, 12, 0, 14, 0, 15 };
807
        int irq = -1;
808
 
809
        hwif->irq = hwif->channel ? 15 : 14;
810
 
811
        if (isa_dev) {
812
                /*
813
                 * read IDE interface control
814
                 */
815
                pci_read_config_byte(isa_dev, 0x58, &ideic);
816
 
817
                /* bit0, bit1 */
818
                ideic = ideic & 0x03;
819
 
820
                /* get IRQ for IDE Controller */
821
                if ((hwif->channel && ideic == 0x03) ||
822
                    (!hwif->channel && !ideic)) {
823
                        /*
824
                         * get SIRQ1 routing table
825
                         */
826
                        pci_read_config_byte(isa_dev, 0x44, &inmir);
827
                        inmir = inmir & 0x0f;
828
                        irq = irq_routing_table[inmir];
829
                } else if (hwif->channel && !(ideic & 0x01)) {
830
                        /*
831
                         * get SIRQ2 routing table
832
                         */
833
                        pci_read_config_byte(isa_dev, 0x75, &inmir);
834
                        inmir = inmir & 0x0f;
835
                        irq = irq_routing_table[inmir];
836
                }
837
                if(irq >= 0)
838
                        hwif->irq = irq;
839
        }
840
 
841
        init_hwif_common_ali15x3(hwif);
842
}
843
 
844
/**
845
 *      init_dma_ali15x3        -       set up DMA on ALi15x3
846
 *      @hwif: IDE interface
847
 *      @dmabase: DMA interface base PCI address
848
 *
849
 *      Set up the DMA functionality on the ALi 15x3. For the ALi
850
 *      controllers this is generic so we can let the generic code do
851
 *      the actual work.
852
 */
853
 
854
static void __init init_dma_ali15x3 (ide_hwif_t *hwif, unsigned long dmabase)
855
{
856
        if (m5229_revision < 0x20)
857
                return;
858
        if (!(hwif->channel))
859
                hwif->OUTB(hwif->INB(dmabase+2) & 0x60, dmabase+2);
860
        ide_setup_dma(hwif, dmabase, 8);
861
}
862
 
863
extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *);
864
 
865
 
866
/**
867
 *      alim15x3_init_one       -       set up an ALi15x3 IDE controller
868
 *      @dev: PCI device to set up
869
 *
870
 *      Perform the actual set up for an ALi15x3 that has been found by the
871
 *      hot plug layer.
872
 */
873
 
874
static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id)
875
{
876
        ide_pci_device_t *d = &ali15x3_chipsets[id->driver_data];
877
 
878
        if(pci_find_device(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_IGP, NULL))
879
                printk(KERN_ERR "Warning: ATI Radeon IGP Northbridge is not yet fully tested.\n");
880
 
881
#if defined(CONFIG_SPARC64)
882
        d->init_hwif = init_hwif_common_ali15x3;
883
#endif /* CONFIG_SPARC64 */
884
        ide_setup_pci_device(dev, d);
885
        MOD_INC_USE_COUNT;
886
        return 0;
887
}
888
 
889
 
890
static struct pci_device_id alim15x3_pci_tbl[] __devinitdata = {
891
        { PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M5229, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
892
        { 0, },
893
};
894
 
895
static struct pci_driver driver = {
896
        .name           = "ALI15x3 IDE",
897
        .id_table       = alim15x3_pci_tbl,
898
        .probe          = alim15x3_init_one,
899
};
900
 
901
static int ali15x3_ide_init(void)
902
{
903
        return ide_pci_register_driver(&driver);
904
}
905
 
906
static void ali15x3_ide_exit(void)
907
{
908
        ide_pci_unregister_driver(&driver);
909
}
910
 
911
module_init(ali15x3_ide_init);
912
module_exit(ali15x3_ide_exit);
913
 
914
MODULE_AUTHOR("Michael Aubry, Andrzej Krzysztofowicz, CJ, Andre Hedrick, Alan Cox");
915
MODULE_DESCRIPTION("PCI driver module for ALi 15x3 IDE");
916
MODULE_LICENSE("GPL");
917
 
918
EXPORT_NO_SYMBOLS;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.