Re: [PATCH 2/2] sata_nv: fix ATAPI issues with memory over 4GB (v3)

Previous thread: [PATCH 1/2] sata_nv: don't use legacy DMA in ADMA mode by Robert Hancock on Wednesday, November 14, 2007 - 12:14 am. (5 messages)

Next thread: [PATCH] ata_sg_setup_one vs ata_sg_setup? by Rusty Russell on Wednesday, November 14, 2007 - 12:40 am. (4 messages)
To: linux-kernel <linux-kernel@...>, ide <linux-ide@...>, Jeff Garzik <jeff@...>, Tejun Heo <htejun@...>
Date: Wednesday, November 14, 2007 - 12:15 am

This fixes some problems with ATAPI devices on nForce4 controllers in ADMA mode
on systems with memory located above 4GB. We need to delay setting the 64-bit
DMA mask until the PRD table and padding buffer are allocated so that they don't
get allocated above 4GB and break legacy mode (which is needed for ATAPI
devices).

Signed-off-by: Robert Hancock <hancockr@shaw.ca>

--- linux-2.6.24-rc1-git10edit/drivers/ata/sata_nv.c.before 2007-11-13 19:04:18.000000000 -0600
+++ linux-2.6.24-rc1-git10edit/drivers/ata/sata_nv.c 2007-11-13 19:02:34.000000000 -0600
@@ -247,6 +247,7 @@
void __iomem *ctl_block;
void __iomem *gen_block;
void __iomem *notifier_clear_block;
+ u64 adma_dma_mask;
u8 flags;
int last_issue_ncq;
};
@@ -748,7 +749,7 @@
adma_enable = 0;
nv_adma_register_mode(ap);
} else {
- bounce_limit = *ap->dev->dma_mask;
+ bounce_limit = pp->adma_dma_mask;
segment_boundary = NV_ADMA_DMA_BOUNDARY;
sg_tablesize = NV_ADMA_SGTBL_TOTAL_LEN;
adma_enable = 1;
@@ -763,6 +764,11 @@
config_mask = NV_MCP_SATA_CFG_20_PORT0_EN |
NV_MCP_SATA_CFG_20_PORT0_PWB_EN;

+ /* Set appropriate DMA mask. */
+ rc = pci_set_dma_mask(pdev, bounce_limit);
+ if (rc)
+ return rc;
+
if (adma_enable) {
new_reg = current_reg | config_mask;
pp->flags &= ~NV_ADMA_ATAPI_SETUP_COMPLETE;
@@ -1134,6 +1140,7 @@
void *mem;
dma_addr_t mem_dma;
void __iomem *mmio;
+ struct pci_dev *pdev = to_pci_dev(dev);
u16 tmp;

VPRINTK("ENTER\n");
@@ -1153,6 +1160,14 @@
pp->notifier_clear_block = pp->gen_block +
NV_ADMA_NOTIFIER_CLEAR + (4 * ap->port_no);

+ /* Now that the legacy PRD and padding buffer are allocated we can
+ safely raise the DMA mask to allocate the CPB/APRD table. */
+ pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
+ pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
+ /* Store the mask that was actually used so we can restore it later
+ if needed */
+ pp->adma_dma_mask = *dev-&g...

To: Robert Hancock <hancockr@...>
Cc: linux-kernel <linux-kernel@...>, ide <linux-ide@...>, Jeff Garzik <jeff@...>
Date: Wednesday, November 14, 2007 - 9:38 pm

applied to #tj-upstream-fixes.

--
tejun
-

To: Tejun Heo <htejun@...>
Cc: linux-kernel <linux-kernel@...>, ide <linux-ide@...>, Jeff Garzik <jeff@...>
Date: Thursday, November 15, 2007 - 12:06 am

I have a report that these patches crashed but the previous patch worked:

https://bugzilla.redhat.com/show_bug.cgi?id=351451

So there may still be a problem here.
-

To: Robert Hancock <hancockr@...>
Cc: linux-kernel <linux-kernel@...>, ide <linux-ide@...>, Jeff Garzik <jeff@...>
Date: Monday, November 19, 2007 - 8:57 pm

Any progress?

--
tejun
-

To: Tejun Heo <htejun@...>
Cc: linux-kernel <linux-kernel@...>, ide <linux-ide@...>, Jeff Garzik <jeff@...>
Date: Tuesday, November 20, 2007 - 1:25 am

It looks like the problem is that even though we set the DMA mask after
we allocate the PRD and pad buffers, when the other port is set up, the
DMA mask is already over 64-bit and so it allocates its buffers over 4GB
and fails. I think we just need to explicitly set to 32-bit first,
getting the reporter to try that one now.

--
Robert Hancock Saskatoon, SK, Canada
To email, remove "nospam" from hancockr@nospamshaw.ca
Home Page: http://www.roberthancock.com/

-

To: Robert Hancock <hancockr@...>
Cc: linux-kernel <linux-kernel@...>, ide <linux-ide@...>, Jeff Garzik <jeff@...>
Date: Tuesday, November 20, 2007 - 1:49 am

Ah.. right. That makes sense. Thanks.

--
tejun
-

To: Robert Hancock <hancockr@...>
Cc: linux-kernel <linux-kernel@...>, ide <linux-ide@...>, Jeff Garzik <jeff@...>
Date: Thursday, November 15, 2007 - 12:11 am

Hmmm... The change seemed safe to me. Anyways, dropping the patch for
now. Please re-send later. Also, please format patch description such
that it fits in 80c.

Thanks.

--
tejun
-

To: Robert Hancock <hancockr@...>
Cc: linux-kernel <linux-kernel@...>, ide <linux-ide@...>, Jeff Garzik <jeff@...>, Tejun Heo <htejun@...>
Date: Wednesday, November 14, 2007 - 8:05 am

On Tue, 13 Nov 2007 22:15:51 -0600

Acked-by: Alan Cox <alan@redhat.com>
-

Previous thread: [PATCH 1/2] sata_nv: don't use legacy DMA in ADMA mode by Robert Hancock on Wednesday, November 14, 2007 - 12:14 am. (5 messages)

Next thread: [PATCH] ata_sg_setup_one vs ata_sg_setup? by Rusty Russell on Wednesday, November 14, 2007 - 12:40 am. (4 messages)