]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: ufs: core: Make DMA mask configuration more flexible
authorBart Van Assche <bvanassche@acm.org>
Fri, 18 Oct 2024 19:47:39 +0000 (12:47 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 25 Oct 2024 18:57:51 +0000 (14:57 -0400)
Replace UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS with
ufs_hba_variant_ops::set_dma_mask.  Update the Renesas driver
accordingly.  This patch enables supporting other configurations than
32-bit or 64-bit DMA addresses, e.g. 36-bit DMA addresses.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Link: https://lore.kernel.org/r/20241018194753.775074-1-bvanassche@acm.org
Reviewed-by: Avri Altman <Avri.Altman@wdc.com>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c
drivers/ufs/host/ufs-renesas.c
include/ufs/ufshcd.h

index f2b3e7e45ea294f1fa2b2836c4c114b24ed9ef21..2877e487637d019bb167d3437d1f290600d76cb1 100644 (file)
@@ -2401,8 +2401,6 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
        int err;
 
        hba->capabilities = ufshcd_readl(hba, REG_CONTROLLER_CAPABILITIES);
-       if (hba->quirks & UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS)
-               hba->capabilities &= ~MASK_64_ADDRESSING_SUPPORT;
 
        /* nutrs and nutmrs are 0 based values */
        hba->nutrs = (hba->capabilities & MASK_TRANSFER_REQUESTS_SLOTS_SDB) + 1;
@@ -10315,6 +10313,8 @@ EXPORT_SYMBOL_GPL(ufshcd_dealloc_host);
  */
 static int ufshcd_set_dma_mask(struct ufs_hba *hba)
 {
+       if (hba->vops && hba->vops->set_dma_mask)
+               return hba->vops->set_dma_mask(hba);
        if (hba->capabilities & MASK_64_ADDRESSING_SUPPORT) {
                if (!dma_set_mask_and_coherent(hba->dev, DMA_BIT_MASK(64)))
                        return 0;
index 8711e5cbc9680a3479a5035f4755b249fa618454..3ff97112e1f6d085b59972643a78c3ebc061c24e 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <linux/clk.h>
 #include <linux/delay.h>
+#include <linux/dma-mapping.h>
 #include <linux/err.h>
 #include <linux/iopoll.h>
 #include <linux/kernel.h>
@@ -364,14 +365,20 @@ static int ufs_renesas_init(struct ufs_hba *hba)
                return -ENOMEM;
        ufshcd_set_variant(hba, priv);
 
-       hba->quirks |= UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS | UFSHCD_QUIRK_HIBERN_FASTAUTO;
+       hba->quirks |= UFSHCD_QUIRK_HIBERN_FASTAUTO;
 
        return 0;
 }
 
+static int ufs_renesas_set_dma_mask(struct ufs_hba *hba)
+{
+       return dma_set_mask_and_coherent(hba->dev, DMA_BIT_MASK(32));
+}
+
 static const struct ufs_hba_variant_ops ufs_renesas_vops = {
        .name           = "renesas",
        .init           = ufs_renesas_init,
+       .set_dma_mask   = ufs_renesas_set_dma_mask,
        .setup_clocks   = ufs_renesas_setup_clocks,
        .hce_enable_notify = ufs_renesas_hce_enable_notify,
        .dbg_register_dump = ufs_renesas_dbg_register_dump,
index a95282b9f743f488f97f3c2a043de2e9ea14bcc2..a2d600ff4372c014c8ceeb64b454ab9208567429 100644 (file)
@@ -299,6 +299,8 @@ struct ufs_pwr_mode_info {
  * @max_num_rtt: maximum RTT supported by the host
  * @init: called when the driver is initialized
  * @exit: called to cleanup everything done in init
+ * @set_dma_mask: For setting another DMA mask than indicated by the 64AS
+ *     capability bit.
  * @get_ufs_hci_version: called to get UFS HCI version
  * @clk_scale_notify: notifies that clks are scaled up/down
  * @setup_clocks: called before touching any of the controller registers
@@ -341,6 +343,7 @@ struct ufs_hba_variant_ops {
        int     (*init)(struct ufs_hba *);
        void    (*exit)(struct ufs_hba *);
        u32     (*get_ufs_hci_version)(struct ufs_hba *);
+       int     (*set_dma_mask)(struct ufs_hba *);
        int     (*clk_scale_notify)(struct ufs_hba *, bool,
                                    enum ufs_notify_change_status);
        int     (*setup_clocks)(struct ufs_hba *, bool,
@@ -623,12 +626,6 @@ enum ufshcd_quirks {
         */
        UFSHCD_QUIRK_SKIP_PH_CONFIGURATION              = 1 << 16,
 
-       /*
-        * This quirk needs to be enabled if the host controller has
-        * 64-bit addressing supported capability but it doesn't work.
-        */
-       UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS               = 1 << 17,
-
        /*
         * This quirk needs to be enabled if the host controller has
         * auto-hibernate capability but it's FASTAUTO only.