lkml.org 
[lkml]   [2020]   [Jul]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 05/13] bus/fsl-mc: Cache the DPRC API version
    Date
    From: Diana Craciun <diana.craciun@oss.nxp.com>

    There are already firmware API commands that have multiple
    versions. For each multiple version command, another command
    to retrieve the API version is issued. This may introduce an important
    overhead. The version does not change while the system is running,
    so the DPRC API version can be safely cached.

    Signed-off-by: Diana Craciun <diana.craciun@oss.nxp.com>
    ---
    drivers/bus/fsl-mc/dprc.c | 30 +++++++++++++++++++++---------
    1 file changed, 21 insertions(+), 9 deletions(-)

    diff --git a/drivers/bus/fsl-mc/dprc.c b/drivers/bus/fsl-mc/dprc.c
    index 602f030d84eb..01bf41743efc 100644
    --- a/drivers/bus/fsl-mc/dprc.c
    +++ b/drivers/bus/fsl-mc/dprc.c
    @@ -1,6 +1,7 @@
    // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
    /*
    * Copyright 2013-2016 Freescale Semiconductor Inc.
    + * Copyright 2020 NXP
    *
    */
    #include <linux/kernel.h>
    @@ -8,6 +9,13 @@

    #include "fsl-mc-private.h"

    +/**
    + * cache the DPRC version to reduce the number of commands
    + * towards the mc firmware
    + */
    +static u16 dprc_major_ver;
    +static u16 dprc_minor_ver;
    +
    /**
    * dprc_open() - Open DPRC object for use
    * @mc_io: Pointer to MC portal's I/O object
    @@ -443,15 +451,19 @@ int dprc_get_obj_region(struct fsl_mc_io *mc_io,
    struct fsl_mc_command cmd = { 0 };
    struct dprc_cmd_get_obj_region *cmd_params;
    struct dprc_rsp_get_obj_region *rsp_params;
    - u16 major_ver, minor_ver;
    int err;

    - /* prepare command */
    - err = dprc_get_api_version(mc_io, 0,
    - &major_ver,
    - &minor_ver);
    - if (err)
    - return err;
    + /**
    + * If the DPRC object version was not yet cached, cache it now.
    + * Otherwise use the already cached value.
    + */
    + if (!dprc_major_ver && !dprc_minor_ver) {
    + err = dprc_get_api_version(mc_io, 0,
    + &dprc_major_ver,
    + &dprc_minor_ver);
    + if (err)
    + return err;
    + }

    /**
    * MC API version 6.3 introduced a new field to the region
    @@ -459,7 +471,7 @@ int dprc_get_obj_region(struct fsl_mc_io *mc_io,
    * address is set to zero to indicate it needs to be obtained elsewhere
    * (typically the device tree).
    */
    - if (major_ver > 6 || (major_ver == 6 && minor_ver >= 3))
    + if (dprc_major_ver > 6 || (dprc_major_ver == 6 && dprc_minor_ver >= 3))
    cmd.header =
    mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG_V2,
    cmd_flags, token);
    @@ -483,7 +495,7 @@ int dprc_get_obj_region(struct fsl_mc_io *mc_io,
    rsp_params = (struct dprc_rsp_get_obj_region *)cmd.params;
    region_desc->base_offset = le64_to_cpu(rsp_params->base_offset);
    region_desc->size = le32_to_cpu(rsp_params->size);
    - if (major_ver > 6 || (major_ver == 6 && minor_ver >= 3))
    + if (dprc_major_ver > 6 || (dprc_major_ver == 6 && dprc_minor_ver >= 3))
    region_desc->base_address = le64_to_cpu(rsp_params->base_addr);
    else
    region_desc->base_address = 0;
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-07-06 14:43    [W:3.761 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site