mmc: cqhci: initialize upper 64 bits of 128-bit task descriptors
Move the task descriptor initialization into cqhci_prep_task_desc(). In addition, make it explicitly initialize all 128 bits of the task descriptor if the host controller is using 128-bit task descriptors, rather than relying on the implicit zeroing from dmam_alloc_coherent(). This is needed to prepare for CQHCI inline encryption support, which requires 128-bit task descriptors and uses the upper 64 bits. Acked-by: Adrian Hunter <adrian.hunter@intel.com> Reviewed-by: Satya Tangirala <satyat@google.com> Reviewed-and-tested-by: Peng Zhou <peng.zhou@mediatek.com> Signed-off-by: Eric Biggers <ebiggers@google.com> Link: https://lore.kernel.org/r/20210126001456.382989-4-ebiggers@kernel.org Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
Родитель
0653300224
Коммит
ee49d0321f
|
@ -408,13 +408,15 @@ static void cqhci_disable(struct mmc_host *mmc)
|
|||
}
|
||||
|
||||
static void cqhci_prep_task_desc(struct mmc_request *mrq,
|
||||
u64 *data, bool intr)
|
||||
struct cqhci_host *cq_host, int tag)
|
||||
{
|
||||
__le64 *task_desc = (__le64 __force *)get_desc(cq_host, tag);
|
||||
u32 req_flags = mrq->data->flags;
|
||||
u64 desc0;
|
||||
|
||||
*data = CQHCI_VALID(1) |
|
||||
desc0 = CQHCI_VALID(1) |
|
||||
CQHCI_END(1) |
|
||||
CQHCI_INT(intr) |
|
||||
CQHCI_INT(1) |
|
||||
CQHCI_ACT(0x5) |
|
||||
CQHCI_FORCED_PROG(!!(req_flags & MMC_DATA_FORCED_PRG)) |
|
||||
CQHCI_DATA_TAG(!!(req_flags & MMC_DATA_DAT_TAG)) |
|
||||
|
@ -425,8 +427,19 @@ static void cqhci_prep_task_desc(struct mmc_request *mrq,
|
|||
CQHCI_BLK_COUNT(mrq->data->blocks) |
|
||||
CQHCI_BLK_ADDR((u64)mrq->data->blk_addr);
|
||||
|
||||
pr_debug("%s: cqhci: tag %d task descriptor 0x%016llx\n",
|
||||
mmc_hostname(mrq->host), mrq->tag, (unsigned long long)*data);
|
||||
task_desc[0] = cpu_to_le64(desc0);
|
||||
|
||||
if (cq_host->caps & CQHCI_TASK_DESC_SZ_128) {
|
||||
u64 desc1 = 0;
|
||||
|
||||
task_desc[1] = cpu_to_le64(desc1);
|
||||
|
||||
pr_debug("%s: cqhci: tag %d task descriptor 0x%016llx%016llx\n",
|
||||
mmc_hostname(mrq->host), mrq->tag, desc1, desc0);
|
||||
} else {
|
||||
pr_debug("%s: cqhci: tag %d task descriptor 0x%016llx\n",
|
||||
mmc_hostname(mrq->host), mrq->tag, desc0);
|
||||
}
|
||||
}
|
||||
|
||||
static int cqhci_dma_map(struct mmc_host *host, struct mmc_request *mrq)
|
||||
|
@ -567,8 +580,6 @@ static inline int cqhci_tag(struct mmc_request *mrq)
|
|||
static int cqhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
||||
{
|
||||
int err = 0;
|
||||
u64 data = 0;
|
||||
u64 *task_desc = NULL;
|
||||
int tag = cqhci_tag(mrq);
|
||||
struct cqhci_host *cq_host = mmc->cqe_private;
|
||||
unsigned long flags;
|
||||
|
@ -598,9 +609,8 @@ static int cqhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|||
}
|
||||
|
||||
if (mrq->data) {
|
||||
task_desc = (__le64 __force *)get_desc(cq_host, tag);
|
||||
cqhci_prep_task_desc(mrq, &data, 1);
|
||||
*task_desc = cpu_to_le64(data);
|
||||
cqhci_prep_task_desc(mrq, cq_host, tag);
|
||||
|
||||
err = cqhci_prep_tran_desc(mrq, cq_host, tag);
|
||||
if (err) {
|
||||
pr_err("%s: cqhci: failed to setup tx desc: %d\n",
|
||||
|
|
Загрузка…
Ссылка в новой задаче