4 #include <linux/config.h>
8 #define DISPLAY_PDC202XX_TIMINGS
11 #define SPLIT_BYTE(B,H,L) ((H)=(B>>4), (L)=(B-((B>>4)<<4)))
14 #define PDC202XX_DEBUG_DRIVE_INFO 0
15 #define PDC202XX_DECODE_REGISTER_INFO 0
17 static const char *pdc_quirk_drives[] = {
18 "QUANTUM FIREBALLlct08 08",
19 "QUANTUM FIREBALLP KA6.4",
20 "QUANTUM FIREBALLP KA9.1",
21 "QUANTUM FIREBALLP LM20.4",
22 "QUANTUM FIREBALLP KX13.6",
23 "QUANTUM FIREBALLP KX20.5",
24 "QUANTUM FIREBALLP KX27.3",
25 "QUANTUM FIREBALLP LM20.5",
29 static inline u8 *pdc202xx_pio_verbose (u32 drive_pci)
31 if ((drive_pci & 0x000ff000) == 0x000ff000) return("NOTSET");
32 if ((drive_pci & 0x00000401) == 0x00000401) return("PIO 4");
33 if ((drive_pci & 0x00000602) == 0x00000602) return("PIO 3");
34 if ((drive_pci & 0x00000803) == 0x00000803) return("PIO 2");
35 if ((drive_pci & 0x00000C05) == 0x00000C05) return("PIO 1");
36 if ((drive_pci & 0x00001309) == 0x00001309) return("PIO 0");
40 static inline u8 *pdc202xx_dma_verbose (u32 drive_pci)
42 if ((drive_pci & 0x00036000) == 0x00036000) return("MWDMA 2");
43 if ((drive_pci & 0x00046000) == 0x00046000) return("MWDMA 1");
44 if ((drive_pci & 0x00056000) == 0x00056000) return("MWDMA 0");
45 if ((drive_pci & 0x00056000) == 0x00056000) return("SWDMA 2");
46 if ((drive_pci & 0x00068000) == 0x00068000) return("SWDMA 1");
47 if ((drive_pci & 0x000BC000) == 0x000BC000) return("SWDMA 0");
51 static inline u8 *pdc202xx_ultra_verbose (u32 drive_pci, u16 slow_cable)
53 if ((drive_pci & 0x000ff000) == 0x000ff000)
55 if ((drive_pci & 0x00012000) == 0x00012000)
56 return((slow_cable) ? "UDMA 2" : "UDMA 4");
57 if ((drive_pci & 0x00024000) == 0x00024000)
58 return((slow_cable) ? "UDMA 1" : "UDMA 3");
59 if ((drive_pci & 0x00036000) == 0x00036000)
61 return(pdc202xx_dma_verbose(drive_pci));
65 #define SYNC_ERRDY_EN 0xC0
67 #define SYNC_IN 0x80 /* control bit, different for master vs. slave drives */
68 #define ERRDY_EN 0x40 /* control bit, different for master vs. slave drives */
69 #define IORDY_EN 0x20 /* PIO: IOREADY */
70 #define PREFETCH_EN 0x10 /* PIO: PREFETCH */
72 #define PA3 0x08 /* PIO"A" timing */
73 #define PA2 0x04 /* PIO"A" timing */
74 #define PA1 0x02 /* PIO"A" timing */
75 #define PA0 0x01 /* PIO"A" timing */
79 #define MB2 0x80 /* DMA"B" timing */
80 #define MB1 0x40 /* DMA"B" timing */
81 #define MB0 0x20 /* DMA"B" timing */
83 #define PB4 0x10 /* PIO_FORCE 1:0 */
85 #define PB3 0x08 /* PIO"B" timing */ /* PIO flow Control mode */
86 #define PB2 0x04 /* PIO"B" timing */ /* PIO 4 */
87 #define PB1 0x02 /* PIO"B" timing */ /* PIO 3 half */
88 #define PB0 0x01 /* PIO"B" timing */ /* PIO 3 other half */
91 #define IORDYp_NO_SPEED 0x4F
92 #define SPEED_DIS 0x0F
99 #define MC3 0x08 /* DMA"C" timing */
100 #define MC2 0x04 /* DMA"C" timing */
101 #define MC1 0x02 /* DMA"C" timing */
102 #define MC0 0x01 /* DMA"C" timing */
104 #if PDC202XX_DECODE_REGISTER_INFO
111 static void decode_registers (u8 registers, u8 value)
113 u8 bit = 0, bit1 = 0, bit2 = 0;
118 printk("A Register ");
119 if (value & 0x80) printk("SYNC_IN ");
120 if (value & 0x40) printk("ERRDY_EN ");
121 if (value & 0x20) printk("IORDY_EN ");
122 if (value & 0x10) printk("PREFETCH_EN ");
123 if (value & 0x08) { printk("PA3 ");bit2 |= 0x08; }
124 if (value & 0x04) { printk("PA2 ");bit2 |= 0x04; }
125 if (value & 0x02) { printk("PA1 ");bit2 |= 0x02; }
126 if (value & 0x01) { printk("PA0 ");bit2 |= 0x01; }
127 printk("PIO(A) = %d ", bit2);
131 printk("B Register ");
132 if (value & 0x80) { printk("MB2 ");bit1 |= 0x80; }
133 if (value & 0x40) { printk("MB1 ");bit1 |= 0x40; }
134 if (value & 0x20) { printk("MB0 ");bit1 |= 0x20; }
135 printk("DMA(B) = %d ", bit1 >> 5);
136 if (value & 0x10) printk("PIO_FORCED/PB4 ");
137 if (value & 0x08) { printk("PB3 ");bit2 |= 0x08; }
138 if (value & 0x04) { printk("PB2 ");bit2 |= 0x04; }
139 if (value & 0x02) { printk("PB1 ");bit2 |= 0x02; }
140 if (value & 0x01) { printk("PB0 ");bit2 |= 0x01; }
141 printk("PIO(B) = %d ", bit2);
145 printk("C Register ");
146 if (value & 0x80) printk("DMARQp ");
147 if (value & 0x40) printk("IORDYp ");
148 if (value & 0x20) printk("DMAR_EN ");
149 if (value & 0x10) printk("DMAW_EN ");
151 if (value & 0x08) { printk("MC3 ");bit2 |= 0x08; }
152 if (value & 0x04) { printk("MC2 ");bit2 |= 0x04; }
153 if (value & 0x02) { printk("MC1 ");bit2 |= 0x02; }
154 if (value & 0x01) { printk("MC0 ");bit2 |= 0x01; }
155 printk("DMA(C) = %d ", bit2);
158 printk("D Register ");
163 printk("\n %s ", (registers & REG_D) ? "DP" :
164 (registers & REG_C) ? "CP" :
165 (registers & REG_B) ? "BP" :
166 (registers & REG_A) ? "AP" : "ERROR");
167 for (bit=128;bit>0;bit/=2)
168 printk("%s", (value & bit) ? "1" : "0");
172 #endif /* PDC202XX_DECODE_REGISTER_INFO */
174 #define set_2regs(a, b) \
176 hwif->OUTB((a + adj), indexreg); \
177 hwif->OUTB(b, datareg); \
180 #define set_ultra(a, b, c) \
182 set_2regs(0x10,(a)); \
183 set_2regs(0x11,(b)); \
184 set_2regs(0x12,(c)); \
187 #define set_ata2(a, b) \
189 set_2regs(0x0e,(a)); \
190 set_2regs(0x0f,(b)); \
193 #define set_pio(a, b, c) \
195 set_2regs(0x0c,(a)); \
196 set_2regs(0x0d,(b)); \
197 set_2regs(0x13,(c)); \
200 #define DISPLAY_PDC202XX_TIMINGS
202 #if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
203 #include <linux/stat.h>
204 #include <linux/proc_fs.h>
206 static u8 pdc202xx_proc;
208 static int pdc202xx_get_info(char *, char **, off_t, int);
210 static ide_pci_host_proc_t pdc202xx_procs[] = {
214 .get_info = pdc202xx_get_info,
218 #endif /* DISPLAY_PDC202XX_TIMINGS && CONFIG_PROC_FS */
221 static void init_setup_pdc202ata4(struct pci_dev *dev, ide_pci_device_t *d);
222 static void init_setup_pdc20265(struct pci_dev *, ide_pci_device_t *);
223 static void init_setup_pdc202xx(struct pci_dev *, ide_pci_device_t *);
224 static unsigned int init_chipset_pdc202xx(struct pci_dev *, const char *);
225 static void init_hwif_pdc202xx(ide_hwif_t *);
226 static void init_dma_pdc202xx(ide_hwif_t *, unsigned long);
228 static ide_pci_device_t pdc202xx_chipsets[] __devinitdata = {
230 .vendor = PCI_VENDOR_ID_PROMISE,
231 .device = PCI_DEVICE_ID_PROMISE_20246,
233 .init_setup = init_setup_pdc202ata4,
234 .init_chipset = init_chipset_pdc202xx,
236 .init_hwif = init_hwif_pdc202xx,
237 .init_dma = init_dma_pdc202xx,
240 #ifdef CONFIG_PDC202XX_FORCE
241 .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
242 #else /* !CONFIG_PDC202XX_FORCE */
243 .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
245 .bootable = OFF_BOARD,
248 .vendor = PCI_VENDOR_ID_PROMISE,
249 .device = PCI_DEVICE_ID_PROMISE_20262,
251 .init_setup = init_setup_pdc202ata4,
252 .init_chipset = init_chipset_pdc202xx,
254 .init_hwif = init_hwif_pdc202xx,
255 .init_dma = init_dma_pdc202xx,
258 #ifdef CONFIG_PDC202XX_FORCE
259 .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
260 #else /* !CONFIG_PDC202XX_FORCE */
261 .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
263 .bootable = OFF_BOARD,
266 .vendor = PCI_VENDOR_ID_PROMISE,
267 .device = PCI_DEVICE_ID_PROMISE_20263,
269 .init_setup = init_setup_pdc202ata4,
270 .init_chipset = init_chipset_pdc202xx,
272 .init_hwif = init_hwif_pdc202xx,
273 .init_dma = init_dma_pdc202xx,
276 #ifdef CONFIG_PDC202XX_FORCE
277 .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
278 #else /* !CONFIG_PDC202XX_FORCE */
279 .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
281 .bootable = OFF_BOARD,
284 .vendor = PCI_VENDOR_ID_PROMISE,
285 .device = PCI_DEVICE_ID_PROMISE_20265,
287 .init_setup = init_setup_pdc20265,
288 .init_chipset = init_chipset_pdc202xx,
289 .init_hwif = init_hwif_pdc202xx,
290 .init_dma = init_dma_pdc202xx,
293 #ifdef CONFIG_PDC202XX_FORCE
294 .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
295 #else /* !CONFIG_PDC202XX_FORCE */
296 .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
298 .bootable = OFF_BOARD,
301 .vendor = PCI_VENDOR_ID_PROMISE,
302 .device = PCI_DEVICE_ID_PROMISE_20267,
304 .init_setup = init_setup_pdc202xx,
305 .init_chipset = init_chipset_pdc202xx,
307 .init_hwif = init_hwif_pdc202xx,
308 .init_dma = init_dma_pdc202xx,
311 #ifdef CONFIG_PDC202XX_FORCE
312 .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
313 #else /* !CONFIG_PDC202XX_FORCE */
314 .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
316 .bootable = OFF_BOARD,
326 #endif /* PDC202XX_H */