lkml.org 
[lkml]   [2022]   [Sep]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/8] memory: tegra: Add API for retrieving carveout bounds
    Date
    From: Mikko Perttunen <mperttunen@nvidia.com>

    On Tegra234 NVDEC firmware is loaded from a secure carveout, where it
    has been loaded by a bootloader. When booting NVDEC, we need to tell it
    the address of this firmware, which we can determine by checking the
    starting address of the carveout. As such, add an MC API to query the
    bounds of carveouts, and add related information on Tegra234.

    Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
    ---
    drivers/memory/tegra/mc.c | 23 +++++++++++++++++++++++
    drivers/memory/tegra/tegra234.c | 5 +++++
    include/soc/tegra/mc.h | 11 +++++++++++
    3 files changed, 39 insertions(+)

    diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c
    index 2f7a58a9df1a..4650300d3ec3 100644
    --- a/drivers/memory/tegra/mc.c
    +++ b/drivers/memory/tegra/mc.c
    @@ -107,6 +107,29 @@ int tegra_mc_probe_device(struct tegra_mc *mc, struct device *dev)
    }
    EXPORT_SYMBOL_GPL(tegra_mc_probe_device);

    +int tegra_mc_get_carveout_info(struct tegra_mc *mc, unsigned int id,
    + phys_addr_t *base, u64 *size)
    +{
    + u32 offset;
    +
    + if (id < 1 || id >= mc->soc->num_carveouts)
    + return -EINVAL;
    +
    + if (id < 6)
    + offset = 0xc0c + 0x50 * (id - 1);
    + else
    + offset = 0x2004 + 0x50 * (id - 6);
    +
    + *base = mc_ch_readl(mc, MC_BROADCAST_CHANNEL, offset + 0x0);
    + *base |= (phys_addr_t)mc_ch_readl(mc, MC_BROADCAST_CHANNEL, offset + 0x4) << 32;
    +
    + if (size)
    + *size = mc_ch_readl(mc, MC_BROADCAST_CHANNEL, offset + 0x8) << 17;
    +
    + return 0;
    +}
    +EXPORT_SYMBOL_GPL(tegra_mc_get_carveout_info);
    +
    static int tegra_mc_block_dma_common(struct tegra_mc *mc,
    const struct tegra_mc_reset *rst)
    {
    diff --git a/drivers/memory/tegra/tegra234.c b/drivers/memory/tegra/tegra234.c
    index a9e8fd99730f..74d291d66366 100644
    --- a/drivers/memory/tegra/tegra234.c
    +++ b/drivers/memory/tegra/tegra234.c
    @@ -187,4 +187,9 @@ const struct tegra_mc_soc tegra234_mc_soc = {
    .ops = &tegra186_mc_ops,
    .ch_intmask = 0x0000ff00,
    .global_intstatus_channel_shift = 8,
    + /*
    + * Additionally, there are lite carveouts but those are not currently
    + * supported.
    + */
    + .num_carveouts = 32,
    };
    diff --git a/include/soc/tegra/mc.h b/include/soc/tegra/mc.h
    index 47ce6d434427..51a2263e1bc5 100644
    --- a/include/soc/tegra/mc.h
    +++ b/include/soc/tegra/mc.h
    @@ -193,6 +193,8 @@ struct tegra_mc_soc {
    unsigned int num_address_bits;
    unsigned int atom_size;

    + unsigned int num_carveouts;
    +
    u16 client_id_mask;
    u8 num_channels;

    @@ -244,6 +246,8 @@ unsigned int tegra_mc_get_emem_device_count(struct tegra_mc *mc);
    #ifdef CONFIG_TEGRA_MC
    struct tegra_mc *devm_tegra_memory_controller_get(struct device *dev);
    int tegra_mc_probe_device(struct tegra_mc *mc, struct device *dev);
    +int tegra_mc_get_carveout_info(struct tegra_mc *mc, unsigned int id,
    + phys_addr_t *base, u64 *size);
    #else
    static inline struct tegra_mc *
    devm_tegra_memory_controller_get(struct device *dev)
    @@ -256,6 +260,13 @@ tegra_mc_probe_device(struct tegra_mc *mc, struct device *dev)
    {
    return -ENODEV;
    }
    +
    +static inline int
    +tegra_mc_get_carveout_info(struct tegra_mc *mc, unsigned int id,
    + phys_addr_t *base, u64 *size)
    +{
    + return -ENODEV;
    +}
    #endif

    #endif /* __SOC_TEGRA_MC_H__ */
    --
    2.37.0
    \
     
     \ /
      Last update: 2022-09-06 16:24    [W:2.225 / U:0.760 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site