lkml.org 
[lkml]   [2022]   [Aug]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[Patch v5 04/12] net: mana: Add functions for allocating doorbell page from GDMA
    Date
    From: Long Li <longli@microsoft.com>

    The RDMA device needs to allocate doorbell pages for each user context.
    Implement those functions and expose them for use by the RDMA driver.

    Reviewed-by: Dexuan Cui <decui@microsoft.com>
    Signed-off-by: Long Li <longli@microsoft.com>
    ---
    Change log:
    v4: use EXPORT_SYMBOL_NS

    drivers/net/ethernet/microsoft/mana/gdma.h | 29 ++++++++++
    .../net/ethernet/microsoft/mana/gdma_main.c | 56 +++++++++++++++++++
    2 files changed, 85 insertions(+)

    diff --git a/drivers/net/ethernet/microsoft/mana/gdma.h b/drivers/net/ethernet/microsoft/mana/gdma.h
    index c724ca410fcb..f945755760dc 100644
    --- a/drivers/net/ethernet/microsoft/mana/gdma.h
    +++ b/drivers/net/ethernet/microsoft/mana/gdma.h
    @@ -22,11 +22,15 @@ enum gdma_request_type {
    GDMA_GENERATE_TEST_EQE = 10,
    GDMA_CREATE_QUEUE = 12,
    GDMA_DISABLE_QUEUE = 13,
    + GDMA_ALLOCATE_RESOURCE_RANGE = 22,
    + GDMA_DESTROY_RESOURCE_RANGE = 24,
    GDMA_CREATE_DMA_REGION = 25,
    GDMA_DMA_REGION_ADD_PAGES = 26,
    GDMA_DESTROY_DMA_REGION = 27,
    };

    +#define GDMA_RESOURCE_DOORBELL_PAGE 27
    +
    enum gdma_queue_type {
    GDMA_INVALID_QUEUE,
    GDMA_SQ,
    @@ -568,6 +572,26 @@ struct gdma_register_device_resp {
    u32 db_id;
    }; /* HW DATA */

    +struct gdma_allocate_resource_range_req {
    + struct gdma_req_hdr hdr;
    + u32 resource_type;
    + u32 num_resources;
    + u32 alignment;
    + u32 allocated_resources;
    +};
    +
    +struct gdma_allocate_resource_range_resp {
    + struct gdma_resp_hdr hdr;
    + u32 allocated_resources;
    +};
    +
    +struct gdma_destroy_resource_range_req {
    + struct gdma_req_hdr hdr;
    + u32 resource_type;
    + u32 num_resources;
    + u32 allocated_resources;
    +};
    +
    /* GDMA_CREATE_QUEUE */
    struct gdma_create_queue_req {
    struct gdma_req_hdr hdr;
    @@ -676,4 +700,9 @@ void mana_gd_free_memory(struct gdma_mem_info *gmi);

    int mana_gd_send_request(struct gdma_context *gc, u32 req_len, const void *req,
    u32 resp_len, void *resp);
    +
    +int mana_gd_allocate_doorbell_page(struct gdma_context *gc, int *doorbell_page);
    +
    +int mana_gd_destroy_doorbell_page(struct gdma_context *gc, int doorbell_page);
    +
    #endif /* _GDMA_H */
    diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c
    index 9fafaa0c8e76..3c391b0cfab4 100644
    --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c
    +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c
    @@ -153,6 +153,62 @@ void mana_gd_free_memory(struct gdma_mem_info *gmi)
    gmi->dma_handle);
    }

    +int mana_gd_destroy_doorbell_page(struct gdma_context *gc, int doorbell_page)
    +{
    + struct gdma_destroy_resource_range_req req = {};
    + struct gdma_resp_hdr resp = {};
    + int err;
    +
    + mana_gd_init_req_hdr(&req.hdr, GDMA_DESTROY_RESOURCE_RANGE,
    + sizeof(req), sizeof(resp));
    +
    + req.resource_type = GDMA_RESOURCE_DOORBELL_PAGE;
    + req.num_resources = 1;
    + req.allocated_resources = doorbell_page;
    +
    + err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
    + if (err || resp.status) {
    + dev_err(gc->dev,
    + "Failed to destroy doorbell page: ret %d, 0x%x\n",
    + err, resp.status);
    + return err ? err : -EPROTO;
    + }
    +
    + return 0;
    +}
    +EXPORT_SYMBOL_NS(mana_gd_destroy_doorbell_page, NET_MANA);
    +
    +int mana_gd_allocate_doorbell_page(struct gdma_context *gc,
    + int *doorbell_page)
    +{
    + struct gdma_allocate_resource_range_req req = {};
    + struct gdma_allocate_resource_range_resp resp = {};
    + int err;
    +
    + mana_gd_init_req_hdr(&req.hdr, GDMA_ALLOCATE_RESOURCE_RANGE,
    + sizeof(req), sizeof(resp));
    +
    + req.resource_type = GDMA_RESOURCE_DOORBELL_PAGE;
    + req.num_resources = 1;
    + req.alignment = 1;
    +
    + /* Have GDMA start searching from 0 */
    + req.allocated_resources = 0;
    +
    + err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
    + if (err || resp.hdr.status) {
    + dev_err(gc->dev,
    + "Failed to allocate doorbell page: ret %d, 0x%x\n",
    + err, resp.hdr.status);
    + return err ? err : -EPROTO;
    + }
    +
    + *doorbell_page = resp.allocated_resources;
    +
    + return 0;
    +}
    +EXPORT_SYMBOL_NS(mana_gd_allocate_doorbell_page, NET_MANA);
    +
    static int mana_gd_create_hw_eq(struct gdma_context *gc,
    struct gdma_queue *queue)
    {
    --
    2.17.1
    \
     
     \ /
      Last update: 2022-08-31 02:35    [W:4.260 / U:0.240 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site