sis5513.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:24k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/drivers/ide/sis5513.c Version 0.13 March 6, 2002
  3.  *
  4.  * Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org>
  5.  * Copyright (C) 2002 Lionel Bouton <Lionel.Bouton@inet6.fr>, Maintainer
  6.  * May be copied or modified under the terms of the GNU General Public License
  7.  *
  8.  *
  9.  * Thanks :
  10.  *
  11.  * SiS Taiwan : for direct support and hardware.
  12.  * Daniela Engert : for initial ATA100 advices and numerous others.
  13.  * John Fremlin, Manfred Spraul :
  14.  *   for checking code correctness, providing patches.
  15.  *
  16.  *
  17.  * Original tests and design on the SiS620/5513 chipset.
  18.  * ATA100 tests and design on the SiS735/5513 chipset.
  19.  * ATA16/33 design from specs
  20.  */
  21. /*
  22.  * TODO:
  23.  * - Get ridden of SisHostChipInfo[] completness dependancy.
  24.  * - Get ATA-133 datasheets, implement ATA-133 init code.
  25.  * - Study drivers/ide/ide-timing.h.
  26.  * - Are there pre-ATA_16 SiS5513 chips ? -> tune init code for them
  27.  *   or remove ATA_00 define
  28.  * - More checks in the config registers (force values instead of
  29.  *   relying on the BIOS setting them correctly).
  30.  * - Further optimisations ?
  31.  *   . for example ATA66+ regs 0x48 & 0x4A
  32.  */
  33. #include <linux/config.h>
  34. #include <linux/types.h>
  35. #include <linux/kernel.h>
  36. #include <linux/delay.h>
  37. #include <linux/timer.h>
  38. #include <linux/mm.h>
  39. #include <linux/ioport.h>
  40. #include <linux/blkdev.h>
  41. #include <linux/hdreg.h>
  42. #include <linux/interrupt.h>
  43. #include <linux/pci.h>
  44. #include <linux/init.h>
  45. #include <linux/ide.h>
  46. #include <asm/io.h>
  47. #include <asm/irq.h>
  48. #include "ide_modes.h"
  49. /* When DEBUG is defined it outputs initial PCI config register
  50.    values and changes made to them by the driver */   
  51. // #define DEBUG
  52. /* When BROKEN_LEVEL is defined it limits the DMA mode
  53.    at boot time to its value */
  54. // #define BROKEN_LEVEL XFER_SW_DMA_0
  55. #define DISPLAY_SIS_TIMINGS
  56. /* Miscellaneaous flags */
  57. #define SIS5513_LATENCY 0x01
  58. /* registers layout and init values are chipset family dependant */
  59. /* 1/ define families */
  60. #define ATA_00 0x00
  61. #define ATA_16 0x01
  62. #define ATA_33 0x02
  63. #define ATA_66 0x03
  64. #define ATA_100a 0x04 // SiS730 is ATA100 with ATA66 layout
  65. #define ATA_100 0x05
  66. #define ATA_133 0x06
  67. /* 2/ variable holding the controller chipset family value */
  68. static unsigned char chipset_family;
  69. /*
  70.  * Debug code: following IDE config registers' changes
  71.  */
  72. #ifdef DEBUG
  73. /* Copy of IDE Config registers 0x00 -> 0x57
  74.    Fewer might be used depending on the actual chipset */
  75. static unsigned char ide_regs_copy[0x58];
  76. static byte sis5513_max_config_register(void) {
  77. switch(chipset_family) {
  78. case ATA_00:
  79. case ATA_16: return 0x4f;
  80. case ATA_33: return 0x52;
  81. case ATA_66:
  82. case ATA_100a:
  83. case ATA_100:
  84. case ATA_133:
  85. default: return 0x57;
  86. }
  87. }
  88. /* Read config registers, print differences from previous read */
  89. static void sis5513_load_verify_registers(struct pci_dev* dev, char* info) {
  90. int i;
  91. byte reg_val;
  92. byte changed=0;
  93. byte max = sis5513_max_config_register();
  94. printk("SIS5513: %s, changed registers:n", info);
  95. for(i=0; i<=max; i++) {
  96. pci_read_config_byte(dev, i, &reg_val);
  97. if (reg_val != ide_regs_copy[i]) {
  98. printk("%0#x: %0#x -> %0#xn",
  99.        i, ide_regs_copy[i], reg_val);
  100. ide_regs_copy[i]=reg_val;
  101. changed=1;
  102. }
  103. }
  104. if (!changed) {
  105. printk("nonen");
  106. }
  107. }
  108. /* Load config registers, no printing */
  109. static void sis5513_load_registers(struct pci_dev* dev) {
  110. int i;
  111. byte max = sis5513_max_config_register();
  112. for(i=0; i<=max; i++) {
  113. pci_read_config_byte(dev, i, &(ide_regs_copy[i]));
  114. }
  115. }
  116. /* Print a register */
  117. static void sis5513_print_register(int reg) {
  118. printk(" %0#x:%0#x", reg, ide_regs_copy[reg]);
  119. }
  120. /* Print valuable registers */
  121. static void sis5513_print_registers(struct pci_dev* dev, char* marker) {
  122. int i;
  123. byte max = sis5513_max_config_register();
  124. sis5513_load_registers(dev);
  125. printk("SIS5513 %sn", marker);
  126. printk("SIS5513 dump:");
  127. for(i=0x00; i<0x40; i++) {
  128. if ((i % 0x10)==0) printk("n             ");
  129. sis5513_print_register(i);
  130. }
  131. for(; i<49; i++) {
  132. sis5513_print_register(i);
  133. }
  134. printk("n             ");
  135. for(; i<=max; i++) {
  136. sis5513_print_register(i);
  137. }
  138. printk("n");
  139. }
  140. #endif
  141. /*
  142.  * Devices supported
  143.  */
  144. static const struct {
  145. const char *name;
  146. unsigned short host_id;
  147. unsigned char chipset_family;
  148. unsigned char flags;
  149. } SiSHostChipInfo[] = {
  150. // { "SiS750", PCI_DEVICE_ID_SI_750, ATA_100, SIS5513_LATENCY },
  151. // { "SiS745", PCI_DEVICE_ID_SI_745, ATA_100, SIS5513_LATENCY },
  152. { "SiS740", PCI_DEVICE_ID_SI_740, ATA_100, SIS5513_LATENCY },
  153. { "SiS735", PCI_DEVICE_ID_SI_735, ATA_100, SIS5513_LATENCY },
  154. { "SiS730", PCI_DEVICE_ID_SI_730, ATA_100a, SIS5513_LATENCY },
  155. // { "SiS650", PCI_DEVICE_ID_SI_650, ATA_100, SIS5513_LATENCY },
  156. // { "SiS645", PCI_DEVICE_ID_SI_645, ATA_100, SIS5513_LATENCY },
  157. { "SiS635", PCI_DEVICE_ID_SI_635, ATA_100, SIS5513_LATENCY },
  158. { "SiS640", PCI_DEVICE_ID_SI_640, ATA_66, SIS5513_LATENCY },
  159. { "SiS630", PCI_DEVICE_ID_SI_630, ATA_66, SIS5513_LATENCY },
  160. { "SiS620", PCI_DEVICE_ID_SI_620, ATA_66, SIS5513_LATENCY },
  161. { "SiS540", PCI_DEVICE_ID_SI_540, ATA_66, 0},
  162. { "SiS530", PCI_DEVICE_ID_SI_530, ATA_66, 0},
  163. { "SiS5600", PCI_DEVICE_ID_SI_5600, ATA_33, 0},
  164. { "SiS5598", PCI_DEVICE_ID_SI_5598, ATA_33, 0},
  165. { "SiS5597", PCI_DEVICE_ID_SI_5597, ATA_33, 0},
  166. { "SiS5591", PCI_DEVICE_ID_SI_5591, ATA_33, 0},
  167. { "SiS5513", PCI_DEVICE_ID_SI_5513, ATA_16, 0},
  168. { "SiS5511", PCI_DEVICE_ID_SI_5511, ATA_16, 0},
  169. };
  170. /* Cycle time bits and values vary accross chip dma capabilities
  171.    These three arrays hold the register layout and the values to set.
  172.    Indexed by chipset_family and (dma_mode - XFER_UDMA_0) */
  173. static byte cycle_time_offset[] = {0,0,5,4,4,0,0};
  174. static byte cycle_time_range[] = {0,0,2,3,3,4,4};
  175. static byte cycle_time_value[][XFER_UDMA_5 - XFER_UDMA_0 + 1] = {
  176. {0,0,0,0,0,0}, /* no udma */
  177. {0,0,0,0,0,0}, /* no udma */
  178. {3,2,1,0,0,0},
  179. {7,5,3,2,1,0},
  180. {7,5,3,2,1,0},
  181. {11,7,5,4,2,1},
  182. {0,0,0,0,0,0} /* not yet known, ask SiS */
  183. };
  184. static struct pci_dev *host_dev = NULL;
  185. /*
  186.  * Printing configuration
  187.  */
  188. #if defined(DISPLAY_SIS_TIMINGS) && defined(CONFIG_PROC_FS)
  189. #include <linux/stat.h>
  190. #include <linux/proc_fs.h>
  191. static int sis_get_info(char *, char **, off_t, int);
  192. extern int (*sis_display_info)(char *, char **, off_t, int); /* ide-proc.c */
  193. static struct pci_dev *bmide_dev;
  194. static char* cable_type[] = {
  195. "80 pins",
  196. "40 pins"
  197. };
  198. static char* recovery_time[] ={
  199. "12 PCICLK", "1 PCICLK",
  200. "2 PCICLK", "3 PCICLK",
  201. "4 PCICLK", "5 PCICLCK",
  202. "6 PCICLK", "7 PCICLCK",
  203. "8 PCICLK", "9 PCICLCK",
  204. "10 PCICLK", "11 PCICLK",
  205. "13 PCICLK", "14 PCICLK",
  206. "15 PCICLK", "15 PCICLK"
  207. };
  208. static char* active_time[] = {
  209. "8 PCICLK", "1 PCICLCK",
  210. "2 PCICLK", "3 PCICLK",
  211. "4 PCICLK", "5 PCICLK",
  212. "6 PCICLK", "12 PCICLK"
  213. };
  214. static char* cycle_time[] = {
  215. "Reserved", "2 CLK",
  216. "3 CLK", "4 CLK",
  217. "5 CLK", "6 CLK",
  218. "7 CLK", "8 CLK",
  219. "9 CLK", "10 CLK",
  220. "11 CLK", "12 CLK",
  221. "Reserved", "Reserved",
  222. "Reserved", "Reserved"
  223. };
  224. /* Generic add master or slave info function */
  225. static char* get_drives_info (char *buffer, byte pos)
  226. {
  227. byte reg00, reg01, reg10, reg11; /* timing registers */
  228. char* p = buffer;
  229. /* Postwrite/Prefetch */
  230. pci_read_config_byte(bmide_dev, 0x4b, &reg00);
  231. p += sprintf(p, "Drive %d:        Postwrite %s t t Postwrite %sn",
  232.      pos, (reg00 & (0x10 << pos)) ? "Enabled" : "Disabled",
  233.      (reg00 & (0x40 << pos)) ? "Enabled" : "Disabled");
  234. p += sprintf(p, "                Prefetch  %s t t Prefetch  %sn",
  235.      (reg00 & (0x01 << pos)) ? "Enabled" : "Disabled",
  236.      (reg00 & (0x04 << pos)) ? "Enabled" : "Disabled");
  237. pci_read_config_byte(bmide_dev, 0x40+2*pos, &reg00);
  238. pci_read_config_byte(bmide_dev, 0x41+2*pos, &reg01);
  239. pci_read_config_byte(bmide_dev, 0x44+2*pos, &reg10);
  240. pci_read_config_byte(bmide_dev, 0x45+2*pos, &reg11);
  241. /* UDMA */
  242. if (chipset_family >= ATA_33) {
  243. p += sprintf(p, "                UDMA %s t t t UDMA %sn",
  244.      (reg01 & 0x80)  ? "Enabled" : "Disabled",
  245.      (reg11 & 0x80) ? "Enabled" : "Disabled");
  246. p += sprintf(p, "                UDMA Cycle Time    ");
  247. switch(chipset_family) {
  248. case ATA_33: p += sprintf(p, cycle_time[(reg01 & 0x60) >> 5]); break;
  249. case ATA_66:
  250. case ATA_100a: p += sprintf(p, cycle_time[(reg01 & 0x70) >> 4]); break;
  251. case ATA_100: p += sprintf(p, cycle_time[reg01 & 0x0F]); break;
  252. case ATA_133:
  253. default: p += sprintf(p, "133+ ?"); break;
  254. }
  255. p += sprintf(p, " t UDMA Cycle Time    ");
  256. switch(chipset_family) {
  257. case ATA_33: p += sprintf(p, cycle_time[(reg11 & 0x60) >> 5]); break;
  258. case ATA_66:
  259. case ATA_100a: p += sprintf(p, cycle_time[(reg11 & 0x70) >> 4]); break;
  260. case ATA_100: p += sprintf(p, cycle_time[reg11 & 0x0F]); break;
  261. case ATA_133:
  262. default: p += sprintf(p, "133+ ?"); break;
  263. }
  264. p += sprintf(p, "n");
  265. }
  266. /* Data Active */
  267. p += sprintf(p, "                Data Active Time   ");
  268. switch(chipset_family) {
  269. case ATA_00:
  270. case ATA_16: /* confirmed */
  271. case ATA_33:
  272. case ATA_66:
  273. case ATA_100a: p += sprintf(p, active_time[reg01 & 0x07]); break;
  274. case ATA_100: p += sprintf(p, active_time[(reg00 & 0x70) >> 4]); break;
  275. case ATA_133:
  276. default: p += sprintf(p, "133+ ?"); break;
  277. }
  278. p += sprintf(p, " t Data Active Time   ");
  279. switch(chipset_family) {
  280. case ATA_00:
  281. case ATA_16:
  282. case ATA_33:
  283. case ATA_66:
  284. case ATA_100a: p += sprintf(p, active_time[reg11 & 0x07]); break;
  285. case ATA_100: p += sprintf(p, active_time[(reg10 & 0x70) >> 4]); break;
  286. case ATA_133:
  287. default: p += sprintf(p, "133+ ?"); break;
  288. }
  289. p += sprintf(p, "n");
  290. /* Data Recovery */
  291. /* warning: may need (reg&0x07) for pre ATA66 chips */
  292. p += sprintf(p, "                Data Recovery Time %s t Data Recovery Time %sn",
  293.      recovery_time[reg00 & 0x0f], recovery_time[reg10 & 0x0f]);
  294. return p;
  295. }
  296. static char* get_masters_info(char* buffer)
  297. {
  298. return get_drives_info(buffer, 0);
  299. }
  300. static char* get_slaves_info(char* buffer)
  301. {
  302. return get_drives_info(buffer, 1);
  303. }
  304. /* Main get_info, called on /proc/ide/sis reads */
  305. static int sis_get_info (char *buffer, char **addr, off_t offset, int count)
  306. {
  307. char *p = buffer;
  308. byte reg;
  309. u16 reg2, reg3;
  310. p += sprintf(p, "nSiS 5513 ");
  311. switch(chipset_family) {
  312. case ATA_00: p += sprintf(p, "Unknown???"); break;
  313. case ATA_16: p += sprintf(p, "DMA 16"); break;
  314. case ATA_33: p += sprintf(p, "Ultra 33"); break;
  315. case ATA_66: p += sprintf(p, "Ultra 66"); break;
  316. case ATA_100a:
  317. case ATA_100: p += sprintf(p, "Ultra 100"); break;
  318. case ATA_133:
  319. default: p+= sprintf(p, "Ultra 133+"); break;
  320. }
  321. p += sprintf(p, " chipsetn");
  322. p += sprintf(p, "--------------- Primary Channel ---------------- Secondary Channel -------------n");
  323. /* Status */
  324. pci_read_config_byte(bmide_dev, 0x4a, &reg);
  325. p += sprintf(p, "Channel Status: ");
  326. if (chipset_family < ATA_66) {
  327. p += sprintf(p, "%s t t t t %sn",
  328.      (reg & 0x04) ? "On" : "Off",
  329.      (reg & 0x02) ? "On" : "Off");
  330. } else {
  331. p += sprintf(p, "%s t t t t %s n",
  332.      (reg & 0x02) ? "On" : "Off",
  333.      (reg & 0x04) ? "On" : "Off");
  334. }
  335. /* Operation Mode */
  336. pci_read_config_byte(bmide_dev, 0x09, &reg);
  337. p += sprintf(p, "Operation Mode: %s t t t %s n",
  338.      (reg & 0x01) ? "Native" : "Compatible",
  339.      (reg & 0x04) ? "Native" : "Compatible");
  340. /* 80-pin cable ? */
  341. if (chipset_family > ATA_33) {
  342. pci_read_config_byte(bmide_dev, 0x48, &reg);
  343. p += sprintf(p, "Cable Type:     %s t t t %sn",
  344.      (reg & 0x10) ? cable_type[1] : cable_type[0],
  345.      (reg & 0x20) ? cable_type[1] : cable_type[0]);
  346. }
  347. /* Prefetch Count */
  348. pci_read_config_word(bmide_dev, 0x4c, &reg2);
  349. pci_read_config_word(bmide_dev, 0x4e, &reg3);
  350. p += sprintf(p, "Prefetch Count: %d t t t t %dn",
  351.      reg2, reg3);
  352. p = get_masters_info(p);
  353. p = get_slaves_info(p);
  354. return p-buffer;
  355. }
  356. #endif /* defined(DISPLAY_SIS_TIMINGS) && defined(CONFIG_PROC_FS) */
  357. byte sis_proc = 0;
  358. extern char *ide_xfer_verbose (byte xfer_rate);
  359. /*
  360.  * Configuration functions
  361.  */
  362. /* Enables per-drive prefetch and postwrite */
  363. static void config_drive_art_rwp (ide_drive_t *drive)
  364. {
  365. ide_hwif_t *hwif = HWIF(drive);
  366. struct pci_dev *dev = hwif->pci_dev;
  367. byte reg4bh = 0;
  368. byte rw_prefetch = (0x11 << drive->dn);
  369. #ifdef DEBUG
  370. printk("SIS5513: config_drive_art_rwp, drive %dn", drive->dn);
  371. sis5513_load_verify_registers(dev, "config_drive_art_rwp start");
  372. #endif
  373. if (drive->media != ide_disk)
  374. return;
  375. pci_read_config_byte(dev, 0x4b, &reg4bh);
  376. if ((reg4bh & rw_prefetch) != rw_prefetch)
  377. pci_write_config_byte(dev, 0x4b, reg4bh|rw_prefetch);
  378. #ifdef DEBUG
  379. sis5513_load_verify_registers(dev, "config_drive_art_rwp end");
  380. #endif
  381. }
  382. /* Set per-drive active and recovery time */
  383. static void config_art_rwp_pio (ide_drive_t *drive, byte pio)
  384. {
  385. ide_hwif_t *hwif = HWIF(drive);
  386. struct pci_dev *dev = hwif->pci_dev;
  387. byte timing, drive_pci, test1, test2;
  388. unsigned short eide_pio_timing[6] = {600, 390, 240, 180, 120, 90};
  389. unsigned short xfer_pio = drive->id->eide_pio_modes;
  390. #ifdef DEBUG
  391. sis5513_load_verify_registers(dev, "config_drive_art_rwp_pio start");
  392. #endif
  393. config_drive_art_rwp(drive);
  394. pio = ide_get_best_pio_mode(drive, 255, pio, NULL);
  395. if (xfer_pio> 4)
  396. xfer_pio = 0;
  397. if (drive->id->eide_pio_iordy > 0) {
  398. for (xfer_pio = 5;
  399. (xfer_pio > 0) &&
  400. (drive->id->eide_pio_iordy > eide_pio_timing[xfer_pio]);
  401. xfer_pio--);
  402. } else {
  403. xfer_pio = (drive->id->eide_pio_modes & 4) ? 0x05 :
  404.    (drive->id->eide_pio_modes & 2) ? 0x04 :
  405.    (drive->id->eide_pio_modes & 1) ? 0x03 : xfer_pio;
  406. }
  407. timing = (xfer_pio >= pio) ? xfer_pio : pio;
  408. #ifdef DEBUG
  409. printk("SIS5513: config_drive_art_rwp_pio, drive %d, pio %d, timing %dn",
  410.        drive->dn, pio, timing);
  411. #endif
  412. switch(drive->dn) {
  413. case 0: drive_pci = 0x40; break;
  414. case 1: drive_pci = 0x42; break;
  415. case 2: drive_pci = 0x44; break;
  416. case 3: drive_pci = 0x46; break;
  417. default: return;
  418. }
  419. /* register layout changed with newer ATA100 chips */
  420. if (chipset_family < ATA_100) {
  421. pci_read_config_byte(dev, drive_pci, &test1);
  422. pci_read_config_byte(dev, drive_pci+1, &test2);
  423. /* Clear active and recovery timings */
  424. test1 &= ~0x0F;
  425. test2 &= ~0x07;
  426. switch(timing) {
  427. case 4: test1 |= 0x01; test2 |= 0x03; break;
  428. case 3: test1 |= 0x03; test2 |= 0x03; break;
  429. case 2: test1 |= 0x04; test2 |= 0x04; break;
  430. case 1: test1 |= 0x07; test2 |= 0x06; break;
  431. default: break;
  432. }
  433. pci_write_config_byte(dev, drive_pci, test1);
  434. pci_write_config_byte(dev, drive_pci+1, test2);
  435. } else {
  436. switch(timing) { /*   active  recovery
  437.   v     v */
  438. case 4: test1 = 0x30|0x01; break;
  439. case 3: test1 = 0x30|0x03; break;
  440. case 2: test1 = 0x40|0x04; break;
  441. case 1: test1 = 0x60|0x07; break;
  442. default: break;
  443. }
  444. pci_write_config_byte(dev, drive_pci, test1);
  445. }
  446. #ifdef DEBUG
  447. sis5513_load_verify_registers(dev, "config_drive_art_rwp_pio start");
  448. #endif
  449. }
  450. static int config_chipset_for_pio (ide_drive_t *drive, byte pio)
  451. {
  452. byte speed;
  453. switch(pio) {
  454. case 4: speed = XFER_PIO_4; break;
  455. case 3: speed = XFER_PIO_3; break;
  456. case 2: speed = XFER_PIO_2; break;
  457. case 1: speed = XFER_PIO_1; break;
  458. default: speed = XFER_PIO_0; break;
  459. }
  460. config_art_rwp_pio(drive, pio);
  461. drive->current_speed = speed;
  462. return ide_config_drive_speed(drive, speed);
  463. }
  464. static int sis5513_tune_chipset (ide_drive_t *drive, byte speed)
  465. {
  466. ide_hwif_t *hwif = HWIF(drive);
  467. struct pci_dev *dev = hwif->pci_dev;
  468. byte drive_pci, reg;
  469. #ifdef DEBUG
  470. sis5513_load_verify_registers(dev, "sis5513_tune_chipset start");
  471. printk("SIS5513: sis5513_tune_chipset, drive %d, speed %dn",
  472.        drive->dn, speed);
  473. #endif
  474. switch(drive->dn) {
  475. case 0: drive_pci = 0x40; break;
  476. case 1: drive_pci = 0x42; break;
  477. case 2: drive_pci = 0x44; break;
  478. case 3: drive_pci = 0x46; break;
  479. default: return ide_dma_off;
  480. }
  481. #ifdef BROKEN_LEVEL
  482. #ifdef DEBUG
  483. printk("SIS5513: BROKEN_LEVEL activated, speed=%d -> speed=%dn", speed, BROKEN_LEVEL);
  484. #endif
  485. if (speed > BROKEN_LEVEL) speed = BROKEN_LEVEL;
  486. #endif
  487. pci_read_config_byte(dev, drive_pci+1, &reg);
  488. /* Disable UDMA bit for non UDMA modes on UDMA chips */
  489. if ((speed < XFER_UDMA_0) && (chipset_family > ATA_16)) {
  490. reg &= 0x7F;
  491. pci_write_config_byte(dev, drive_pci+1, reg);
  492. }
  493. /* Config chip for mode */
  494. switch(speed) {
  495. #ifdef CONFIG_BLK_DEV_IDEDMA
  496. case XFER_UDMA_5:
  497. case XFER_UDMA_4:
  498. case XFER_UDMA_3:
  499. case XFER_UDMA_2:
  500. case XFER_UDMA_1:
  501. case XFER_UDMA_0:
  502. /* Force the UDMA bit on if we want to use UDMA */
  503. reg |= 0x80;
  504. /* clean reg cycle time bits */
  505. reg &= ~((0xFF >> (8 - cycle_time_range[chipset_family]))
  506.  << cycle_time_offset[chipset_family]);
  507. /* set reg cycle time bits */
  508. reg |= cycle_time_value[chipset_family-ATA_00][speed-XFER_UDMA_0]
  509. << cycle_time_offset[chipset_family];
  510. pci_write_config_byte(dev, drive_pci+1, reg);
  511. break;
  512. case XFER_MW_DMA_2:
  513. case XFER_MW_DMA_1:
  514. case XFER_MW_DMA_0:
  515. case XFER_SW_DMA_2:
  516. case XFER_SW_DMA_1:
  517. case XFER_SW_DMA_0:
  518. break;
  519. #endif /* CONFIG_BLK_DEV_IDEDMA */
  520. case XFER_PIO_4: return((int) config_chipset_for_pio(drive, 4));
  521. case XFER_PIO_3: return((int) config_chipset_for_pio(drive, 3));
  522. case XFER_PIO_2: return((int) config_chipset_for_pio(drive, 2));
  523. case XFER_PIO_1: return((int) config_chipset_for_pio(drive, 1));
  524. case XFER_PIO_0:
  525. default:  return((int) config_chipset_for_pio(drive, 0));
  526. }
  527. drive->current_speed = speed;
  528. #ifdef DEBUG
  529. sis5513_load_verify_registers(dev, "sis5513_tune_chipset end");
  530. #endif
  531. return ((int) ide_config_drive_speed(drive, speed));
  532. }
  533. static void sis5513_tune_drive (ide_drive_t *drive, byte pio)
  534. {
  535. (void) config_chipset_for_pio(drive, pio);
  536. }
  537. #ifdef CONFIG_BLK_DEV_IDEDMA
  538. /*
  539.  * ((id->hw_config & 0x4000|0x2000) && (HWIF(drive)->udma_four))
  540.  */
  541. static int config_chipset_for_dma (ide_drive_t *drive, byte ultra)
  542. {
  543. struct hd_driveid *id = drive->id;
  544. ide_hwif_t *hwif = HWIF(drive);
  545. byte speed = 0;
  546. byte unit = (drive->select.b.unit & 0x01);
  547. byte udma_66 = eighty_ninty_three(drive);
  548. #ifdef DEBUG
  549. printk("SIS5513: config_chipset_for_dma, drive %d, ultra %dn",
  550.        drive->dn, ultra);
  551. #endif
  552. if ((id->dma_ultra & 0x0020) && ultra && udma_66 && (chipset_family >= ATA_100a))
  553. speed = XFER_UDMA_5;
  554. else if ((id->dma_ultra & 0x0010) && ultra && udma_66 && (chipset_family >= ATA_66))
  555. speed = XFER_UDMA_4;
  556. else if ((id->dma_ultra & 0x0008) && ultra && udma_66 && (chipset_family >= ATA_66))
  557. speed = XFER_UDMA_3;
  558. else if ((id->dma_ultra & 0x0004) && ultra && (chipset_family >= ATA_33))
  559. speed = XFER_UDMA_2;
  560. else if ((id->dma_ultra & 0x0002) && ultra && (chipset_family >= ATA_33))
  561. speed = XFER_UDMA_1;
  562. else if ((id->dma_ultra & 0x0001) && ultra && (chipset_family >= ATA_33))
  563. speed = XFER_UDMA_0;
  564. else if (id->dma_mword & 0x0004)
  565. speed = XFER_MW_DMA_2;
  566. else if (id->dma_mword & 0x0002)
  567. speed = XFER_MW_DMA_1;
  568. else if (id->dma_mword & 0x0001)
  569. speed = XFER_MW_DMA_0;
  570. else if (id->dma_1word & 0x0004)
  571. speed = XFER_SW_DMA_2;
  572. else if (id->dma_1word & 0x0002)
  573. speed = XFER_SW_DMA_1;
  574. else if (id->dma_1word & 0x0001)
  575. speed = XFER_SW_DMA_0;
  576. else
  577. return ((int) ide_dma_off_quietly);
  578. outb(inb(hwif->dma_base+2)|(1<<(5+unit)), hwif->dma_base+2);
  579. sis5513_tune_chipset(drive, speed);
  580. return ((int) ((id->dma_ultra >> 11) & 7) ? ide_dma_on :
  581. ((id->dma_ultra >> 8) & 7) ? ide_dma_on :
  582. ((id->dma_mword >> 8) & 7) ? ide_dma_on :
  583. ((id->dma_1word >> 8) & 7) ? ide_dma_on :
  584.      ide_dma_off_quietly);
  585. }
  586. static int config_drive_xfer_rate (ide_drive_t *drive)
  587. {
  588. struct hd_driveid *id = drive->id;
  589. ide_dma_action_t dma_func = ide_dma_off_quietly;
  590. (void) config_chipset_for_pio(drive, 5);
  591. if (id && (id->capability & 1) && HWIF(drive)->autodma) {
  592. /* Consult the list of known "bad" drives */
  593. if (ide_dmaproc(ide_dma_bad_drive, drive)) {
  594. dma_func = ide_dma_off;
  595. goto fast_ata_pio;
  596. }
  597. dma_func = ide_dma_off_quietly;
  598. if (id->field_valid & 4) {
  599. if (id->dma_ultra & 0x003F) {
  600. /* Force if Capable UltraDMA */
  601. dma_func = config_chipset_for_dma(drive, 1);
  602. if ((id->field_valid & 2) &&
  603.     (dma_func != ide_dma_on))
  604. goto try_dma_modes;
  605. }
  606. } else if (id->field_valid & 2) {
  607. try_dma_modes:
  608. if ((id->dma_mword & 0x0007) ||
  609.     (id->dma_1word & 0x0007)) {
  610. /* Force if Capable regular DMA modes */
  611. dma_func = config_chipset_for_dma(drive, 0);
  612. if (dma_func != ide_dma_on)
  613. goto no_dma_set;
  614. }
  615. } else if ((ide_dmaproc(ide_dma_good_drive, drive)) &&
  616.    (id->eide_dma_time > 150)) {
  617. /* Consult the list of known "good" drives */
  618. dma_func = config_chipset_for_dma(drive, 0);
  619. if (dma_func != ide_dma_on)
  620. goto no_dma_set;
  621. } else {
  622. goto fast_ata_pio;
  623. }
  624. } else if ((id->capability & 8) || (id->field_valid & 2)) {
  625. fast_ata_pio:
  626. dma_func = ide_dma_off_quietly;
  627. no_dma_set:
  628. (void) config_chipset_for_pio(drive, 5);
  629. }
  630. return HWIF(drive)->dmaproc(dma_func, drive);
  631. }
  632. /* initiates/aborts (U)DMA read/write operations on a drive. */
  633. int sis5513_dmaproc (ide_dma_action_t func, ide_drive_t *drive)
  634. {
  635. switch (func) {
  636. case ide_dma_check:
  637. config_drive_art_rwp(drive);
  638. config_art_rwp_pio(drive, 5);
  639. return config_drive_xfer_rate(drive);
  640. default:
  641. break;
  642. }
  643. return ide_dmaproc(func, drive); /* use standard DMA stuff */
  644. }
  645. #endif /* CONFIG_BLK_DEV_IDEDMA */
  646. /* Chip detection and general config */
  647. unsigned int __init pci_init_sis5513 (struct pci_dev *dev, const char *name)
  648. {
  649. struct pci_dev *host;
  650. int i = 0;
  651. /* Find the chip */
  652. for (i = 0; i < ARRAY_SIZE(SiSHostChipInfo) && !host_dev; i++) {
  653. host = pci_find_device (PCI_VENDOR_ID_SI,
  654. SiSHostChipInfo[i].host_id,
  655. NULL);
  656. if (!host)
  657. continue;
  658. host_dev = host;
  659. chipset_family = SiSHostChipInfo[i].chipset_family;
  660. printk(SiSHostChipInfo[i].name);
  661. printk("n");
  662. #ifdef DEBUG
  663. sis5513_print_registers(dev, "pci_init_sis5513 start");
  664. #endif
  665. if (SiSHostChipInfo[i].flags & SIS5513_LATENCY) {
  666. byte latency = (chipset_family == ATA_100)? 0x80 : 0x10; /* Lacking specs */
  667. pci_write_config_byte(dev, PCI_LATENCY_TIMER, latency);
  668. }
  669. }
  670. /* Make general config ops here
  671.    1/ tell IDE channels to operate in Compabitility mode only
  672.    2/ tell old chips to allow per drive IDE timings */
  673. if (host_dev) {
  674. byte reg;
  675. switch(chipset_family) {
  676. case ATA_133:
  677. case ATA_100:
  678. /* Set compatibility bit */
  679. pci_read_config_byte(dev, 0x49, &reg);
  680. if (!(reg & 0x01)) {
  681. pci_write_config_byte(dev, 0x49, reg|0x01);
  682. }
  683. break;
  684. case ATA_100a:
  685. case ATA_66:
  686. /* On ATA_66 chips the bit was elsewhere */
  687. pci_read_config_byte(dev, 0x52, &reg);
  688. if (!(reg & 0x04)) {
  689. pci_write_config_byte(dev, 0x52, reg|0x04);
  690. }
  691. break;
  692. case ATA_33:
  693. /* On ATA_33 we didn't have a single bit to set */
  694. pci_read_config_byte(dev, 0x09, &reg);
  695. if ((reg & 0x0f) != 0x00) {
  696. pci_write_config_byte(dev, 0x09, reg&0xf0);
  697. }
  698. case ATA_16:
  699. /* force per drive recovery and active timings
  700.    needed on ATA_33 and below chips */
  701. pci_read_config_byte(dev, 0x52, &reg);
  702. if (!(reg & 0x08)) {
  703. pci_write_config_byte(dev, 0x52, reg|0x08);
  704. }
  705. break;
  706. case ATA_00:
  707. default: break;
  708. }
  709. #if defined(DISPLAY_SIS_TIMINGS) && defined(CONFIG_PROC_FS)
  710. if (!sis_proc) {
  711. sis_proc = 1;
  712. bmide_dev = dev;
  713. sis_display_info = &sis_get_info;
  714. }
  715. #endif
  716. }
  717. #ifdef DEBUG
  718. sis5513_load_verify_registers(dev, "pci_init_sis5513 end");
  719. #endif
  720. return 0;
  721. }
  722. unsigned int __init ata66_sis5513 (ide_hwif_t *hwif)
  723. {
  724. byte reg48h = 0, ata66 = 0;
  725. byte mask = hwif->channel ? 0x20 : 0x10;
  726. pci_read_config_byte(hwif->pci_dev, 0x48, &reg48h);
  727. if (chipset_family >= ATA_66) {
  728. ata66 = (reg48h & mask) ? 0 : 1;
  729. }
  730.         return ata66;
  731. }
  732. void __init ide_init_sis5513 (ide_hwif_t *hwif)
  733. {
  734. hwif->irq = hwif->channel ? 15 : 14;
  735. hwif->tuneproc = &sis5513_tune_drive;
  736. hwif->speedproc = &sis5513_tune_chipset;
  737. if (!(hwif->dma_base))
  738. return;
  739. if (host_dev) {
  740. #ifdef CONFIG_BLK_DEV_IDEDMA
  741. if (chipset_family > ATA_16) {
  742. hwif->autodma = noautodma ? 0 : 1;
  743. hwif->dmaproc = &sis5513_dmaproc;
  744. } else {
  745. #endif
  746. hwif->autodma = 0;
  747. #ifdef CONFIG_BLK_DEV_IDEDMA
  748. }
  749. #endif
  750. }
  751. return;
  752. }