Skip to content

Commit

Permalink
ahci: Turn off DMA engines when there's no device attached
Browse files Browse the repository at this point in the history
According to section 10.3.1 of the AHCI spec, PxCMD.ST must not be set
unless there's a device attached. Following this saves us a measurable
quantity of power and does not impair hotplug support. Based on a patch
by Kristen Carlson Accardi.

Signed-off-by: Matthew Garrett <mjg@redhat.com>
Cc: Kristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
  • Loading branch information
Matthew Garrett authored and Jeff Garzik committed May 14, 2010
1 parent 1c2a49f commit 96d6030
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions drivers/ata/libahci.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,11 +437,29 @@ static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val)
return -EINVAL;
}

static int ahci_is_device_present(void __iomem *port_mmio)
{
u8 status = readl(port_mmio + PORT_TFDATA) & 0xff;

/* Make sure PxTFD.STS.BSY and PxTFD.STS.DRQ are 0 */
if (status & (ATA_BUSY | ATA_DRQ))
return 0;

/* Make sure PxSSTS.DET is 3h */
status = readl(port_mmio + PORT_SCR_STAT) & 0xf;
if (status != 3)
return 0;
return 1;
}

void ahci_start_engine(struct ata_port *ap)
{
void __iomem *port_mmio = ahci_port_base(ap);
u32 tmp;

if (!ahci_is_device_present(port_mmio))
return;

/* start DMA */
tmp = readl(port_mmio + PORT_CMD);
tmp |= PORT_CMD_START;
Expand Down

0 comments on commit 96d6030

Please sign in to comment.