lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1c3ec10c-8505-a067-d51d-667f47d8d55b@ti.com>
Date:   Wed, 12 Feb 2020 13:01:32 +0200
From:   Roger Quadros <rogerq@...com>
To:     Hans de Goede <hdegoede@...hat.com>, <axboe@...nel.dk>
CC:     <vigneshr@...com>, <nsekhar@...com>, <linux-ide@...r.kernel.org>,
        <linux-kernel@...r.kernel.org>, <stable@...r.kernel.org>,
        <robin.murphy@....com>, Christoph Hellwig <hch@....de>,
        Rob Herring <robh+dt@...nel.org>,
        "devicetree@...r.kernel.org" <devicetree@...r.kernel.org>,
        Kishon Vijay Abraham I <kishon@...com>,
        Péter Ujfalusi <peter.ujfalusi@...com>
Subject: Re: [PATCH] ata: ahci_platform: add 32-bit quirk for dwc-ahci

Hi,

On 06/02/2020 13:50, Hans de Goede wrote:
> Hi,
> 
> On 2/6/20 12:17 PM, Roger Quadros wrote:
>> On TI Platforms using LPAE, SATA breaks with 64-bit DMA.
>> Restrict it to 32-bit.
>>
>> Cc: stable@...r.kernel.org
>> Signed-off-by: Roger Quadros <rogerq@...com>
>> ---
>>   drivers/ata/ahci_platform.c | 3 +++
>>   1 file changed, 3 insertions(+)
>>
>> diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
>> index 3aab2e3d57f3..b925dc54cfa5 100644
>> --- a/drivers/ata/ahci_platform.c
>> +++ b/drivers/ata/ahci_platform.c
>> @@ -62,6 +62,9 @@ static int ahci_probe(struct platform_device *pdev)
>>       if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci"))
>>           hpriv->flags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ;
>> +    if (of_device_is_compatible(dev->of_node, "snps,dwc-ahci"))
>> +        hpriv->flags |= AHCI_HFLAG_32BIT_ONLY;
>> +
> 
> The "snps,dwc-ahci" is a generic (non TI specific) compatible which
> is e.g. also used on some exynos devices. So using that to key the
> setting of the 32 bit flag seems wrong to me.
> 
> IMHO it would be better to introduce a TI specific compatible
> and use that to match on instead (and also adjust the dts files
> accordingly).

Thinking further on this I think it is a bad idea to add a special
binding because the IP is not different. It is just that it is
wired differently on the TI SoC so DMA range is limited.

IMO the proper solution is to have the right dma-ranges property in the
device tree. However, SATA platform driver is doing the wrong thing
by overriding the dma masks.
i.e. in ahci_platform_init_host() in libahci_platform.c

         if (hpriv->cap & HOST_CAP_64) {
                 rc = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(64));
                 if (rc) {
                         rc = dma_coerce_mask_and_coherent(dev,
                                                           DMA_BIT_MASK(32));
                         if (rc) {
                                 dev_err(dev, "Failed to enable 64-bit DMA.\n");
                                 return rc;
                         }
                         dev_warn(dev, "Enable 32-bit DMA instead of 64-bit.\n");
                 }
         }

This should be removed. Do you agree?

You can also see a similar in ahci_configure_dma_masks() with the XXX disclaimer
explaining that it is wrong.

static int ahci_configure_dma_masks(struct pci_dev *pdev, int using_dac)
{
         const int dma_bits = using_dac ? 64 : 32;
         int rc;

         /*
          * If the device fixup already set the dma_mask to some non-standard
          * value, don't extend it here. This happens on STA2X11, for example.
          *
          * XXX: manipulating the DMA mask from platform code is completely
          * bogus, platform code should use dev->bus_dma_limit instead..
          */
         if (pdev->dma_mask && pdev->dma_mask < DMA_BIT_MASK(32))
                 return 0;

         rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(dma_bits));
         if (rc)
                 dev_err(&pdev->dev, "DMA enable failed\n");
         return rc;
}


> 
> Regards,
> 
> Hans
> 
> 
> 
>>       port = acpi_device_get_match_data(dev);
>>       if (!port)
>>           port = &ahci_port_info;
>>
> 

-- 
cheers,
-roger
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ