mirror of
https://github.com/torvalds/linux.git
synced 2025-11-01 00:58:39 +02:00
Setup RDMA admin queues using device command exposed over auxiliary device and manage these queues using ida. Co-developed-by: Andrew Boyer <andrew.boyer@amd.com> Signed-off-by: Andrew Boyer <andrew.boyer@amd.com> Co-developed-by: Allen Hubbe <allen.hubbe@amd.com> Signed-off-by: Allen Hubbe <allen.hubbe@amd.com> Signed-off-by: Abhijit Gangurde <abhijit.gangurde@amd.com> Link: https://patch.msgid.link/20250903061606.4139957-10-abhijit.gangurde@amd.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
52 lines
1.2 KiB
C
52 lines
1.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (C) 2018-2025, Advanced Micro Devices, Inc. */
|
|
|
|
#include <linux/dma-mapping.h>
|
|
|
|
#include "ionic_queue.h"
|
|
|
|
int ionic_queue_init(struct ionic_queue *q, struct device *dma_dev,
|
|
int depth, size_t stride)
|
|
{
|
|
if (depth < 0 || depth > 0xffff)
|
|
return -EINVAL;
|
|
|
|
if (stride == 0 || stride > 0x10000)
|
|
return -EINVAL;
|
|
|
|
if (depth == 0)
|
|
depth = 1;
|
|
|
|
q->depth_log2 = order_base_2(depth + 1);
|
|
q->stride_log2 = order_base_2(stride);
|
|
|
|
if (q->depth_log2 + q->stride_log2 < PAGE_SHIFT)
|
|
q->depth_log2 = PAGE_SHIFT - q->stride_log2;
|
|
|
|
if (q->depth_log2 > 16 || q->stride_log2 > 16)
|
|
return -EINVAL;
|
|
|
|
q->size = BIT_ULL(q->depth_log2 + q->stride_log2);
|
|
q->mask = BIT(q->depth_log2) - 1;
|
|
|
|
q->ptr = dma_alloc_coherent(dma_dev, q->size, &q->dma, GFP_KERNEL);
|
|
if (!q->ptr)
|
|
return -ENOMEM;
|
|
|
|
/* it will always be page aligned, but just to be sure... */
|
|
if (!PAGE_ALIGNED(q->ptr)) {
|
|
dma_free_coherent(dma_dev, q->size, q->ptr, q->dma);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
q->prod = 0;
|
|
q->cons = 0;
|
|
q->dbell = 0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void ionic_queue_destroy(struct ionic_queue *q, struct device *dma_dev)
|
|
{
|
|
dma_free_coherent(dma_dev, q->size, q->ptr, q->dma);
|
|
}
|