Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

crypto: octeontx2 - Fix address alignment on CN10KB and CN10KA-B0

octeontx2 crypto driver allocates memory using kmalloc/kzalloc,
and uses this memory for dma (does dma_map_single()). It assumes
that kmalloc/kzalloc will return 128-byte aligned address. But
kmalloc/kzalloc returns 8-byte aligned address after below changes:
"9382bc44b5f5 arm64: allow kmalloc() caches aligned to the
smaller cache_line_size()

Memory allocated are used for following purpose:
- Input data or scatter list address - 8-Byte alignment
- Output data or gather list address - 8-Byte alignment
- Completion address - 32-Byte alignment.

This patch ensures all addresses are aligned as mentioned above.

Signed-off-by: Bharat Bhushan <bbhushan2@marvell.com>
Cc: <stable@vger.kernel.org> # v6.8+
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Bharat Bhushan and committed by
Herbert Xu
a091a58b 2e13163b

+44 -15
+44 -15
drivers/crypto/marvell/octeontx2/otx2_cpt_reqmgr.h
··· 350 350 cn10k_sgv2_info_create(struct pci_dev *pdev, struct otx2_cpt_req_info *req, 351 351 gfp_t gfp) 352 352 { 353 - u32 dlen = 0, g_len, sg_len, info_len; 354 - int align = OTX2_CPT_DMA_MINALIGN; 353 + u32 dlen = 0, g_len, s_len, sg_len, info_len; 355 354 struct otx2_cpt_inst_info *info; 356 - u16 g_sz_bytes, s_sz_bytes; 357 355 u32 total_mem_len; 358 356 int i; 359 357 360 - g_sz_bytes = ((req->in_cnt + 2) / 3) * 361 - sizeof(struct cn10kb_cpt_sglist_component); 362 - s_sz_bytes = ((req->out_cnt + 2) / 3) * 363 - sizeof(struct cn10kb_cpt_sglist_component); 358 + /* Allocate memory to meet below alignment requirement: 359 + * ------------------------------------ 360 + * | struct otx2_cpt_inst_info | 361 + * | (No alignment required) | 362 + * | --------------------------------| 363 + * | | padding for ARCH_DMA_MINALIGN | 364 + * | | alignment | 365 + * |------------------------------------| 366 + * | SG List Gather/Input memory | 367 + * | Length = multiple of 32Bytes | 368 + * | Alignment = 8Byte | 369 + * |---------------------------------- | 370 + * | SG List Scatter/Output memory | 371 + * | Length = multiple of 32Bytes | 372 + * | Alignment = 8Byte | 373 + * | -------------------------------| 374 + * | | padding for 32B alignment | 375 + * |------------------------------------| 376 + * | Result response memory | 377 + * | Alignment = 32Byte | 378 + * ------------------------------------ 379 + */ 364 380 365 - g_len = ALIGN(g_sz_bytes, align); 366 - sg_len = ALIGN(g_len + s_sz_bytes, align); 367 - info_len = ALIGN(sizeof(*info), align); 368 - total_mem_len = sg_len + info_len + sizeof(union otx2_cpt_res_s); 381 + info_len = sizeof(*info); 382 + 383 + g_len = ((req->in_cnt + 2) / 3) * 384 + sizeof(struct cn10kb_cpt_sglist_component); 385 + s_len = ((req->out_cnt + 2) / 3) * 386 + sizeof(struct cn10kb_cpt_sglist_component); 387 + sg_len = g_len + s_len; 388 + 389 + /* Allocate extra memory for SG and response address alignment */ 390 + total_mem_len = ALIGN(info_len, OTX2_CPT_DPTR_RPTR_ALIGN); 391 + total_mem_len += (ARCH_DMA_MINALIGN - 1) & 392 + ~(OTX2_CPT_DPTR_RPTR_ALIGN - 1); 393 + total_mem_len += ALIGN(sg_len, OTX2_CPT_RES_ADDR_ALIGN); 394 + total_mem_len += sizeof(union otx2_cpt_res_s); 369 395 370 396 info = kzalloc(total_mem_len, gfp); 371 397 if (unlikely(!info)) ··· 401 375 dlen += req->in[i].size; 402 376 403 377 info->dlen = dlen; 404 - info->in_buffer = (u8 *)info + info_len; 378 + info->in_buffer = PTR_ALIGN((u8 *)info + info_len, ARCH_DMA_MINALIGN); 379 + info->out_buffer = info->in_buffer + g_len; 405 380 info->gthr_sz = req->in_cnt; 406 381 info->sctr_sz = req->out_cnt; 407 382 ··· 414 387 } 415 388 416 389 if (sgv2io_components_setup(pdev, req->out, req->out_cnt, 417 - &info->in_buffer[g_len])) { 390 + info->out_buffer)) { 418 391 dev_err(&pdev->dev, "Failed to setup scatter list\n"); 419 392 goto destroy_info; 420 393 } ··· 431 404 * Get buffer for union otx2_cpt_res_s response 432 405 * structure and its physical address 433 406 */ 434 - info->completion_addr = info->in_buffer + sg_len; 435 - info->comp_baddr = info->dptr_baddr + sg_len; 407 + info->completion_addr = PTR_ALIGN((info->in_buffer + sg_len), 408 + OTX2_CPT_RES_ADDR_ALIGN); 409 + info->comp_baddr = ALIGN((info->dptr_baddr + sg_len), 410 + OTX2_CPT_RES_ADDR_ALIGN); 436 411 437 412 return info; 438 413