Blame view

drivers/ata/pata_mpiix.c 6.91 KB
09c434b8a   Thomas Gleixner   treewide: Add SPD...
1
  // SPDX-License-Identifier: GPL-2.0-only
669a5db41   Jeff Garzik   [libata] Add a bu...
2
3
4
  /*
   * pata_mpiix.c 	- Intel MPIIX PATA for new ATA layer
   *			  (C) 2005-2006 Red Hat Inc
ab7716300   Alan Cox   ata: Switch all m...
5
   *			  Alan Cox <alan@lxorguk.ukuu.org.uk>
669a5db41   Jeff Garzik   [libata] Add a bu...
6
7
8
9
10
11
12
13
14
15
16
17
18
   *
   * The MPIIX is different enough to the PIIX4 and friends that we give it
   * a separate driver. The old ide/pci code handles this by just not tuning
   * MPIIX at all.
   *
   * The MPIIX also differs in another important way from the majority of PIIX
   * devices. The chip is a bridge (pardon the pun) between the old world of
   * ISA IDE and PCI IDE. Although the ATA timings are PCI configured the actual
   * IDE controller is not decoded in PCI space and the chip does not claim to
   * be IDE class PCI. This requires slightly non-standard probe logic compared
   * with PCI IDE and also that we do not disable the device when our driver is
   * unloaded (as it has many other functions).
   *
25985edce   Lucas De Marchi   Fix common misspe...
19
   * The driver consciously keeps this logic internally to avoid pushing quirky
669a5db41   Jeff Garzik   [libata] Add a bu...
20
21
   * PATA history into the clean libata layer.
   *
c961922b7   Alan Cox   [PATCH] libata-eh...
22
   * Thinkpad specific note: If you boot an MPIIX using a thinkpad with a PCMCIA
669a5db41   Jeff Garzik   [libata] Add a bu...
23
24
25
26
27
28
29
30
31
   * hard disk present this driver will not detect it. This is not a bug. In this
   * configuration the secondary port of the MPIIX is disabled and the addresses
   * are decoded by the PCMCIA bridge and therefore are for a generic IDE driver
   * to operate.
   */
  
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/pci.h>
669a5db41   Jeff Garzik   [libata] Add a bu...
32
33
34
35
36
37
  #include <linux/blkdev.h>
  #include <linux/delay.h>
  #include <scsi/scsi_host.h>
  #include <linux/libata.h>
  
  #define DRV_NAME "pata_mpiix"
871af1210   Alan Cox   libata: Add 32bit...
38
  #define DRV_VERSION "0.7.7"
669a5db41   Jeff Garzik   [libata] Add a bu...
39
40
41
42
43
44
45
46
47
  
  enum {
  	IDETIM = 0x6C,		/* IDE control register */
  	IORDY = (1 << 1),
  	PPE = (1 << 2),
  	FTIM = (1 << 0),
  	ENABLED = (1 << 15),
  	SECONDARY = (1 << 14)
  };
cc0680a58   Tejun Heo   libata-link: link...
48
  static int mpiix_pre_reset(struct ata_link *link, unsigned long deadline)
669a5db41   Jeff Garzik   [libata] Add a bu...
49
  {
cc0680a58   Tejun Heo   libata-link: link...
50
  	struct ata_port *ap = link->ap;
669a5db41   Jeff Garzik   [libata] Add a bu...
51
  	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
92ae78493   Sergei Shtylyov   (2.6.20) pata_mpi...
52
  	static const struct pci_bits mpiix_enable_bits = { 0x6D, 1, 0x80, 0x80 };
669a5db41   Jeff Garzik   [libata] Add a bu...
53

92ae78493   Sergei Shtylyov   (2.6.20) pata_mpi...
54
  	if (!pci_test_config_bits(pdev, &mpiix_enable_bits))
c961922b7   Alan Cox   [PATCH] libata-eh...
55
  		return -ENOENT;
d4b2bab4f   Tejun Heo   libata: add deadl...
56

9363c3825   Tejun Heo   libata: rename SF...
57
  	return ata_sff_prereset(link, deadline);
669a5db41   Jeff Garzik   [libata] Add a bu...
58
59
60
  }
  
  /**
669a5db41   Jeff Garzik   [libata] Add a bu...
61
62
63
64
65
   *	mpiix_set_piomode	-	set initial PIO mode data
   *	@ap: ATA interface
   *	@adev: ATA device
   *
   *	Called to do the PIO mode setup. The MPIIX allows us to program the
7b4f1a13f   Sergei Shtylyov   (2.6.20) pata_mpi...
66
67
   *	IORDY sample point (2-5 clocks), recovery (1-4 clocks) and whether
   *	prefetching or IORDY are used.
669a5db41   Jeff Garzik   [libata] Add a bu...
68
69
70
   *
   *	This would get very ugly because we can only program timing for one
   *	device at a time, the other gets PIO0. Fortunately libata calls
9363c3825   Tejun Heo   libata: rename SF...
71
72
   *	our qc_issue command before a command is issued so we can flip the
   *	timings back and forth to reduce the pain.
669a5db41   Jeff Garzik   [libata] Add a bu...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
   */
  
  static void mpiix_set_piomode(struct ata_port *ap, struct ata_device *adev)
  {
  	int control = 0;
  	int pio = adev->pio_mode - XFER_PIO_0;
  	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
  	u16 idetim;
  	static const	 /* ISP  RTC */
  	u8 timings[][2]	= { { 0, 0 },
  			    { 0, 0 },
  			    { 1, 0 },
  			    { 2, 1 },
  			    { 2, 3 }, };
  
  	pci_read_config_word(pdev, IDETIM, &idetim);
7b4f1a13f   Sergei Shtylyov   (2.6.20) pata_mpi...
89
90
  
  	/* Mask the IORDY/TIME/PPE for this device */
669a5db41   Jeff Garzik   [libata] Add a bu...
91
  	if (adev->class == ATA_DEV_ATA)
7b4f1a13f   Sergei Shtylyov   (2.6.20) pata_mpi...
92
  		control |= PPE;		/* Enable prefetch/posting for disk */
669a5db41   Jeff Garzik   [libata] Add a bu...
93
  	if (ata_pio_need_iordy(adev))
7b4f1a13f   Sergei Shtylyov   (2.6.20) pata_mpi...
94
95
  		control |= IORDY;
  	if (pio > 1)
669a5db41   Jeff Garzik   [libata] Add a bu...
96
97
98
99
  		control |= FTIM;	/* This drive is on the fast timing bank */
  
  	/* Mask out timing and clear both TIME bank selects */
  	idetim &= 0xCCEE;
7b4f1a13f   Sergei Shtylyov   (2.6.20) pata_mpi...
100
101
  	idetim &= ~(0x07  << (4 * adev->devno));
  	idetim |= control << (4 * adev->devno);
669a5db41   Jeff Garzik   [libata] Add a bu...
102
103
104
105
106
107
108
109
110
111
  
  	idetim |= (timings[pio][0] << 12) | (timings[pio][1] << 8);
  	pci_write_config_word(pdev, IDETIM, idetim);
  
  	/* We use ap->private_data as a pointer to the device currently
  	   loaded for timing */
  	ap->private_data = adev;
  }
  
  /**
9363c3825   Tejun Heo   libata: rename SF...
112
   *	mpiix_qc_issue		-	command issue
669a5db41   Jeff Garzik   [libata] Add a bu...
113
114
115
116
   *	@qc: command pending
   *
   *	Called when the libata layer is about to issue a command. We wrap
   *	this interface so that we can load the correct ATA timings if
3a4fa0a25   Robert P. J. Day   Fix misspellings ...
117
   *	necessary. Our logic also clears TIME0/TIME1 for the other device so
669a5db41   Jeff Garzik   [libata] Add a bu...
118
119
120
   *	that, even if we get this wrong, cycles to the other device will
   *	be made PIO0.
   */
9363c3825   Tejun Heo   libata: rename SF...
121
  static unsigned int mpiix_qc_issue(struct ata_queued_cmd *qc)
669a5db41   Jeff Garzik   [libata] Add a bu...
122
123
124
125
126
127
128
129
130
131
132
  {
  	struct ata_port *ap = qc->ap;
  	struct ata_device *adev = qc->dev;
  
  	/* If modes have been configured and the channel data is not loaded
  	   then load it. We have to check if pio_mode is set as the core code
  	   does not set adev->pio_mode to XFER_PIO_0 while probing as would be
  	   logical */
  
  	if (adev->pio_mode && adev != ap->private_data)
  		mpiix_set_piomode(ap, adev);
9363c3825   Tejun Heo   libata: rename SF...
133
  	return ata_sff_qc_issue(qc);
669a5db41   Jeff Garzik   [libata] Add a bu...
134
135
136
  }
  
  static struct scsi_host_template mpiix_sht = {
68d1d07b5   Tejun Heo   libata: implement...
137
  	ATA_PIO_SHT(DRV_NAME),
669a5db41   Jeff Garzik   [libata] Add a bu...
138
139
140
  };
  
  static struct ata_port_operations mpiix_port_ops = {
029cfd6b7   Tejun Heo   libata: implement...
141
  	.inherits	= &ata_sff_port_ops,
9363c3825   Tejun Heo   libata: rename SF...
142
  	.qc_issue	= mpiix_qc_issue,
029cfd6b7   Tejun Heo   libata: implement...
143
  	.cable_detect	= ata_cable_40wire,
669a5db41   Jeff Garzik   [libata] Add a bu...
144
  	.set_piomode	= mpiix_set_piomode,
a1efdaba2   Tejun Heo   libata: make rese...
145
  	.prereset	= mpiix_pre_reset,
871af1210   Alan Cox   libata: Add 32bit...
146
  	.sff_data_xfer	= ata_sff_data_xfer32,
669a5db41   Jeff Garzik   [libata] Add a bu...
147
148
149
150
151
  };
  
  static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
  {
  	/* Single threaded by the PCI probe logic */
5d728824e   Tejun Heo   libata: convert t...
152
153
  	struct ata_host *host;
  	struct ata_port *ap;
0d5ff5667   Tejun Heo   libata: convert t...
154
  	void __iomem *cmd_addr, *ctl_addr;
669a5db41   Jeff Garzik   [libata] Add a bu...
155
  	u16 idetim;
cbcdd8759   Tejun Heo   libata: implement...
156
  	int cmd, ctl, irq;
669a5db41   Jeff Garzik   [libata] Add a bu...
157

06296a1e6   Joe Perches   ata: Add and use ...
158
  	ata_print_version_once(&dev->dev, DRV_VERSION);
669a5db41   Jeff Garzik   [libata] Add a bu...
159

5d728824e   Tejun Heo   libata: convert t...
160
161
162
  	host = ata_host_alloc(&dev->dev, 1);
  	if (!host)
  		return -ENOMEM;
cbcdd8759   Tejun Heo   libata: implement...
163
  	ap = host->ports[0];
5d728824e   Tejun Heo   libata: convert t...
164

669a5db41   Jeff Garzik   [libata] Add a bu...
165
166
167
168
169
170
171
  	/* MPIIX has many functions which can be turned on or off according
  	   to other devices present. Make sure IDE is enabled before we try
  	   and use it */
  
  	pci_read_config_word(dev, IDETIM, &idetim);
  	if (!(idetim & ENABLED))
  		return -ENODEV;
92ae78493   Sergei Shtylyov   (2.6.20) pata_mpi...
172
  	/* See if it's primary or secondary channel... */
0d5ff5667   Tejun Heo   libata: convert t...
173
  	if (!(idetim & SECONDARY)) {
cbcdd8759   Tejun Heo   libata: implement...
174
175
  		cmd = 0x1F0;
  		ctl = 0x3F6;
0d5ff5667   Tejun Heo   libata: convert t...
176
  		irq = 14;
0d5ff5667   Tejun Heo   libata: convert t...
177
  	} else {
cbcdd8759   Tejun Heo   libata: implement...
178
179
  		cmd = 0x170;
  		ctl = 0x376;
0d5ff5667   Tejun Heo   libata: convert t...
180
  		irq = 15;
0d5ff5667   Tejun Heo   libata: convert t...
181
  	}
cbcdd8759   Tejun Heo   libata: implement...
182
183
  	cmd_addr = devm_ioport_map(&dev->dev, cmd, 8);
  	ctl_addr = devm_ioport_map(&dev->dev, ctl, 1);
0d5ff5667   Tejun Heo   libata: convert t...
184
185
  	if (!cmd_addr || !ctl_addr)
  		return -ENOMEM;
cbcdd8759   Tejun Heo   libata: implement...
186
  	ata_port_desc(ap, "cmd 0x%x ctl 0x%x", cmd, ctl);
669a5db41   Jeff Garzik   [libata] Add a bu...
187
188
189
190
191
  	/* We do our own plumbing to avoid leaking special cases for whacko
  	   ancient hardware into the core code. There are two issues to
  	   worry about.  #1 The chip is a bridge so if in legacy mode and
  	   without BARs set fools the setup.  #2 If you pci_disable_device
  	   the MPIIX your box goes castors up */
5d728824e   Tejun Heo   libata: convert t...
192
  	ap->ops = &mpiix_port_ops;
14bdef982   Erik Inge Bolsø   [libata] convert ...
193
  	ap->pio_mask = ATA_PIO4;
5d728824e   Tejun Heo   libata: convert t...
194
  	ap->flags |= ATA_FLAG_SLAVE_POSS;
92ae78493   Sergei Shtylyov   (2.6.20) pata_mpi...
195

5d728824e   Tejun Heo   libata: convert t...
196
197
198
  	ap->ioaddr.cmd_addr = cmd_addr;
  	ap->ioaddr.ctl_addr = ctl_addr;
  	ap->ioaddr.altstatus_addr = ctl_addr;
669a5db41   Jeff Garzik   [libata] Add a bu...
199
200
  
  	/* Let libata fill in the port details */
9363c3825   Tejun Heo   libata: rename SF...
201
  	ata_sff_std_ports(&ap->ioaddr);
669a5db41   Jeff Garzik   [libata] Add a bu...
202

5d728824e   Tejun Heo   libata: convert t...
203
  	/* activate host */
9363c3825   Tejun Heo   libata: rename SF...
204
  	return ata_host_activate(host, irq, ata_sff_interrupt, IRQF_SHARED,
5d728824e   Tejun Heo   libata: convert t...
205
  				 &mpiix_sht);
669a5db41   Jeff Garzik   [libata] Add a bu...
206
  }
669a5db41   Jeff Garzik   [libata] Add a bu...
207
  static const struct pci_device_id mpiix[] = {
2d2744fc8   Jeff Garzik   [libata] PCI ID t...
208
209
210
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82371MX), },
  
  	{ },
669a5db41   Jeff Garzik   [libata] Add a bu...
211
212
213
214
215
216
  };
  
  static struct pci_driver mpiix_pci_driver = {
  	.name 		= DRV_NAME,
  	.id_table	= mpiix,
  	.probe 		= mpiix_init_one,
24dc5f33e   Tejun Heo   libata: update li...
217
  	.remove		= ata_pci_remove_one,
58eb8cd56   Bartlomiej Zolnierkiewicz   ata: use CONFIG_P...
218
  #ifdef CONFIG_PM_SLEEP
30ced0f0d   Alan Cox   [PATCH] PATA liba...
219
220
  	.suspend	= ata_pci_device_suspend,
  	.resume		= ata_pci_device_resume,
438ac6d5e   Tejun Heo   libata: add missi...
221
  #endif
669a5db41   Jeff Garzik   [libata] Add a bu...
222
  };
2fc75da0c   Axel Lin   ata: use module_p...
223
  module_pci_driver(mpiix_pci_driver);
669a5db41   Jeff Garzik   [libata] Add a bu...
224

669a5db41   Jeff Garzik   [libata] Add a bu...
225
226
227
228
229
  MODULE_AUTHOR("Alan Cox");
  MODULE_DESCRIPTION("low-level driver for Intel MPIIX");
  MODULE_LICENSE("GPL");
  MODULE_DEVICE_TABLE(pci, mpiix);
  MODULE_VERSION(DRV_VERSION);