mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 05:04:02 +02:00
ata: libahci: clear PxCLBU and PxFBU for AHCI_HFLAG_32BIT_ONLY
A user reported that commit105c42566a("ata: ahci: force 32-bit DMA for JMicron JMB582/JMB585") made the JMicron JMB585 unusable on his board. The failure is seen as soon as the ahci driver is probed, and booting with iommu=off does not solve the problem. Looking at the AHCI specification, PxCLBU and PxFBU are both read only '0' for HBAs that do not support 64-bit addressing. For HBAs that do support 64-bit addressing, the registers are read write, with a reset value that is Implementation Specific. When using the AHCI_HFLAG_32BIT_ONLY flag, the HBA does support 64-bit addressing, and a 32-bit DMA mask is set by simply clearing HOST_CAP_64. Thus, in this case, we need to explicitly clear the registers to 0. Fixes:105c42566a("ata: ahci: force 32-bit DMA for JMicron JMB582/JMB585") Fixes:c7a42156d9("ahci: disable 64bit dma on sb600") Cc: stable@vger.kernel.org Reported-by: Roland Waltersson <roland.waltersson@netinsight.net> Closes: https://lore.kernel.org/linux-ide/IA0PR17MB668730A4ECCD65F7A1DC3EDC9EB62@IA0PR17MB6687.namprd17.prod.outlook.com/ Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Link: https://lore.kernel.org/r/20260904134310.1465051-2-cassel@kernel.org Signed-off-by: Niklas Cassel <cassel@kernel.org>
This commit is contained in:
parent
a19d4f9b8b
commit
82e4753322
|
|
@ -744,15 +744,28 @@ void ahci_start_fis_rx(struct ata_port *ap)
|
|||
struct ahci_port_priv *pp = ap->private_data;
|
||||
u32 tmp;
|
||||
|
||||
/* set FIS registers */
|
||||
/*
|
||||
* On HBAs that only support 32-bit addressing PxCLBU is read only '0'.
|
||||
* When applying the AHCI_HFLAG_32BIT_ONLY quirk, PxCLBU is RW, and the
|
||||
* reset value is Implementation Specific, so we need to clear it to 0.
|
||||
*/
|
||||
if (hpriv->cap & HOST_CAP_64)
|
||||
writel((pp->cmd_slot_dma >> 16) >> 16,
|
||||
port_mmio + PORT_LST_ADDR_HI);
|
||||
else if (hpriv->flags & AHCI_HFLAG_32BIT_ONLY)
|
||||
writel(0, port_mmio + PORT_LST_ADDR_HI);
|
||||
writel(pp->cmd_slot_dma & 0xffffffff, port_mmio + PORT_LST_ADDR);
|
||||
|
||||
/*
|
||||
* On HBAs that only support 32-bit addressing PxFBU is read only '0'.
|
||||
* When applying the AHCI_HFLAG_32BIT_ONLY quirk, PxFBU is RW, and the
|
||||
* reset value is Implementation Specific, so we need to clear it to 0.
|
||||
*/
|
||||
if (hpriv->cap & HOST_CAP_64)
|
||||
writel((pp->rx_fis_dma >> 16) >> 16,
|
||||
port_mmio + PORT_FIS_ADDR_HI);
|
||||
else if (hpriv->flags & AHCI_HFLAG_32BIT_ONLY)
|
||||
writel(0, port_mmio + PORT_FIS_ADDR_HI);
|
||||
writel(pp->rx_fis_dma & 0xffffffff, port_mmio + PORT_FIS_ADDR);
|
||||
|
||||
/* enable FIS reception */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user