* [PATCH 1/3] libata: implement dev->acpi_init_gtm
@ 2007-11-02 15:20 Tejun Heo
2007-11-02 15:21 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Tejun Heo
` (2 more replies)
0 siblings, 3 replies; 24+ messages in thread
From: Tejun Heo @ 2007-11-02 15:20 UTC (permalink / raw)
To: Jeff Garzik, IDE/ATA development list, Alan Cox
Add dev->acpi_init_gtm and store initial GTM values on host
initialization. If the field is valid, ATA_PFLAG_INIT_GTM_VALID flag
is set. This is to remember BIOS/firmware programmed initial timing
for later use before reset and mode configuration modify it.
Signed-off-by: Tejun Heo <htejun@gmail.com>
---
drivers/ata/libata-acpi.c | 3 +++
include/linux/libata.h | 2 ++
2 files changed, 5 insertions(+)
Index: work/drivers/ata/libata-acpi.c
===================================================================
--- work.orig/drivers/ata/libata-acpi.c
+++ work/drivers/ata/libata-acpi.c
@@ -94,6 +94,9 @@ static void ata_acpi_associate_ide_port(
dev->acpi_handle = acpi_get_child(ap->acpi_handle, i);
}
+
+ if (ata_acpi_gtm(ap, &ap->acpi_init_gtm) == 0)
+ ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
}
static void ata_acpi_handle_hotplug(struct ata_port *ap, struct kobject *kobj,
Index: work/include/linux/libata.h
===================================================================
--- work.orig/include/linux/libata.h
+++ work/include/linux/libata.h
@@ -209,6 +209,7 @@ enum {
ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */
ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */
ATA_PFLAG_GTM_VALID = (1 << 19), /* acpi_gtm data valid */
+ ATA_PFLAG_INIT_GTM_VALID = (1 << 20), /* initial gtm data valid */
/* struct ata_queued_cmd flags */
ATA_QCFLAG_ACTIVE = (1 << 0), /* cmd not yet ack'd to scsi lyer */
@@ -633,6 +634,7 @@ struct ata_port {
#ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
struct ata_acpi_gtm acpi_gtm;
+ struct ata_acpi_gtm acpi_init_gtm;
#endif
u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */
};
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-02 15:20 [PATCH 1/3] libata: implement dev->acpi_init_gtm Tejun Heo
@ 2007-11-02 15:21 ` Tejun Heo
2007-11-02 15:22 ` [PATCH 3/3] pata_amd: fix and improve cable detection Tejun Heo
2007-11-02 15:42 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Alan Cox
2007-11-02 15:36 ` [PATCH 1/3] libata: implement dev->acpi_init_gtm Jeff Garzik
2007-11-02 15:44 ` Alan Cox
2 siblings, 2 replies; 24+ messages in thread
From: Tejun Heo @ 2007-11-02 15:21 UTC (permalink / raw)
To: Jeff Garzik, IDE/ATA development list, Alan Cox
The current ata_acpi_cbl_80wire() is too retricted in its
functionality. It always reads GTM itself and only returns whether
the cable is 80 wire or not. Extend it such that...
* It accepts @gtm argument instead of reading iteslf.
* Returns one of ATA_CBL_PATA40, ATA_CBL_PATA80 or ATA_CBL_PATA_UNK.
The function is renamed to ata_acpi_cbl(). Currently there are two
users - cable detection functions of pata_via and pata_amd. Both are
converted to use the new function with ap->acpi_init_gtm.
Using the initial GTM value is the right thing to do because both are
trying to check firmware setting and by the time ->cable_detect runs
the controller is already forced into PIO0 by reset.
Signed-off-by: Tejun Heo <htejun@gmail.com>
---
drivers/ata/libata-acpi.c | 68 +++++++++++++++++++++++++---------------------
drivers/ata/pata_amd.c | 3 +-
drivers/ata/pata_via.c | 3 +-
include/linux/libata.h | 2 -
4 files changed, 43 insertions(+), 33 deletions(-)
Index: work/drivers/ata/libata-acpi.c
===================================================================
--- work.orig/drivers/ata/libata-acpi.c
+++ work/drivers/ata/libata-acpi.c
@@ -390,42 +390,50 @@ static int ata_dev_get_GTF(struct ata_de
}
/**
- * ata_acpi_cbl_80wire - Check for 80 wire cable
- * @ap: Port to check
+ * ata_acpi_cbl - determine cable type from GTM values
+ * @ap: target ATA port
+ * @gtm: GTM to use
+ *
+ * Determine cable type from UDMA configuration in @gtm. If UDMA is
+ * disabled, it returns ATA_CBL_PATA_UNK. If UDMA is enabled and
+ * faster than 33, PATA_80; otherwise, PATA_40.
+ *
+ * LOCKING:
+ * None.
*
- * Return 1 if the ACPI mode data for this port indicates the BIOS selected
- * an 80wire mode.
+ * RETURNS:
+ * Determined cable type (ATA_CBL_*).
*/
-
-int ata_acpi_cbl_80wire(struct ata_port *ap)
+int ata_acpi_cbl(struct ata_port *ap, const struct ata_acpi_gtm *gtm)
{
- struct ata_acpi_gtm gtm;
- int valid = 0;
+ int cbl = ATA_CBL_PATA_UNK;
- /* No _GTM data, no information */
- if (ata_acpi_gtm(ap, >m) < 0)
- return 0;
+ if (ata_dev_enabled(&ap->link.device[0]) && (gtm->flags & 0x1)) {
+ if (gtm->drive[0].dma < 55)
+ return ATA_CBL_PATA80;
+ else
+ cbl = ATA_CBL_PATA40;
+ }
- /* Split timing, DMA enabled */
- if ((gtm.flags & 0x11) == 0x11 && gtm.drive[0].dma < 55)
- valid |= 1;
- if ((gtm.flags & 0x14) == 0x14 && gtm.drive[1].dma < 55)
- valid |= 2;
- /* Shared timing, DMA enabled */
- if ((gtm.flags & 0x11) == 0x01 && gtm.drive[0].dma < 55)
- valid |= 1;
- if ((gtm.flags & 0x14) == 0x04 && gtm.drive[0].dma < 55)
- valid |= 2;
-
- /* Drive check */
- if ((valid & 1) && ata_dev_enabled(&ap->link.device[0]))
- return 1;
- if ((valid & 2) && ata_dev_enabled(&ap->link.device[1]))
- return 1;
- return 0;
-}
+ if (ata_dev_enabled(&ap->link.device[1]) && (gtm->flags & 0x4)) {
+ u32 acpi_dma;
-EXPORT_SYMBOL_GPL(ata_acpi_cbl_80wire);
+ /* if split timing, use drive[0]; otherwise, drive[1] */
+ if (gtm->flags & 0x10)
+ acpi_dma = gtm->drive[1].dma;
+ else
+ acpi_dma = gtm->drive[0].dma;
+
+ if (acpi_dma < 55)
+ return ATA_CBL_PATA80;
+ else
+ cbl = ATA_CBL_PATA40;
+ }
+
+ return cbl;
+
+}
+EXPORT_SYMBOL_GPL(ata_acpi_cbl);
/**
* taskfile_load_raw - send taskfile registers to host controller
Index: work/drivers/ata/pata_amd.c
===================================================================
--- work.orig/drivers/ata/pata_amd.c
+++ work/drivers/ata/pata_amd.c
@@ -271,7 +271,8 @@ static int nv_cable_detect(struct ata_po
if ((udma & 0xC4) == 0xC4 || (udma & 0xC400) == 0xC400)
cbl = ATA_CBL_PATA80;
/* And a triple check across suspend/resume with ACPI around */
- if (ata_acpi_cbl_80wire(ap))
+ if ((ap->pflags & ATA_PFLAG_INIT_GTM_VALID) &&
+ ata_acpi_cbl(ap, &ap->acpi_init_gtm) == ATA_CBL_PATA80)
cbl = ATA_CBL_PATA80;
return cbl;
}
Index: work/drivers/ata/pata_via.c
===================================================================
--- work.orig/drivers/ata/pata_via.c
+++ work/drivers/ata/pata_via.c
@@ -185,7 +185,8 @@ static int via_cable_detect(struct ata_p
if (ata66 & (0x10100000 >> (16 * ap->port_no)))
return ATA_CBL_PATA80;
/* Check with ACPI so we can spot BIOS reported SATA bridges */
- if (ata_acpi_cbl_80wire(ap))
+ if ((ap->pflags & ATA_PFLAG_INIT_GTM_VALID) &&
+ ata_acpi_cbl(ap, &ap->acpi_init_gtm) == ATA_CBL_PATA80)
return ATA_CBL_PATA80;
return ATA_CBL_PATA40;
}
Index: work/include/linux/libata.h
===================================================================
--- work.orig/include/linux/libata.h
+++ work/include/linux/libata.h
@@ -921,7 +921,7 @@ enum {
/* libata-acpi.c */
#ifdef CONFIG_ATA_ACPI
-extern int ata_acpi_cbl_80wire(struct ata_port *ap);
+int ata_acpi_cbl(struct ata_port *ap, const struct ata_acpi_gtm *gtm);
int ata_acpi_stm(const struct ata_port *ap, struct ata_acpi_gtm *stm);
int ata_acpi_gtm(const struct ata_port *ap, struct ata_acpi_gtm *stm);
#else
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 3/3] pata_amd: fix and improve cable detection
2007-11-02 15:21 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Tejun Heo
@ 2007-11-02 15:22 ` Tejun Heo
2007-11-02 15:44 ` Alan Cox
2007-11-02 15:42 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Alan Cox
1 sibling, 1 reply; 24+ messages in thread
From: Tejun Heo @ 2007-11-02 15:22 UTC (permalink / raw)
To: Jeff Garzik, IDE/ATA development list, Alan Cox
Cable detection on Nvidia PATA hosts is pathetic. The current
nv_cable_detect() assumes that the native cable detection only
mistakes 80c as 40c but this isn't true. On ASUS A8N-E, cable
register almost always says 80c is attached and it also manages to
trick the drive that the cable is 80c.
Also, BIOS checking, and before the get_acpi_cbl() update ACPI
checking too, in the current implementation were useless because they
read the setting _after_ reset is complete which forces the host into
PIO0, so they never triggered.
Reimplement nv_cable_detect() such that...
* BIOS setting is cached during controller initialization and restored
on driver detach.
* BIOS and ACPI cable results are considered more important. Native
cable bits are used iff both BIOS and ACPI results are PATA_UNK. If
BIOS or ACPI indicates 80c, it's 80c. If none indicates 80c, it's
40c.
This change makes cable detection work correctly all the time on ASUS
A8N-E and should also work well on other NV PATA configurations.
Signed-off-by: Tejun Heo <htejun@gmail.com>
---
drivers/ata/pata_amd.c | 112 +++++++++++++++++++++++++++++++++++++++----------
1 file changed, 90 insertions(+), 22 deletions(-)
Index: work/drivers/ata/pata_amd.c
===================================================================
--- work.orig/drivers/ata/pata_amd.c
+++ work/drivers/ata/pata_amd.c
@@ -255,26 +255,69 @@ static int nv_cable_detect(struct ata_po
{
static const u8 bitmask[2] = {0x03, 0x0C};
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+ struct ata_device *dev;
+ char acpi_str[32] = "";
+ int native_cbl, bios_cbl, acpi_cbl, verdict;
+ u32 saved_udma, udma;
u8 ata66;
- u16 udma;
- int cbl;
+ /* native method, this is usually broken */
pci_read_config_byte(pdev, 0x52, &ata66);
if (ata66 & bitmask[ap->port_no])
- cbl = ATA_CBL_PATA80;
+ native_cbl = ATA_CBL_PATA80;
else
- cbl = ATA_CBL_PATA40;
+ native_cbl = ATA_CBL_PATA40;
- /* We now have to double check because the Nvidia boxes BIOS
- doesn't always set the cable bits but does set mode bits */
- pci_read_config_word(pdev, 0x62 - 2 * ap->port_no, &udma);
- if ((udma & 0xC4) == 0xC4 || (udma & 0xC400) == 0xC400)
- cbl = ATA_CBL_PATA80;
- /* And a triple check across suspend/resume with ACPI around */
- if ((ap->pflags & ATA_PFLAG_INIT_GTM_VALID) &&
- ata_acpi_cbl(ap, &ap->acpi_init_gtm) == ATA_CBL_PATA80)
- cbl = ATA_CBL_PATA80;
- return cbl;
+ /* peek BIOS configuration */
+ bios_cbl = ATA_CBL_PATA_UNK;
+
+ saved_udma = udma = (unsigned long)ap->host->private_data;
+ if (ap->port_no == 0)
+ udma >>= 16;
+
+ ata_link_for_each_dev(dev, &ap->link) {
+ u32 tmp = udma;
+
+ if (dev->devno == 0)
+ tmp >>= 8;
+
+ if (!ata_dev_enabled(dev) || (tmp & 0xC0) != 0xC0)
+ continue;
+
+ if (tmp & 0x4)
+ bios_cbl = ATA_CBL_PATA80;
+ else
+ bios_cbl = ATA_CBL_PATA40;
+ }
+
+ /* and ACPI configuration */
+ acpi_cbl = ATA_CBL_PATA_UNK;
+ if (ap->pflags & ATA_PFLAG_INIT_GTM_VALID)
+ acpi_cbl = ata_acpi_cbl(ap, &ap->acpi_init_gtm);
+
+ /* Three values collected. Native value is usually
+ * untrustworthy. Consider it iff both BIOS and ACPI values
+ * are unknown; otherwise, choose higher of the two.
+ */
+ if (bios_cbl == ATA_CBL_PATA_UNK && acpi_cbl == ATA_CBL_PATA_UNK)
+ verdict = native_cbl;
+ else if (bios_cbl == ATA_CBL_PATA80 || acpi_cbl == ATA_CBL_PATA80)
+ verdict = ATA_CBL_PATA80;
+ else
+ verdict = ATA_CBL_PATA40;
+
+ if (ap->pflags & ATA_PFLAG_INIT_GTM_VALID)
+ snprintf(acpi_str, sizeof(acpi_str), " (%u:%u:0x%x)",
+ ap->acpi_init_gtm.drive[0].dma,
+ ap->acpi_init_gtm.drive[1].dma,
+ ap->acpi_init_gtm.flags);
+
+ ata_port_printk(ap, KERN_DEBUG, "nv_cable_detect: native=%d (0x%x) "
+ "BIOS=%d (0x%x) ACPI=%d%s verdict=%d\n",
+ native_cbl, ata66, bios_cbl, saved_udma, acpi_cbl,
+ acpi_str, verdict);
+
+ return verdict;
}
/**
@@ -314,6 +357,14 @@ static void nv133_set_dmamode(struct ata
timing_setup(ap, adev, 0x50, adev->dma_mode, 4);
}
+static void nv_host_stop(struct ata_host *host)
+{
+ u32 udma = (unsigned long)host->private_data;
+
+ /* restore PCI config register 0x60 */
+ pci_write_config_dword(to_pci_dev(host->dev), 0x60, udma);
+}
+
static struct scsi_host_template amd_sht = {
.module = THIS_MODULE,
.name = DRV_NAME,
@@ -495,6 +546,7 @@ static struct ata_port_operations nv100_
.irq_on = ata_irq_on,
.port_start = ata_sff_port_start,
+ .host_stop = nv_host_stop,
};
static struct ata_port_operations nv133_port_ops = {
@@ -528,6 +580,7 @@ static struct ata_port_operations nv133_
.irq_on = ata_irq_on,
.port_start = ata_sff_port_start,
+ .host_stop = nv_host_stop,
};
static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
@@ -614,7 +667,8 @@ static int amd_init_one(struct pci_dev *
.port_ops = &amd100_port_ops
}
};
- const struct ata_port_info *ppi[] = { NULL, NULL };
+ struct ata_port_info pi;
+ const struct ata_port_info *ppi[] = { &pi, NULL };
static int printed_version;
int type = id->driver_data;
u8 fifo;
@@ -628,6 +682,19 @@ static int amd_init_one(struct pci_dev *
if (type == 1 && pdev->revision > 0x7)
type = 2;
+ /* Serenade ? */
+ if (type == 5 && pdev->subsystem_vendor == PCI_VENDOR_ID_AMD &&
+ pdev->subsystem_device == PCI_DEVICE_ID_AMD_SERENADE)
+ type = 6; /* UDMA 100 only */
+
+ /*
+ * Okay, type is determined now. Apply type-specific workarounds.
+ */
+ pi = info[type];
+
+ if (type < 3)
+ ata_pci_clear_simplex(pdev);
+
/* Check for AMD7411 */
if (type == 3)
/* FIFO is broken */
@@ -635,16 +702,17 @@ static int amd_init_one(struct pci_dev *
else
pci_write_config_byte(pdev, 0x41, fifo | 0xF0);
- /* Serenade ? */
- if (type == 5 && pdev->subsystem_vendor == PCI_VENDOR_ID_AMD &&
- pdev->subsystem_device == PCI_DEVICE_ID_AMD_SERENADE)
- type = 6; /* UDMA 100 only */
+ /* Cable detection on Nvidia chips doesn't work too well,
+ * cache BIOS programmed UDMA mode.
+ */
+ if (type == 7 || type == 8) {
+ u32 udma;
- if (type < 3)
- ata_pci_clear_simplex(pdev);
+ pci_read_config_dword(pdev, 0x60, &udma);
+ pi.private_data = (void *)(unsigned long)udma;
+ }
/* And fire it up */
- ppi[0] = &info[type];
return ata_pci_init_one(pdev, ppi);
}
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 1/3] libata: implement dev->acpi_init_gtm
2007-11-02 15:20 [PATCH 1/3] libata: implement dev->acpi_init_gtm Tejun Heo
2007-11-02 15:21 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Tejun Heo
@ 2007-11-02 15:36 ` Jeff Garzik
2007-11-02 22:12 ` Tejun Heo
2007-11-02 15:44 ` Alan Cox
2 siblings, 1 reply; 24+ messages in thread
From: Jeff Garzik @ 2007-11-02 15:36 UTC (permalink / raw)
To: Tejun Heo; +Cc: IDE/ATA development list, Alan Cox
Tejun Heo wrote:
> Add dev->acpi_init_gtm and store initial GTM values on host
> initialization. If the field is valid, ATA_PFLAG_INIT_GTM_VALID flag
> is set. This is to remember BIOS/firmware programmed initial timing
> for later use before reset and mode configuration modify it.
>
> Signed-off-by: Tejun Heo <htejun@gmail.com>
It sounds like pata_via and pata_amd need a foo_save_initial_config()
much like AHCI, during which they would fill ppriv->init_gtm rather than
ap->init_gtm. Thoughts? Both drivers are calling ata_acpi_cbl()
themselves, permitting the possibility of ppriv->init_gtm.
This avoids forcing everyone else to bear the memory cost in ata_port
for just these two drivers.
Jeff
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-02 15:21 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Tejun Heo
2007-11-02 15:22 ` [PATCH 3/3] pata_amd: fix and improve cable detection Tejun Heo
@ 2007-11-02 15:42 ` Alan Cox
2007-11-02 22:18 ` Tejun Heo
2007-11-03 0:57 ` Bartlomiej Zolnierkiewicz
1 sibling, 2 replies; 24+ messages in thread
From: Alan Cox @ 2007-11-02 15:42 UTC (permalink / raw)
To: Tejun Heo; +Cc: Jeff Garzik, IDE/ATA development list
> Using the initial GTM value is the right thing to do because both are
> trying to check firmware setting and by the time ->cable_detect runs
> the controller is already forced into PIO0 by reset.
As we only look at the DMA bits that doesn't matter but I agree it would
be cleaner if we were more careful. Also our mode setting outside
pata_acpi doesn't touch the ACPI settings so its ok for that reason too.
> + * Determine cable type from UDMA configuration in @gtm. If UDMA is
> + * disabled, it returns ATA_CBL_PATA_UNK. If UDMA is enabled and
> + * faster than 33, PATA_80; otherwise, PATA_40.
NAK
Consider the case of a UDMA 33 capable device on an 80 wire cable. We
simply can't use the cable detect methods to prove it is 40 wire this way.
What we actually know is
If UDMA > 33 selected -> UDMA > 33 works
80 wire
Short
or SATA
If UDMA > 33 not selected Unknown
40 wire
80 + Drive limit
80 + Controller limit
80 + BIOS is set to PIO
etc
The only case I can see you could reasonably suggest 40 wire would be
IFF the drive is capable of UDMA > 33 _and_ the ACPI mode is UDMA 33.
Alan
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/3] pata_amd: fix and improve cable detection
2007-11-02 15:22 ` [PATCH 3/3] pata_amd: fix and improve cable detection Tejun Heo
@ 2007-11-02 15:44 ` Alan Cox
2007-11-02 22:22 ` Tejun Heo
0 siblings, 1 reply; 24+ messages in thread
From: Alan Cox @ 2007-11-02 15:44 UTC (permalink / raw)
To: Tejun Heo; +Cc: Jeff Garzik, IDE/ATA development list
On Sat, 03 Nov 2007 00:22:24 +0900
Tejun Heo <htejun@gmail.com> wrote:
> Cable detection on Nvidia PATA hosts is pathetic. The current
> nv_cable_detect() assumes that the native cable detection only
> mistakes 80c as 40c but this isn't true. On ASUS A8N-E, cable
> register almost always says 80c is attached and it also manages to
> trick the drive that the cable is 80c.
According to the last Nvidia comments on Nvidia there is no cable detect
bit. I've just never gotten around to implementing it because due to lack
of documentation Nvidia PATA is very very low priority compared to
problems with documented chipsets from helpful vendors.
Alan
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 1/3] libata: implement dev->acpi_init_gtm
2007-11-02 15:20 [PATCH 1/3] libata: implement dev->acpi_init_gtm Tejun Heo
2007-11-02 15:21 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Tejun Heo
2007-11-02 15:36 ` [PATCH 1/3] libata: implement dev->acpi_init_gtm Jeff Garzik
@ 2007-11-02 15:44 ` Alan Cox
2007-11-02 22:08 ` Tejun Heo
2 siblings, 1 reply; 24+ messages in thread
From: Alan Cox @ 2007-11-02 15:44 UTC (permalink / raw)
To: Tejun Heo; +Cc: Jeff Garzik, IDE/ATA development list
On Sat, 03 Nov 2007 00:20:10 +0900
Tejun Heo <htejun@gmail.com> wrote:
> Add dev->acpi_init_gtm and store initial GTM values on host
> initialization. If the field is valid, ATA_PFLAG_INIT_GTM_VALID flag
> is set. This is to remember BIOS/firmware programmed initial timing
> for later use before reset and mode configuration modify it.
Don't you need to clear this on a hotplug event ?
Alan
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 1/3] libata: implement dev->acpi_init_gtm
2007-11-02 15:44 ` Alan Cox
@ 2007-11-02 22:08 ` Tejun Heo
0 siblings, 0 replies; 24+ messages in thread
From: Tejun Heo @ 2007-11-02 22:08 UTC (permalink / raw)
To: Alan Cox; +Cc: Jeff Garzik, IDE/ATA development list
Alan Cox wrote:
> On Sat, 03 Nov 2007 00:20:10 +0900
> Tejun Heo <htejun@gmail.com> wrote:
>
>> Add dev->acpi_init_gtm and store initial GTM values on host
>> initialization. If the field is valid, ATA_PFLAG_INIT_GTM_VALID flag
>> is set. This is to remember BIOS/firmware programmed initial timing
>> for later use before reset and mode configuration modify it.
>
> Don't you need to clear this on a hotplug event ?
It just says the GTM value loaded on driver initialization is valid.
The rest is upto the user.
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 1/3] libata: implement dev->acpi_init_gtm
2007-11-02 15:36 ` [PATCH 1/3] libata: implement dev->acpi_init_gtm Jeff Garzik
@ 2007-11-02 22:12 ` Tejun Heo
2007-11-03 7:10 ` Tejun Heo
0 siblings, 1 reply; 24+ messages in thread
From: Tejun Heo @ 2007-11-02 22:12 UTC (permalink / raw)
To: Jeff Garzik; +Cc: IDE/ATA development list, Alan Cox
Jeff Garzik wrote:
> Tejun Heo wrote:
>> Add dev->acpi_init_gtm and store initial GTM values on host
>> initialization. If the field is valid, ATA_PFLAG_INIT_GTM_VALID flag
>> is set. This is to remember BIOS/firmware programmed initial timing
>> for later use before reset and mode configuration modify it.
>>
>> Signed-off-by: Tejun Heo <htejun@gmail.com>
>
> It sounds like pata_via and pata_amd need a foo_save_initial_config()
> much like AHCI, during which they would fill ppriv->init_gtm rather than
> ap->init_gtm. Thoughts? Both drivers are calling ata_acpi_cbl()
> themselves, permitting the possibility of ppriv->init_gtm.
>
> This avoids forcing everyone else to bear the memory cost in ata_port
> for just these two drivers.
The memory overhead is pretty small and more importantly there isn't a
good place to load initial GTM. ACPI is associated with the host during
host registration after all private host initialization is complete.
When the EH gets invoked, the first thing which is done is forcing PIO0
before initial reset.
Unless we add another hook, the only place to put this is in private
->error_handler(). A driver can check whether it's being called for the
first time and record it in private structure, which isn't too pretty,
so I thought doing it this way was fair tradeoff.
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-02 15:42 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Alan Cox
@ 2007-11-02 22:18 ` Tejun Heo
2007-11-02 23:45 ` Alan Cox
2007-11-03 0:57 ` Bartlomiej Zolnierkiewicz
1 sibling, 1 reply; 24+ messages in thread
From: Tejun Heo @ 2007-11-02 22:18 UTC (permalink / raw)
To: Alan Cox; +Cc: Jeff Garzik, IDE/ATA development list
Alan Cox wrote:
>> Using the initial GTM value is the right thing to do because both are
>> trying to check firmware setting and by the time ->cable_detect runs
>> the controller is already forced into PIO0 by reset.
>
> As we only look at the DMA bits that doesn't matter but I agree it would
> be cleaner if we were more careful. Also our mode setting outside
> pata_acpi doesn't touch the ACPI settings so its ok for that reason too.
GTM results do change whether you call STM or not. GTM in many cases is
implemented as reading the current configuration value from the
controller so if you configure PIO0, it will return PIO0 timings. And,
yeah, on ASUS A8N-E, if you configure PIO0, GTM answer says DMA is off.
>> + * Determine cable type from UDMA configuration in @gtm. If UDMA is
>> + * disabled, it returns ATA_CBL_PATA_UNK. If UDMA is enabled and
>> + * faster than 33, PATA_80; otherwise, PATA_40.
>
> NAK
>
> Consider the case of a UDMA 33 capable device on an 80 wire cable. We
> simply can't use the cable detect methods to prove it is 40 wire this way.
>
> What we actually know is
>
> If UDMA > 33 selected -> UDMA > 33 works
> 80 wire
> Short
> or SATA
>
> If UDMA > 33 not selected Unknown
> 40 wire
> 80 + Drive limit
> 80 + Controller limit
> 80 + BIOS is set to PIO
> etc
>
> The only case I can see you could reasonably suggest 40 wire would be
> IFF the drive is capable of UDMA > 33 _and_ the ACPI mode is UDMA 33.
What the function answers is not actually cable type but "according to
the current configuration, using this cable type won't violate BIOS
configuration" kind of answer. How the caller is to use that is the
caller's responsibility.
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/3] pata_amd: fix and improve cable detection
2007-11-02 15:44 ` Alan Cox
@ 2007-11-02 22:22 ` Tejun Heo
2007-11-03 0:10 ` Alan Cox
0 siblings, 1 reply; 24+ messages in thread
From: Tejun Heo @ 2007-11-02 22:22 UTC (permalink / raw)
To: Alan Cox; +Cc: Jeff Garzik, IDE/ATA development list
Alan Cox wrote:
>> Cable detection on Nvidia PATA hosts is pathetic. The current
>> nv_cable_detect() assumes that the native cable detection only
>> mistakes 80c as 40c but this isn't true. On ASUS A8N-E, cable
>> register almost always says 80c is attached and it also manages to
>> trick the drive that the cable is 80c.
>
> According to the last Nvidia comments on Nvidia there is no cable detect
> bit. I've just never gotten around to implementing it because due to lack
> of documentation Nvidia PATA is very very low priority compared to
> problems with documented chipsets from helpful vendors.
Yeah, it seems some boards just say 80C while others just say 40C, so
all we can use is how the BIOS configured it. I suppose BIOS does it by
issuing trial commands which I don't think adding to libata is a good idea.
Can you please lemme know what you don't like about the current
implementation or what other approach you have in mind? I don't like
Nvidia PATA either but there are a lot of people using it out there.
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-02 22:18 ` Tejun Heo
@ 2007-11-02 23:45 ` Alan Cox
2007-11-03 0:46 ` Tejun Heo
0 siblings, 1 reply; 24+ messages in thread
From: Alan Cox @ 2007-11-02 23:45 UTC (permalink / raw)
To: Tejun Heo; +Cc: Jeff Garzik, IDE/ATA development list
> GTM results do change whether you call STM or not. GTM in many cases is
> implemented as reading the current configuration value from the
> controller so if you configure PIO0, it will return PIO0 timings. And,
> yeah, on ASUS A8N-E, if you configure PIO0, GTM answer says DMA is off.
Oh fun - ok then we do need to cache it.
> What the function answers is not actually cable type but "according to
> the current configuration, using this cable type won't violate BIOS
> configuration" kind of answer. How the caller is to use that is the
> caller's responsibility.
How does the caller make use of it ? The only way I can think of to use
it is that if either drive says UDMA > 33 then we know its 80 wire.
Otherwise we can't really prove anything. And if neither drive says > 80
wire we have to go on what other info we have, which for NVidia appears
to be "guess 40".
I'm not sure therefore we gain anything ?
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/3] pata_amd: fix and improve cable detection
2007-11-02 22:22 ` Tejun Heo
@ 2007-11-03 0:10 ` Alan Cox
2007-11-03 0:35 ` Tejun Heo
2007-11-03 0:42 ` Tejun Heo
0 siblings, 2 replies; 24+ messages in thread
From: Alan Cox @ 2007-11-03 0:10 UTC (permalink / raw)
To: Tejun Heo; +Cc: Jeff Garzik, IDE/ATA development list
> all we can use is how the BIOS configured it. I suppose BIOS does it by
> issuing trial commands which I don't think adding to libata is a good idea.
The BIOS does it by asking the hardware somehow. I traced one or two
BIOSes that far. The info is there but its not documented in the
slightest so only ACPI makes it visible via the BIOS.
>
> Can you please lemme know what you don't like about the current
> implementation or what other approach you have in mind? I don't like
> Nvidia PATA either but there are a lot of people using it out there.
We seem to be able to trust the drives and BIOS ACPI data for Nvidia (at
least what I have seen), so I guess we should simply declare the cable
type unknown, 80 wire if ACPI says it is and then do the drive detect
side ?
Alan
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/3] pata_amd: fix and improve cable detection
2007-11-03 0:10 ` Alan Cox
@ 2007-11-03 0:35 ` Tejun Heo
2007-11-03 0:42 ` Tejun Heo
1 sibling, 0 replies; 24+ messages in thread
From: Tejun Heo @ 2007-11-03 0:35 UTC (permalink / raw)
To: Alan Cox; +Cc: Jeff Garzik, IDE/ATA development list
Alan Cox wrote:
>> all we can use is how the BIOS configured it. I suppose BIOS does it by
>> issuing trial commands which I don't think adding to libata is a good idea.
>
> The BIOS does it by asking the hardware somehow. I traced one or two
> BIOSes that far. The info is there but its not documented in the
> slightest so only ACPI makes it visible via the BIOS.
OIC, gawdddddddd... What was so long with just following what those
AMD chips did?
>> Can you please lemme know what you don't like about the current
>> implementation or what other approach you have in mind? I don't like
>> Nvidia PATA either but there are a lot of people using it out there.
>
> We seem to be able to trust the drives and BIOS ACPI data for Nvidia (at
> least what I have seen), so I guess we should simply declare the cable
> type unknown, 80 wire if ACPI says it is and then do the drive detect
> side ?
There are machines with broken BIOSen so actually the most reliable
source is the UDMA timing register. On ASUS A8N-E, ACPI and UDMA
timing register always concur. I think it's best to look at both not
so much for accuracy but for debugging, so the following printk in the
patch.
+ if (ap->pflags & ATA_PFLAG_INIT_GTM_VALID)
+ snprintf(acpi_str, sizeof(acpi_str), " (%u:%u:0x%x)",
+ ap->acpi_init_gtm.drive[0].dma,
+ ap->acpi_init_gtm.drive[1].dma,
+ ap->acpi_init_gtm.flags);
+
+ ata_port_printk(ap, KERN_DEBUG, "nv_cable_detect: native=%d (0x%x) "
+ "BIOS=%d (0x%x) ACPI=%d%s verdict=%d\n",
+ native_cbl, ata66, bios_cbl, saved_udma, acpi_cbl,
+ acpi_str, verdict);
When cable detection goes wrong, we'll at least know what all those
different sources are telling.
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/3] pata_amd: fix and improve cable detection
2007-11-03 0:10 ` Alan Cox
2007-11-03 0:35 ` Tejun Heo
@ 2007-11-03 0:42 ` Tejun Heo
1 sibling, 0 replies; 24+ messages in thread
From: Tejun Heo @ 2007-11-03 0:42 UTC (permalink / raw)
To: Alan Cox; +Cc: Jeff Garzik, IDE/ATA development list
Hello, again. Forgot one thing.
Alan Cox wrote:
>> all we can use is how the BIOS configured it. I suppose BIOS does it by
>> issuing trial commands which I don't think adding to libata is a good idea.
>
> The BIOS does it by asking the hardware somehow. I traced one or two
> BIOSes that far. The info is there but its not documented in the
> slightest so only ACPI makes it visible via the BIOS.
>
>> Can you please lemme know what you don't like about the current
>> implementation or what other approach you have in mind? I don't like
>> Nvidia PATA either but there are a lot of people using it out there.
>
> We seem to be able to trust the drives and BIOS ACPI data for Nvidia (at
> least what I have seen), so I guess we should simply declare the cable
> type unknown, 80 wire if ACPI says it is and then do the drive detect
> side ?
The drive side can't be trusted. For the drive side detection work
properly, there should be a capacitor attached to PDIAG-:CBLID- line so
that the drive can tell 40C cable which connects CBLID- to the host
connector by sampling while the capacitor is still discharging. If
there's no capacitor on the line, 40C and 80C cables behave identically.
Voltage rises as soon as CBLID- is disasserted and drive always reports
80C and that's what happens on my A8N-E. Hell of a way to save cost for
one capacitor, I guess. :-(
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-02 23:45 ` Alan Cox
@ 2007-11-03 0:46 ` Tejun Heo
2007-11-03 1:12 ` Alan Cox
0 siblings, 1 reply; 24+ messages in thread
From: Tejun Heo @ 2007-11-03 0:46 UTC (permalink / raw)
To: Alan Cox; +Cc: Jeff Garzik, IDE/ATA development list
Alan Cox wrote:
>> What the function answers is not actually cable type but "according to
>> the current configuration, using this cable type won't violate BIOS
>> configuration" kind of answer. How the caller is to use that is the
>> caller's responsibility.
>
> How does the caller make use of it ? The only way I can think of to use
> it is that if either drive says UDMA > 33 then we know its 80 wire.
> Otherwise we can't really prove anything. And if neither drive says > 80
> wire we have to go on what other info we have, which for NVidia appears
> to be "guess 40".
>
> I'm not sure therefore we gain anything ?
I was trying to discern between the following three.
1. UDMA mode isn't configured at all. Either BIOS forgot it, isn't
there or some other entity cleared it before the driver is loaded. I
can't tell you anything. If you have another source for cable
detection, use it instead.
2. UDMA mode is configured but equal to or under UDMA33. Dunno whether
it's cable or device limit but anyways you better limit it to UDMA33 too.
3. UDMA mode is configured and above UDMA33. Do whatever you wanna do.
Return values are ATA_CBL_PATA_UNK, ATA_CBL_PATA_UDMA33 and
ATA_CBL_PATA_UDMA66 respectively.
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-02 15:42 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Alan Cox
2007-11-02 22:18 ` Tejun Heo
@ 2007-11-03 0:57 ` Bartlomiej Zolnierkiewicz
2007-11-03 1:12 ` Bartlomiej Zolnierkiewicz
1 sibling, 1 reply; 24+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2007-11-03 0:57 UTC (permalink / raw)
To: Alan Cox; +Cc: Tejun Heo, Jeff Garzik, IDE/ATA development list
On Friday 02 November 2007, Alan Cox wrote:
> > Using the initial GTM value is the right thing to do because both are
> > trying to check firmware setting and by the time ->cable_detect runs
> > the controller is already forced into PIO0 by reset.
>
> As we only look at the DMA bits that doesn't matter but I agree it would
It does matter,
http://lkml.org/lkml/2007/10/12/537
"
> libata: correct handling of SRST reset sequences
This potentially adds a regression for nVidia boxes (but ACPI cable
detection should compensate for it):
pata_amd's ->cable_detect checks UDMA timings to get the cable type
(cable detection is done before the SRST) but pata_amd's ->set_piomode
messes with UDMA timings. It seems that both methods need fixing.
"
[ Now we see that since ACPI can just dump the current settings
ACPI cable detection won't help a tiny bit. ]
AFAICS pata_via.c has the same problem w.r.t. ->set_piomode
> be cleaner if we were more careful. Also our mode setting outside
> pata_acpi doesn't touch the ACPI settings so its ok for that reason too.
Thanks,
Bart
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-03 0:57 ` Bartlomiej Zolnierkiewicz
@ 2007-11-03 1:12 ` Bartlomiej Zolnierkiewicz
0 siblings, 0 replies; 24+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2007-11-03 1:12 UTC (permalink / raw)
To: Alan Cox; +Cc: Tejun Heo, Jeff Garzik, IDE/ATA development list
On Saturday 03 November 2007, Bartlomiej Zolnierkiewicz wrote:
> On Friday 02 November 2007, Alan Cox wrote:
> > > Using the initial GTM value is the right thing to do because both are
> > > trying to check firmware setting and by the time ->cable_detect runs
> > > the controller is already forced into PIO0 by reset.
> >
> > As we only look at the DMA bits that doesn't matter but I agree it would
>
> It does matter,
>
> http://lkml.org/lkml/2007/10/12/537
>
> "
> > libata: correct handling of SRST reset sequences
>
> This potentially adds a regression for nVidia boxes (but ACPI cable
> detection should compensate for it):
>
> pata_amd's ->cable_detect checks UDMA timings to get the cable type
> (cable detection is done before the SRST) but pata_amd's ->set_piomode
s/after/before/ of course
> messes with UDMA timings. It seems that both methods need fixing.
> "
>
> [ Now we see that since ACPI can just dump the current settings
> ACPI cable detection won't help a tiny bit. ]
>
> AFAICS pata_via.c has the same problem w.r.t. ->set_piomode
>
> > be cleaner if we were more careful. Also our mode setting outside
> > pata_acpi doesn't touch the ACPI settings so its ok for that reason too.
>
> Thanks,
> Bart
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-03 0:46 ` Tejun Heo
@ 2007-11-03 1:12 ` Alan Cox
2007-11-03 1:16 ` Tejun Heo
0 siblings, 1 reply; 24+ messages in thread
From: Alan Cox @ 2007-11-03 1:12 UTC (permalink / raw)
To: Tejun Heo; +Cc: Jeff Garzik, IDE/ATA development list
> 2. UDMA mode is configured but equal to or under UDMA33. Dunno whether
> it's cable or device limit but anyways you better limit it to UDMA33 too.
If it is under UDMA33 you know it isn't a cable limit
If it is UDMA 33 and the device top is > UDMA 33 it might be
This matters as you've got to account for both master and slave, as well
as hotplug in theory.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-03 1:12 ` Alan Cox
@ 2007-11-03 1:16 ` Tejun Heo
2007-11-03 1:23 ` Alan Cox
0 siblings, 1 reply; 24+ messages in thread
From: Tejun Heo @ 2007-11-03 1:16 UTC (permalink / raw)
To: Alan Cox; +Cc: Jeff Garzik, IDE/ATA development list
Alan Cox wrote:
>> 2. UDMA mode is configured but equal to or under UDMA33. Dunno whether
>> it's cable or device limit but anyways you better limit it to UDMA33 too.
>
> If it is under UDMA33 you know it isn't a cable limit
>
> If it is UDMA 33 and the device top is > UDMA 33 it might be
>
> This matters as you've got to account for both master and slave, as well
> as hotplug in theory.
I'm not sure whether that level of sophistication is necessary here.
This is more like a transfer rate filter thing rather than actual cable
detection. We're basically just trying to follow what BIOS did. Maybe
we should return ATA_CBL_PATA_MAYBE_80 unconditionally and implement
ata_acpi_more_filter()?
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-03 1:16 ` Tejun Heo
@ 2007-11-03 1:23 ` Alan Cox
2007-11-03 7:03 ` Tejun Heo
0 siblings, 1 reply; 24+ messages in thread
From: Alan Cox @ 2007-11-03 1:23 UTC (permalink / raw)
To: Tejun Heo; +Cc: Jeff Garzik, IDE/ATA development list
> detection. We're basically just trying to follow what BIOS did. Maybe
> we should return ATA_CBL_PATA_MAYBE_80 unconditionally and implement
MAYBE_80 = UNK.
> ata_acpi_more_filter()?
We can also use UNK intelligently in the eh code to go straight from
UDMA133/100/66 to 33 (if you don't already I've not read that logic
recently)
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd
2007-11-03 1:23 ` Alan Cox
@ 2007-11-03 7:03 ` Tejun Heo
0 siblings, 0 replies; 24+ messages in thread
From: Tejun Heo @ 2007-11-03 7:03 UTC (permalink / raw)
To: Alan Cox; +Cc: Jeff Garzik, IDE/ATA development list
Alan Cox wrote:
>> detection. We're basically just trying to follow what BIOS did. Maybe
>> we should return ATA_CBL_PATA_MAYBE_80 unconditionally and implement
>
> MAYBE_80 = UNK.
Yeah, right. I somehow thought it was close to "don't really know but
treat as 40c" but it's more like "don't really know maybe 80c".
I think implementing this as mode filter is the better approach and
reflects the situation better. We can't really tell the cable type.
All we know is how BIOS/firmware configured it and we're just trying to
use the same transfer mode.
Do you agree? Then, I'll go ahead and redo the patch and implement this
mess as mode filter.
>> ata_acpi_more_filter()?
>
> We can also use UNK intelligently in the eh code to go straight from
> UDMA133/100/66 to 33 (if you don't already I've not read that logic
> recently)
The default behavior of the current EH code should be enough. It first
decelerate one step (e.g. UDMA/133->UDMA/100) and then right to UDMA/33.
With the pending speed down update patch applied, it will take at most
three consecutive errors to reach UDMA/33 from any speed above that.
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 1/3] libata: implement dev->acpi_init_gtm
2007-11-02 22:12 ` Tejun Heo
@ 2007-11-03 7:10 ` Tejun Heo
2007-11-03 12:33 ` Jeff Garzik
0 siblings, 1 reply; 24+ messages in thread
From: Tejun Heo @ 2007-11-03 7:10 UTC (permalink / raw)
To: Jeff Garzik; +Cc: IDE/ATA development list, Alan Cox
Tejun Heo wrote:
> Jeff Garzik wrote:
>> Tejun Heo wrote:
>>> Add dev->acpi_init_gtm and store initial GTM values on host
>>> initialization. If the field is valid, ATA_PFLAG_INIT_GTM_VALID flag
>>> is set. This is to remember BIOS/firmware programmed initial timing
>>> for later use before reset and mode configuration modify it.
>>>
>>> Signed-off-by: Tejun Heo <htejun@gmail.com>
>> It sounds like pata_via and pata_amd need a foo_save_initial_config()
>> much like AHCI, during which they would fill ppriv->init_gtm rather than
>> ap->init_gtm. Thoughts? Both drivers are calling ata_acpi_cbl()
>> themselves, permitting the possibility of ppriv->init_gtm.
>>
>> This avoids forcing everyone else to bear the memory cost in ata_port
>> for just these two drivers.
>
> The memory overhead is pretty small and more importantly there isn't a
> good place to load initial GTM. ACPI is associated with the host during
> host registration after all private host initialization is complete.
> When the EH gets invoked, the first thing which is done is forcing PIO0
> before initial reset.
>
> Unless we add another hook, the only place to put this is in private
> ->error_handler(). A driver can check whether it's being called for the
> first time and record it in private structure, which isn't too pretty,
> so I thought doing it this way was fair tradeoff.
Jeff, do you agree or still think it's better done in LLDs? I'm okay
either way.
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 1/3] libata: implement dev->acpi_init_gtm
2007-11-03 7:10 ` Tejun Heo
@ 2007-11-03 12:33 ` Jeff Garzik
0 siblings, 0 replies; 24+ messages in thread
From: Jeff Garzik @ 2007-11-03 12:33 UTC (permalink / raw)
To: Tejun Heo; +Cc: IDE/ATA development list, Alan Cox
Tejun Heo wrote:
> Tejun Heo wrote:
>> Jeff Garzik wrote:
>>> Tejun Heo wrote:
>>>> Add dev->acpi_init_gtm and store initial GTM values on host
>>>> initialization. If the field is valid, ATA_PFLAG_INIT_GTM_VALID flag
>>>> is set. This is to remember BIOS/firmware programmed initial timing
>>>> for later use before reset and mode configuration modify it.
>>>>
>>>> Signed-off-by: Tejun Heo <htejun@gmail.com>
>>> It sounds like pata_via and pata_amd need a foo_save_initial_config()
>>> much like AHCI, during which they would fill ppriv->init_gtm rather than
>>> ap->init_gtm. Thoughts? Both drivers are calling ata_acpi_cbl()
>>> themselves, permitting the possibility of ppriv->init_gtm.
>>>
>>> This avoids forcing everyone else to bear the memory cost in ata_port
>>> for just these two drivers.
>> The memory overhead is pretty small and more importantly there isn't a
>> good place to load initial GTM. ACPI is associated with the host during
>> host registration after all private host initialization is complete.
>> When the EH gets invoked, the first thing which is done is forcing PIO0
>> before initial reset.
>>
>> Unless we add another hook, the only place to put this is in private
>> ->error_handler(). A driver can check whether it's being called for the
>> first time and record it in private structure, which isn't too pretty,
>> so I thought doing it this way was fair tradeoff.
>
> Jeff, do you agree or still think it's better done in LLDs? I'm okay
> either way.
I trust your judgement... My reply was more of a "gut feeling" sort of
thing.
In general, I want to keep libata as close as possible to the "LLD
call-out model" as possible: LLD registers itself with system services
[perhaps using generic helpers to do so]. LLD fills in its own scsi
host template and ata_port_operations [perhaps using generic helpers to
do so]. LLD implements specific helpers that control LLD-specific
behavior, calling out to libata helpers as need arises.
So I tend to prefer adding direct LLD control points to ATA_FLAG_xxx
control points or other solutions, if the situation permits me to choose.
If you have to ask... I will always prefer "it" (for some value of...)
to be done in the LLD. ;-)
Jeff
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2007-11-03 12:33 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-02 15:20 [PATCH 1/3] libata: implement dev->acpi_init_gtm Tejun Heo
2007-11-02 15:21 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Tejun Heo
2007-11-02 15:22 ` [PATCH 3/3] pata_amd: fix and improve cable detection Tejun Heo
2007-11-02 15:44 ` Alan Cox
2007-11-02 22:22 ` Tejun Heo
2007-11-03 0:10 ` Alan Cox
2007-11-03 0:35 ` Tejun Heo
2007-11-03 0:42 ` Tejun Heo
2007-11-02 15:42 ` [PATCH 2/3] libata: extend ata_acpi_cbl_80wire() and fix cable detection in pata_via and pata_amd Alan Cox
2007-11-02 22:18 ` Tejun Heo
2007-11-02 23:45 ` Alan Cox
2007-11-03 0:46 ` Tejun Heo
2007-11-03 1:12 ` Alan Cox
2007-11-03 1:16 ` Tejun Heo
2007-11-03 1:23 ` Alan Cox
2007-11-03 7:03 ` Tejun Heo
2007-11-03 0:57 ` Bartlomiej Zolnierkiewicz
2007-11-03 1:12 ` Bartlomiej Zolnierkiewicz
2007-11-02 15:36 ` [PATCH 1/3] libata: implement dev->acpi_init_gtm Jeff Garzik
2007-11-02 22:12 ` Tejun Heo
2007-11-03 7:10 ` Tejun Heo
2007-11-03 12:33 ` Jeff Garzik
2007-11-02 15:44 ` Alan Cox
2007-11-02 22:08 ` Tejun Heo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).