* [PATCH v5 1/2] ufs: add a vops to configure block parameter
2021-01-12 2:45 ` [PATCH v5 0/2] permit to set block parameters per vendor Kiwoong Kim
@ 2021-01-12 2:45 ` Kiwoong Kim
2021-01-12 2:45 ` [PATCH v5 2/2] ufs: ufs-exynos: set dma_alignment to 4095 Kiwoong Kim
1 sibling, 0 replies; 5+ messages in thread
From: Kiwoong Kim @ 2021-01-12 2:45 UTC (permalink / raw)
To: linux-scsi, alim.akhtar, avri.altman, jejb, martin.petersen,
beanhuo, asutoshd, cang, bvanassche, grant.jung, sc.suh, hy50.seo,
sh425.lee, bhoon95.kim
Cc: Kiwoong Kim
There could be some cases to set block parameters
per host, because of its own dma structure or whatever.
Signed-off-by: Kiwoong Kim <kwmad.kim@samsung.com>
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Can Guo <cang@codeaurora.org>
---
drivers/scsi/ufs/ufshcd.c | 2 ++
drivers/scsi/ufs/ufshcd.h | 8 ++++++++
2 files changed, 10 insertions(+)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 92d433d..5f89b0e 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -4758,6 +4758,8 @@ static int ufshcd_slave_configure(struct scsi_device *sdev)
ufshcd_crypto_setup_rq_keyslot_manager(hba, q);
+ ufshcd_vops_slave_configure(hba, sdev);
+
return 0;
}
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 61344c4..4bf4fed 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -329,6 +329,7 @@ struct ufs_hba_variant_ops {
void *data);
int (*program_key)(struct ufs_hba *hba,
const union ufs_crypto_cfg_entry *cfg, int slot);
+ void (*slave_configure)(struct scsi_device *sdev);
};
/* clock gating state */
@@ -1228,6 +1229,13 @@ static inline void ufshcd_vops_config_scaling_param(struct ufs_hba *hba,
hba->vops->config_scaling_param(hba, profile, data);
}
+static inline void ufshcd_vops_slave_configure(struct ufs_hba *hba,
+ struct scsi_device *sdev)
+{
+ if (hba->vops && hba->vops->slave_configure)
+ hba->vops->slave_configure(sdev);
+}
+
extern struct ufs_pm_lvl_states ufs_pm_lvl_states[];
/*
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v5 2/2] ufs: ufs-exynos: set dma_alignment to 4095
2021-01-12 2:45 ` [PATCH v5 0/2] permit to set block parameters per vendor Kiwoong Kim
2021-01-12 2:45 ` [PATCH v5 1/2] ufs: add a vops to configure block parameter Kiwoong Kim
@ 2021-01-12 2:45 ` Kiwoong Kim
2021-01-12 7:25 ` Avri Altman
2021-01-12 9:03 ` Christoph Hellwig
1 sibling, 2 replies; 5+ messages in thread
From: Kiwoong Kim @ 2021-01-12 2:45 UTC (permalink / raw)
To: linux-scsi, alim.akhtar, avri.altman, jejb, martin.petersen,
beanhuo, asutoshd, cang, bvanassche, grant.jung, sc.suh, hy50.seo,
sh425.lee, bhoon95.kim
Cc: Kiwoong Kim
Exynos requires one scatterlist entry for smaller than
page size, i.e. 4KB. For the cases of dispatching commands
with more than one scatterlist entry and under 4KB size,
Exynos behaves as follows:
Given that a command to read something
from device is dispatched with two scatterlist entries that
are named AAA and BBB. After dispatching, host builds two PRDT
entries and during transmission, device sends just one DATA IN
because device doesn't care on host dma. The host then tranfers
the whole data from start address of the area named AAA.
In consequence, the area that follows AAA would be corrupted.
|<------------->|
+-------+------------ +-------+
+ AAA + (corrupted) ... + BBB +
+-------+------------ +-------+
Signed-off-by: Kiwoong Kim <kwmad.kim@samsung.com>
---
drivers/scsi/ufs/ufs-exynos.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/scsi/ufs/ufs-exynos.c b/drivers/scsi/ufs/ufs-exynos.c
index a8770ff..8635d9d 100644
--- a/drivers/scsi/ufs/ufs-exynos.c
+++ b/drivers/scsi/ufs/ufs-exynos.c
@@ -14,6 +14,7 @@
#include <linux/of_address.h>
#include <linux/phy/phy.h>
#include <linux/platform_device.h>
+#include <linux/blkdev.h>
#include "ufshcd.h"
#include "ufshcd-pltfrm.h"
@@ -1193,6 +1194,13 @@ static int exynos_ufs_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
return 0;
}
+static void exynos_ufs_slave_configure(struct scsi_device *sdev)
+{
+ struct request_queue *q = sdev->request_queue;
+
+ blk_queue_update_dma_alignment(q, PAGE_SIZE - 1);
+}
+
static struct ufs_hba_variant_ops ufs_hba_exynos_ops = {
.name = "exynos_ufs",
.init = exynos_ufs_init,
@@ -1204,6 +1212,7 @@ static struct ufs_hba_variant_ops ufs_hba_exynos_ops = {
.hibern8_notify = exynos_ufs_hibern8_notify,
.suspend = exynos_ufs_suspend,
.resume = exynos_ufs_resume,
+ .slave_configure = exynos_ufs_slave_configure,
};
static int exynos_ufs_probe(struct platform_device *pdev)
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread