cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pata_rdc.c (10281B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  pata_rdc		-	Driver for later RDC PATA controllers
      4 *
      5 *  This is actually a driver for hardware meeting
      6 *  INCITS 370-2004 (1510D): ATA Host Adapter Standards
      7 *
      8 *  Based on ata_piix.
      9 */
     10
     11#include <linux/kernel.h>
     12#include <linux/module.h>
     13#include <linux/pci.h>
     14#include <linux/blkdev.h>
     15#include <linux/delay.h>
     16#include <linux/device.h>
     17#include <linux/gfp.h>
     18#include <scsi/scsi_host.h>
     19#include <linux/libata.h>
     20#include <linux/dmi.h>
     21
     22#define DRV_NAME	"pata_rdc"
     23#define DRV_VERSION	"0.01"
     24
     25struct rdc_host_priv {
     26	u32 saved_iocfg;
     27};
     28
     29/**
     30 *	rdc_pata_cable_detect - Probe host controller cable detect info
     31 *	@ap: Port for which cable detect info is desired
     32 *
     33 *	Read 80c cable indicator from ATA PCI device's PCI config
     34 *	register.  This register is normally set by firmware (BIOS).
     35 *
     36 *	LOCKING:
     37 *	None (inherited from caller).
     38 */
     39
     40static int rdc_pata_cable_detect(struct ata_port *ap)
     41{
     42	struct rdc_host_priv *hpriv = ap->host->private_data;
     43	u8 mask;
     44
     45	/* check BIOS cable detect results */
     46	mask = 0x30 << (2 * ap->port_no);
     47	if ((hpriv->saved_iocfg & mask) == 0)
     48		return ATA_CBL_PATA40;
     49	return ATA_CBL_PATA80;
     50}
     51
     52/**
     53 *	rdc_pata_prereset - prereset for PATA host controller
     54 *	@link: Target link
     55 *	@deadline: deadline jiffies for the operation
     56 *
     57 *	LOCKING:
     58 *	None (inherited from caller).
     59 */
     60static int rdc_pata_prereset(struct ata_link *link, unsigned long deadline)
     61{
     62	struct ata_port *ap = link->ap;
     63	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
     64
     65	static const struct pci_bits rdc_enable_bits[] = {
     66		{ 0x41U, 1U, 0x80UL, 0x80UL },	/* port 0 */
     67		{ 0x43U, 1U, 0x80UL, 0x80UL },	/* port 1 */
     68	};
     69
     70	if (!pci_test_config_bits(pdev, &rdc_enable_bits[ap->port_no]))
     71		return -ENOENT;
     72	return ata_sff_prereset(link, deadline);
     73}
     74
     75static DEFINE_SPINLOCK(rdc_lock);
     76
     77/**
     78 *	rdc_set_piomode - Initialize host controller PATA PIO timings
     79 *	@ap: Port whose timings we are configuring
     80 *	@adev: um
     81 *
     82 *	Set PIO mode for device, in host controller PCI config space.
     83 *
     84 *	LOCKING:
     85 *	None (inherited from caller).
     86 */
     87
     88static void rdc_set_piomode(struct ata_port *ap, struct ata_device *adev)
     89{
     90	unsigned int pio	= adev->pio_mode - XFER_PIO_0;
     91	struct pci_dev *dev	= to_pci_dev(ap->host->dev);
     92	unsigned long flags;
     93	unsigned int is_slave	= (adev->devno != 0);
     94	unsigned int master_port= ap->port_no ? 0x42 : 0x40;
     95	unsigned int slave_port	= 0x44;
     96	u16 master_data;
     97	u8 slave_data;
     98	u8 udma_enable;
     99	int control = 0;
    100
    101	static const	 /* ISP  RTC */
    102	u8 timings[][2]	= { { 0, 0 },
    103			    { 0, 0 },
    104			    { 1, 0 },
    105			    { 2, 1 },
    106			    { 2, 3 }, };
    107
    108	if (pio >= 2)
    109		control |= 1;	/* TIME1 enable */
    110	if (ata_pio_need_iordy(adev))
    111		control |= 2;	/* IE enable */
    112
    113	if (adev->class == ATA_DEV_ATA)
    114		control |= 4;	/* PPE enable */
    115
    116	spin_lock_irqsave(&rdc_lock, flags);
    117
    118	/* PIO configuration clears DTE unconditionally.  It will be
    119	 * programmed in set_dmamode which is guaranteed to be called
    120	 * after set_piomode if any DMA mode is available.
    121	 */
    122	pci_read_config_word(dev, master_port, &master_data);
    123	if (is_slave) {
    124		/* clear TIME1|IE1|PPE1|DTE1 */
    125		master_data &= 0xff0f;
    126		/* Enable SITRE (separate slave timing register) */
    127		master_data |= 0x4000;
    128		/* enable PPE1, IE1 and TIME1 as needed */
    129		master_data |= (control << 4);
    130		pci_read_config_byte(dev, slave_port, &slave_data);
    131		slave_data &= (ap->port_no ? 0x0f : 0xf0);
    132		/* Load the timing nibble for this slave */
    133		slave_data |= ((timings[pio][0] << 2) | timings[pio][1])
    134						<< (ap->port_no ? 4 : 0);
    135	} else {
    136		/* clear ISP|RCT|TIME0|IE0|PPE0|DTE0 */
    137		master_data &= 0xccf0;
    138		/* Enable PPE, IE and TIME as appropriate */
    139		master_data |= control;
    140		/* load ISP and RCT */
    141		master_data |=
    142			(timings[pio][0] << 12) |
    143			(timings[pio][1] << 8);
    144	}
    145	pci_write_config_word(dev, master_port, master_data);
    146	if (is_slave)
    147		pci_write_config_byte(dev, slave_port, slave_data);
    148
    149	/* Ensure the UDMA bit is off - it will be turned back on if
    150	   UDMA is selected */
    151
    152	pci_read_config_byte(dev, 0x48, &udma_enable);
    153	udma_enable &= ~(1 << (2 * ap->port_no + adev->devno));
    154	pci_write_config_byte(dev, 0x48, udma_enable);
    155
    156	spin_unlock_irqrestore(&rdc_lock, flags);
    157}
    158
    159/**
    160 *	rdc_set_dmamode - Initialize host controller PATA PIO timings
    161 *	@ap: Port whose timings we are configuring
    162 *	@adev: Drive in question
    163 *
    164 *	Set UDMA mode for device, in host controller PCI config space.
    165 *
    166 *	LOCKING:
    167 *	None (inherited from caller).
    168 */
    169
    170static void rdc_set_dmamode(struct ata_port *ap, struct ata_device *adev)
    171{
    172	struct pci_dev *dev	= to_pci_dev(ap->host->dev);
    173	unsigned long flags;
    174	u8 master_port		= ap->port_no ? 0x42 : 0x40;
    175	u16 master_data;
    176	u8 speed		= adev->dma_mode;
    177	int devid		= adev->devno + 2 * ap->port_no;
    178	u8 udma_enable		= 0;
    179
    180	static const	 /* ISP  RTC */
    181	u8 timings[][2]	= { { 0, 0 },
    182			    { 0, 0 },
    183			    { 1, 0 },
    184			    { 2, 1 },
    185			    { 2, 3 }, };
    186
    187	spin_lock_irqsave(&rdc_lock, flags);
    188
    189	pci_read_config_word(dev, master_port, &master_data);
    190	pci_read_config_byte(dev, 0x48, &udma_enable);
    191
    192	if (speed >= XFER_UDMA_0) {
    193		unsigned int udma = adev->dma_mode - XFER_UDMA_0;
    194		u16 udma_timing;
    195		u16 ideconf;
    196		int u_clock, u_speed;
    197
    198		/*
    199		 * UDMA is handled by a combination of clock switching and
    200		 * selection of dividers
    201		 *
    202		 * Handy rule: Odd modes are UDMATIMx 01, even are 02
    203		 *	       except UDMA0 which is 00
    204		 */
    205		u_speed = min(2 - (udma & 1), udma);
    206		if (udma == 5)
    207			u_clock = 0x1000;	/* 100Mhz */
    208		else if (udma > 2)
    209			u_clock = 1;		/* 66Mhz */
    210		else
    211			u_clock = 0;		/* 33Mhz */
    212
    213		udma_enable |= (1 << devid);
    214
    215		/* Load the CT/RP selection */
    216		pci_read_config_word(dev, 0x4A, &udma_timing);
    217		udma_timing &= ~(3 << (4 * devid));
    218		udma_timing |= u_speed << (4 * devid);
    219		pci_write_config_word(dev, 0x4A, udma_timing);
    220
    221		/* Select a 33/66/100Mhz clock */
    222		pci_read_config_word(dev, 0x54, &ideconf);
    223		ideconf &= ~(0x1001 << devid);
    224		ideconf |= u_clock << devid;
    225		pci_write_config_word(dev, 0x54, ideconf);
    226	} else {
    227		/*
    228		 * MWDMA is driven by the PIO timings. We must also enable
    229		 * IORDY unconditionally along with TIME1. PPE has already
    230		 * been set when the PIO timing was set.
    231		 */
    232		unsigned int mwdma	= adev->dma_mode - XFER_MW_DMA_0;
    233		unsigned int control;
    234		u8 slave_data;
    235		const unsigned int needed_pio[3] = {
    236			XFER_PIO_0, XFER_PIO_3, XFER_PIO_4
    237		};
    238		int pio = needed_pio[mwdma] - XFER_PIO_0;
    239
    240		control = 3;	/* IORDY|TIME1 */
    241
    242		/* If the drive MWDMA is faster than it can do PIO then
    243		   we must force PIO into PIO0 */
    244
    245		if (adev->pio_mode < needed_pio[mwdma])
    246			/* Enable DMA timing only */
    247			control |= 8;	/* PIO cycles in PIO0 */
    248
    249		if (adev->devno) {	/* Slave */
    250			master_data &= 0xFF4F;  /* Mask out IORDY|TIME1|DMAONLY */
    251			master_data |= control << 4;
    252			pci_read_config_byte(dev, 0x44, &slave_data);
    253			slave_data &= (ap->port_no ? 0x0f : 0xf0);
    254			/* Load the matching timing */
    255			slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << (ap->port_no ? 4 : 0);
    256			pci_write_config_byte(dev, 0x44, slave_data);
    257		} else { 	/* Master */
    258			master_data &= 0xCCF4;	/* Mask out IORDY|TIME1|DMAONLY
    259						   and master timing bits */
    260			master_data |= control;
    261			master_data |=
    262				(timings[pio][0] << 12) |
    263				(timings[pio][1] << 8);
    264		}
    265
    266		udma_enable &= ~(1 << devid);
    267		pci_write_config_word(dev, master_port, master_data);
    268	}
    269	pci_write_config_byte(dev, 0x48, udma_enable);
    270
    271	spin_unlock_irqrestore(&rdc_lock, flags);
    272}
    273
    274static struct ata_port_operations rdc_pata_ops = {
    275	.inherits		= &ata_bmdma32_port_ops,
    276	.cable_detect		= rdc_pata_cable_detect,
    277	.set_piomode		= rdc_set_piomode,
    278	.set_dmamode		= rdc_set_dmamode,
    279	.prereset		= rdc_pata_prereset,
    280};
    281
    282static const struct ata_port_info rdc_port_info = {
    283
    284	.flags		= ATA_FLAG_SLAVE_POSS,
    285	.pio_mask	= ATA_PIO4,
    286	.mwdma_mask	= ATA_MWDMA12_ONLY,
    287	.udma_mask	= ATA_UDMA5,
    288	.port_ops	= &rdc_pata_ops,
    289};
    290
    291static struct scsi_host_template rdc_sht = {
    292	ATA_BMDMA_SHT(DRV_NAME),
    293};
    294
    295/**
    296 *	rdc_init_one - Register PIIX ATA PCI device with kernel services
    297 *	@pdev: PCI device to register
    298 *	@ent: Entry in rdc_pci_tbl matching with @pdev
    299 *
    300 *	Called from kernel PCI layer.  We probe for combined mode (sigh),
    301 *	and then hand over control to libata, for it to do the rest.
    302 *
    303 *	LOCKING:
    304 *	Inherited from PCI layer (may sleep).
    305 *
    306 *	RETURNS:
    307 *	Zero on success, or -ERRNO value.
    308 */
    309
    310static int rdc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
    311{
    312	struct device *dev = &pdev->dev;
    313	struct ata_port_info port_info[2];
    314	const struct ata_port_info *ppi[] = { &port_info[0], &port_info[1] };
    315	struct ata_host *host;
    316	struct rdc_host_priv *hpriv;
    317	int rc;
    318
    319	ata_print_version_once(&pdev->dev, DRV_VERSION);
    320
    321	port_info[0] = rdc_port_info;
    322	port_info[1] = rdc_port_info;
    323
    324	/* enable device and prepare host */
    325	rc = pcim_enable_device(pdev);
    326	if (rc)
    327		return rc;
    328
    329	hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
    330	if (!hpriv)
    331		return -ENOMEM;
    332
    333	/* Save IOCFG, this will be used for cable detection, quirk
    334	 * detection and restoration on detach.
    335	 */
    336	pci_read_config_dword(pdev, 0x54, &hpriv->saved_iocfg);
    337
    338	rc = ata_pci_bmdma_prepare_host(pdev, ppi, &host);
    339	if (rc)
    340		return rc;
    341	host->private_data = hpriv;
    342
    343	pci_intx(pdev, 1);
    344
    345	host->flags |= ATA_HOST_PARALLEL_SCAN;
    346
    347	pci_set_master(pdev);
    348	return ata_pci_sff_activate_host(host, ata_bmdma_interrupt, &rdc_sht);
    349}
    350
    351static void rdc_remove_one(struct pci_dev *pdev)
    352{
    353	struct ata_host *host = pci_get_drvdata(pdev);
    354	struct rdc_host_priv *hpriv = host->private_data;
    355
    356	pci_write_config_dword(pdev, 0x54, hpriv->saved_iocfg);
    357
    358	ata_pci_remove_one(pdev);
    359}
    360
    361static const struct pci_device_id rdc_pci_tbl[] = {
    362	{ PCI_DEVICE(0x17F3, 0x1011), },
    363	{ PCI_DEVICE(0x17F3, 0x1012), },
    364	{ }	/* terminate list */
    365};
    366
    367static struct pci_driver rdc_pci_driver = {
    368	.name			= DRV_NAME,
    369	.id_table		= rdc_pci_tbl,
    370	.probe			= rdc_init_one,
    371	.remove			= rdc_remove_one,
    372#ifdef CONFIG_PM_SLEEP
    373	.suspend		= ata_pci_device_suspend,
    374	.resume			= ata_pci_device_resume,
    375#endif
    376};
    377
    378
    379module_pci_driver(rdc_pci_driver);
    380
    381MODULE_AUTHOR("Alan Cox (based on ata_piix)");
    382MODULE_DESCRIPTION("SCSI low-level driver for RDC PATA controllers");
    383MODULE_LICENSE("GPL");
    384MODULE_DEVICE_TABLE(pci, rdc_pci_tbl);
    385MODULE_VERSION(DRV_VERSION);