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_cmd64x.c (13286B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * pata_cmd64x.c 	- CMD64x PATA for new ATA layer
      4 *			  (C) 2005 Red Hat Inc
      5 *			  Alan Cox <alan@lxorguk.ukuu.org.uk>
      6 *			  (C) 2009-2010 Bartlomiej Zolnierkiewicz
      7 *			  (C) 2012 MontaVista Software, LLC <source@mvista.com>
      8 *
      9 * Based upon
     10 * linux/drivers/ide/pci/cmd64x.c		Version 1.30	Sept 10, 2002
     11 *
     12 * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines.
     13 *           Note, this driver is not used at all on other systems because
     14 *           there the "BIOS" has done all of the following already.
     15 *           Due to massive hardware bugs, UltraDMA is only supported
     16 *           on the 646U2 and not on the 646U.
     17 *
     18 * Copyright (C) 1998		Eddie C. Dost  (ecd@skynet.be)
     19 * Copyright (C) 1998		David S. Miller (davem@redhat.com)
     20 *
     21 * Copyright (C) 1999-2002	Andre Hedrick <andre@linux-ide.org>
     22 *
     23 * TODO
     24 *	Testing work
     25 */
     26
     27#include <linux/kernel.h>
     28#include <linux/module.h>
     29#include <linux/pci.h>
     30#include <linux/blkdev.h>
     31#include <linux/delay.h>
     32#include <scsi/scsi_host.h>
     33#include <linux/libata.h>
     34
     35#define DRV_NAME "pata_cmd64x"
     36#define DRV_VERSION "0.2.18"
     37
     38/*
     39 * CMD64x specific registers definition.
     40 */
     41
     42enum {
     43	CFR 		= 0x50,
     44		CFR_INTR_CH0  = 0x04,
     45	CNTRL		= 0x51,
     46		CNTRL_CH0     = 0x04,
     47		CNTRL_CH1     = 0x08,
     48	CMDTIM 		= 0x52,
     49	ARTTIM0 	= 0x53,
     50	DRWTIM0 	= 0x54,
     51	ARTTIM1 	= 0x55,
     52	DRWTIM1 	= 0x56,
     53	ARTTIM23 	= 0x57,
     54		ARTTIM23_DIS_RA2  = 0x04,
     55		ARTTIM23_DIS_RA3  = 0x08,
     56		ARTTIM23_INTR_CH1 = 0x10,
     57	DRWTIM2 	= 0x58,
     58	BRST 		= 0x59,
     59	DRWTIM3 	= 0x5b,
     60	BMIDECR0	= 0x70,
     61	MRDMODE		= 0x71,
     62		MRDMODE_INTR_CH0 = 0x04,
     63		MRDMODE_INTR_CH1 = 0x08,
     64	BMIDESR0	= 0x72,
     65	UDIDETCR0	= 0x73,
     66	DTPR0		= 0x74,
     67	BMIDECR1	= 0x78,
     68	BMIDECSR	= 0x79,
     69	UDIDETCR1	= 0x7B,
     70	DTPR1		= 0x7C
     71};
     72
     73static int cmd648_cable_detect(struct ata_port *ap)
     74{
     75	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
     76	u8 r;
     77
     78	/* Check cable detect bits */
     79	pci_read_config_byte(pdev, BMIDECSR, &r);
     80	if (r & (1 << ap->port_no))
     81		return ATA_CBL_PATA80;
     82	return ATA_CBL_PATA40;
     83}
     84
     85/**
     86 *	cmd64x_set_timing	-	set PIO and MWDMA timing
     87 *	@ap: ATA interface
     88 *	@adev: ATA device
     89 *	@mode: mode
     90 *
     91 *	Called to do the PIO and MWDMA mode setup.
     92 */
     93
     94static void cmd64x_set_timing(struct ata_port *ap, struct ata_device *adev, u8 mode)
     95{
     96	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
     97	struct ata_timing t;
     98	const unsigned long T = 1000000 / 33;
     99	const u8 setup_data[] = { 0x40, 0x40, 0x40, 0x80, 0x00 };
    100
    101	u8 reg;
    102
    103	/* Port layout is not logical so use a table */
    104	const u8 arttim_port[2][2] = {
    105		{ ARTTIM0, ARTTIM1 },
    106		{ ARTTIM23, ARTTIM23 }
    107	};
    108	const u8 drwtim_port[2][2] = {
    109		{ DRWTIM0, DRWTIM1 },
    110		{ DRWTIM2, DRWTIM3 }
    111	};
    112
    113	int arttim = arttim_port[ap->port_no][adev->devno];
    114	int drwtim = drwtim_port[ap->port_no][adev->devno];
    115
    116	/* ata_timing_compute is smart and will produce timings for MWDMA
    117	   that don't violate the drives PIO capabilities. */
    118	if (ata_timing_compute(adev, mode, &t, T, 0) < 0) {
    119		ata_dev_err(adev, DRV_NAME ": mode computation failed.\n");
    120		return;
    121	}
    122	if (ap->port_no) {
    123		/* Slave has shared address setup */
    124		struct ata_device *pair = ata_dev_pair(adev);
    125
    126		if (pair) {
    127			struct ata_timing tp;
    128			ata_timing_compute(pair, pair->pio_mode, &tp, T, 0);
    129			ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP);
    130		}
    131	}
    132
    133	ata_dev_dbg(adev, DRV_NAME ": active %d recovery %d setup %d.\n",
    134		t.active, t.recover, t.setup);
    135	if (t.recover > 16) {
    136		t.active += t.recover - 16;
    137		t.recover = 16;
    138	}
    139	if (t.active > 16)
    140		t.active = 16;
    141
    142	/* Now convert the clocks into values we can actually stuff into
    143	   the chip */
    144
    145	if (t.recover == 16)
    146		t.recover = 0;
    147	else if (t.recover > 1)
    148		t.recover--;
    149	else
    150		t.recover = 15;
    151
    152	if (t.setup > 4)
    153		t.setup = 0xC0;
    154	else
    155		t.setup = setup_data[t.setup];
    156
    157	t.active &= 0x0F;	/* 0 = 16 */
    158
    159	/* Load setup timing */
    160	pci_read_config_byte(pdev, arttim, &reg);
    161	reg &= 0x3F;
    162	reg |= t.setup;
    163	pci_write_config_byte(pdev, arttim, reg);
    164
    165	/* Load active/recovery */
    166	pci_write_config_byte(pdev, drwtim, (t.active << 4) | t.recover);
    167}
    168
    169/**
    170 *	cmd64x_set_piomode	-	set initial PIO mode data
    171 *	@ap: ATA interface
    172 *	@adev: ATA device
    173 *
    174 *	Used when configuring the devices ot set the PIO timings. All the
    175 *	actual work is done by the PIO/MWDMA setting helper
    176 */
    177
    178static void cmd64x_set_piomode(struct ata_port *ap, struct ata_device *adev)
    179{
    180	cmd64x_set_timing(ap, adev, adev->pio_mode);
    181}
    182
    183/**
    184 *	cmd64x_set_dmamode	-	set initial DMA mode data
    185 *	@ap: ATA interface
    186 *	@adev: ATA device
    187 *
    188 *	Called to do the DMA mode setup.
    189 */
    190
    191static void cmd64x_set_dmamode(struct ata_port *ap, struct ata_device *adev)
    192{
    193	static const u8 udma_data[] = {
    194		0x30, 0x20, 0x10, 0x20, 0x10, 0x00
    195	};
    196
    197	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
    198	u8 regU, regD;
    199
    200	int pciU = UDIDETCR0 + 8 * ap->port_no;
    201	int pciD = BMIDESR0 + 8 * ap->port_no;
    202	int shift = 2 * adev->devno;
    203
    204	pci_read_config_byte(pdev, pciD, &regD);
    205	pci_read_config_byte(pdev, pciU, &regU);
    206
    207	/* DMA bits off */
    208	regD &= ~(0x20 << adev->devno);
    209	/* DMA control bits */
    210	regU &= ~(0x30 << shift);
    211	/* DMA timing bits */
    212	regU &= ~(0x05 << adev->devno);
    213
    214	if (adev->dma_mode >= XFER_UDMA_0) {
    215		/* Merge the timing value */
    216		regU |= udma_data[adev->dma_mode - XFER_UDMA_0] << shift;
    217		/* Merge the control bits */
    218		regU |= 1 << adev->devno; /* UDMA on */
    219		if (adev->dma_mode > XFER_UDMA_2) /* 15nS timing */
    220			regU |= 4 << adev->devno;
    221	} else {
    222		regU &= ~ (1 << adev->devno);	/* UDMA off */
    223		cmd64x_set_timing(ap, adev, adev->dma_mode);
    224	}
    225
    226	regD |= 0x20 << adev->devno;
    227
    228	pci_write_config_byte(pdev, pciU, regU);
    229	pci_write_config_byte(pdev, pciD, regD);
    230}
    231
    232/**
    233 *	cmd64x_sff_irq_check	-	check IDE interrupt
    234 *	@ap: ATA interface
    235 *
    236 *	Check IDE interrupt in CFR/ARTTIM23 registers.
    237 */
    238
    239static bool cmd64x_sff_irq_check(struct ata_port *ap)
    240{
    241	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
    242	int irq_mask = ap->port_no ? ARTTIM23_INTR_CH1 : CFR_INTR_CH0;
    243	int irq_reg  = ap->port_no ? ARTTIM23 : CFR;
    244	u8 irq_stat;
    245
    246	/* NOTE: reading the register should clear the interrupt */
    247	pci_read_config_byte(pdev, irq_reg, &irq_stat);
    248
    249	return irq_stat & irq_mask;
    250}
    251
    252/**
    253 *	cmd64x_sff_irq_clear	-	clear IDE interrupt
    254 *	@ap: ATA interface
    255 *
    256 *	Clear IDE interrupt in CFR/ARTTIM23 and DMA status registers.
    257 */
    258
    259static void cmd64x_sff_irq_clear(struct ata_port *ap)
    260{
    261	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
    262	int irq_reg = ap->port_no ? ARTTIM23 : CFR;
    263	u8 irq_stat;
    264
    265	ata_bmdma_irq_clear(ap);
    266
    267	/* Reading the register should be enough to clear the interrupt */
    268	pci_read_config_byte(pdev, irq_reg, &irq_stat);
    269}
    270
    271/**
    272 *	cmd648_sff_irq_check	-	check IDE interrupt
    273 *	@ap: ATA interface
    274 *
    275 *	Check IDE interrupt in MRDMODE register.
    276 */
    277
    278static bool cmd648_sff_irq_check(struct ata_port *ap)
    279{
    280	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
    281	unsigned long base = pci_resource_start(pdev, 4);
    282	int irq_mask = ap->port_no ? MRDMODE_INTR_CH1 : MRDMODE_INTR_CH0;
    283	u8 mrdmode = inb(base + 1);
    284
    285	return mrdmode & irq_mask;
    286}
    287
    288/**
    289 *	cmd648_sff_irq_clear	-	clear IDE interrupt
    290 *	@ap: ATA interface
    291 *
    292 *	Clear IDE interrupt in MRDMODE and DMA status registers.
    293 */
    294
    295static void cmd648_sff_irq_clear(struct ata_port *ap)
    296{
    297	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
    298	unsigned long base = pci_resource_start(pdev, 4);
    299	int irq_mask = ap->port_no ? MRDMODE_INTR_CH1 : MRDMODE_INTR_CH0;
    300	u8 mrdmode;
    301
    302	ata_bmdma_irq_clear(ap);
    303
    304	/* Clear this port's interrupt bit (leaving the other port alone) */
    305	mrdmode  = inb(base + 1);
    306	mrdmode &= ~(MRDMODE_INTR_CH0 | MRDMODE_INTR_CH1);
    307	outb(mrdmode | irq_mask, base + 1);
    308}
    309
    310/**
    311 *	cmd646r1_bmdma_stop	-	DMA stop callback
    312 *	@qc: Command in progress
    313 *
    314 *	Stub for now while investigating the r1 quirk in the old driver.
    315 */
    316
    317static void cmd646r1_bmdma_stop(struct ata_queued_cmd *qc)
    318{
    319	ata_bmdma_stop(qc);
    320}
    321
    322static struct scsi_host_template cmd64x_sht = {
    323	ATA_BMDMA_SHT(DRV_NAME),
    324};
    325
    326static const struct ata_port_operations cmd64x_base_ops = {
    327	.inherits	= &ata_bmdma_port_ops,
    328	.set_piomode	= cmd64x_set_piomode,
    329	.set_dmamode	= cmd64x_set_dmamode,
    330};
    331
    332static struct ata_port_operations cmd64x_port_ops = {
    333	.inherits	= &cmd64x_base_ops,
    334	.sff_irq_check	= cmd64x_sff_irq_check,
    335	.sff_irq_clear	= cmd64x_sff_irq_clear,
    336	.cable_detect	= ata_cable_40wire,
    337};
    338
    339static struct ata_port_operations cmd646r1_port_ops = {
    340	.inherits	= &cmd64x_base_ops,
    341	.sff_irq_check	= cmd64x_sff_irq_check,
    342	.sff_irq_clear	= cmd64x_sff_irq_clear,
    343	.bmdma_stop	= cmd646r1_bmdma_stop,
    344	.cable_detect	= ata_cable_40wire,
    345};
    346
    347static struct ata_port_operations cmd646r3_port_ops = {
    348	.inherits	= &cmd64x_base_ops,
    349	.sff_irq_check	= cmd648_sff_irq_check,
    350	.sff_irq_clear	= cmd648_sff_irq_clear,
    351	.cable_detect	= ata_cable_40wire,
    352};
    353
    354static struct ata_port_operations cmd648_port_ops = {
    355	.inherits	= &cmd64x_base_ops,
    356	.sff_irq_check	= cmd648_sff_irq_check,
    357	.sff_irq_clear	= cmd648_sff_irq_clear,
    358	.cable_detect	= cmd648_cable_detect,
    359};
    360
    361static void cmd64x_fixup(struct pci_dev *pdev)
    362{
    363	u8 mrdmode;
    364
    365	pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 64);
    366	pci_read_config_byte(pdev, MRDMODE, &mrdmode);
    367	mrdmode &= ~0x30;	/* IRQ set up */
    368	mrdmode |= 0x02;	/* Memory read line enable */
    369	pci_write_config_byte(pdev, MRDMODE, mrdmode);
    370
    371	/* PPC specific fixup copied from old driver */
    372#ifdef CONFIG_PPC
    373	pci_write_config_byte(pdev, UDIDETCR0, 0xF0);
    374#endif
    375}
    376
    377static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
    378{
    379	static const struct ata_port_info cmd_info[7] = {
    380		{	/* CMD 643 - no UDMA */
    381			.flags = ATA_FLAG_SLAVE_POSS,
    382			.pio_mask = ATA_PIO4,
    383			.mwdma_mask = ATA_MWDMA2,
    384			.port_ops = &cmd64x_port_ops
    385		},
    386		{	/* CMD 646 with broken UDMA */
    387			.flags = ATA_FLAG_SLAVE_POSS,
    388			.pio_mask = ATA_PIO4,
    389			.mwdma_mask = ATA_MWDMA2,
    390			.port_ops = &cmd64x_port_ops
    391		},
    392		{	/* CMD 646U with broken UDMA */
    393			.flags = ATA_FLAG_SLAVE_POSS,
    394			.pio_mask = ATA_PIO4,
    395			.mwdma_mask = ATA_MWDMA2,
    396			.port_ops = &cmd646r3_port_ops
    397		},
    398		{	/* CMD 646U2 with working UDMA */
    399			.flags = ATA_FLAG_SLAVE_POSS,
    400			.pio_mask = ATA_PIO4,
    401			.mwdma_mask = ATA_MWDMA2,
    402			.udma_mask = ATA_UDMA2,
    403			.port_ops = &cmd646r3_port_ops
    404		},
    405		{	/* CMD 646 rev 1  */
    406			.flags = ATA_FLAG_SLAVE_POSS,
    407			.pio_mask = ATA_PIO4,
    408			.mwdma_mask = ATA_MWDMA2,
    409			.port_ops = &cmd646r1_port_ops
    410		},
    411		{	/* CMD 648 */
    412			.flags = ATA_FLAG_SLAVE_POSS,
    413			.pio_mask = ATA_PIO4,
    414			.mwdma_mask = ATA_MWDMA2,
    415			.udma_mask = ATA_UDMA4,
    416			.port_ops = &cmd648_port_ops
    417		},
    418		{	/* CMD 649 */
    419			.flags = ATA_FLAG_SLAVE_POSS,
    420			.pio_mask = ATA_PIO4,
    421			.mwdma_mask = ATA_MWDMA2,
    422			.udma_mask = ATA_UDMA5,
    423			.port_ops = &cmd648_port_ops
    424		}
    425	};
    426	const struct ata_port_info *ppi[] = {
    427		&cmd_info[id->driver_data],
    428		&cmd_info[id->driver_data],
    429		NULL
    430	};
    431	u8 reg;
    432	int rc;
    433	struct pci_dev *bridge = pdev->bus->self;
    434	/* mobility split bridges don't report enabled ports correctly */
    435	int port_ok = !(bridge && bridge->vendor ==
    436			PCI_VENDOR_ID_MOBILITY_ELECTRONICS);
    437	/* all (with exceptions below) apart from 643 have CNTRL_CH0 bit */
    438	int cntrl_ch0_ok = (id->driver_data != 0);
    439
    440	rc = pcim_enable_device(pdev);
    441	if (rc)
    442		return rc;
    443
    444	if (id->driver_data == 0)	/* 643 */
    445		ata_pci_bmdma_clear_simplex(pdev);
    446
    447	if (pdev->device == PCI_DEVICE_ID_CMD_646)
    448		switch (pdev->revision) {
    449		/* UDMA works since rev 5 */
    450		default:
    451			ppi[0] = &cmd_info[3];
    452			ppi[1] = &cmd_info[3];
    453			break;
    454		/* Interrupts in MRDMODE since rev 3 */
    455		case 3:
    456		case 4:
    457			ppi[0] = &cmd_info[2];
    458			ppi[1] = &cmd_info[2];
    459			break;
    460		/* Rev 1 with other problems? */
    461		case 1:
    462			ppi[0] = &cmd_info[4];
    463			ppi[1] = &cmd_info[4];
    464			fallthrough;
    465		/* Early revs have no CNTRL_CH0 */
    466		case 2:
    467		case 0:
    468			cntrl_ch0_ok = 0;
    469			break;
    470		}
    471
    472	cmd64x_fixup(pdev);
    473
    474	/* check for enabled ports */
    475	pci_read_config_byte(pdev, CNTRL, &reg);
    476	if (!port_ok)
    477		dev_notice(&pdev->dev, "Mobility Bridge detected, ignoring CNTRL port enable/disable\n");
    478	if (port_ok && cntrl_ch0_ok && !(reg & CNTRL_CH0)) {
    479		dev_notice(&pdev->dev, "Primary port is disabled\n");
    480		ppi[0] = &ata_dummy_port_info;
    481
    482	}
    483	if (port_ok && !(reg & CNTRL_CH1)) {
    484		dev_notice(&pdev->dev, "Secondary port is disabled\n");
    485		ppi[1] = &ata_dummy_port_info;
    486	}
    487
    488	return ata_pci_bmdma_init_one(pdev, ppi, &cmd64x_sht, NULL, 0);
    489}
    490
    491#ifdef CONFIG_PM_SLEEP
    492static int cmd64x_reinit_one(struct pci_dev *pdev)
    493{
    494	struct ata_host *host = pci_get_drvdata(pdev);
    495	int rc;
    496
    497	rc = ata_pci_device_do_resume(pdev);
    498	if (rc)
    499		return rc;
    500
    501	cmd64x_fixup(pdev);
    502
    503	ata_host_resume(host);
    504	return 0;
    505}
    506#endif
    507
    508static const struct pci_device_id cmd64x[] = {
    509	{ PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_643), 0 },
    510	{ PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_646), 1 },
    511	{ PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_648), 5 },
    512	{ PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_649), 6 },
    513
    514	{ },
    515};
    516
    517static struct pci_driver cmd64x_pci_driver = {
    518	.name 		= DRV_NAME,
    519	.id_table	= cmd64x,
    520	.probe 		= cmd64x_init_one,
    521	.remove		= ata_pci_remove_one,
    522#ifdef CONFIG_PM_SLEEP
    523	.suspend	= ata_pci_device_suspend,
    524	.resume		= cmd64x_reinit_one,
    525#endif
    526};
    527
    528module_pci_driver(cmd64x_pci_driver);
    529
    530MODULE_AUTHOR("Alan Cox");
    531MODULE_DESCRIPTION("low-level driver for CMD64x series PATA controllers");
    532MODULE_LICENSE("GPL");
    533MODULE_DEVICE_TABLE(pci, cmd64x);
    534MODULE_VERSION(DRV_VERSION);