Skip to content

Commit

Permalink
dmaengine: tegra: Add support for dma-channel-mask
Browse files Browse the repository at this point in the history
Add support for dma-channel-mask so that only the specified channels
are used. This helps to reserve some channels for the firmware.

This was initially achieved by limiting the channel number to 31 in
the driver and adjusting the register address to skip channel0 which
was reserved for a firmware. Now, with this change, the driver can
align more to the actual hardware which has 32 channels.

Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
  • Loading branch information
Akhil R authored and intel-lab-lkp committed Sep 13, 2022
1 parent 74ed7bc commit b760183
Showing 1 changed file with 29 additions and 6 deletions.
35 changes: 29 additions & 6 deletions drivers/dma/tegra186-gpc-dma.c
Expand Up @@ -161,7 +161,10 @@
#define TEGRA_GPCDMA_BURST_COMPLETION_TIMEOUT 5000 /* 5 msec */

/* Channel base address offset from GPCDMA base address */
#define TEGRA_GPCDMA_CHANNEL_BASE_ADD_OFFSET 0x20000
#define TEGRA_GPCDMA_CHANNEL_BASE_ADDR_OFFSET 0x10000

/* Default channel mask reserving channel0 */
#define TEGRA_GPCDMA_DEFAULT_CHANNEL_MASK 0xfffffffe

struct tegra_dma;
struct tegra_dma_channel;
Expand Down Expand Up @@ -246,6 +249,7 @@ struct tegra_dma {
const struct tegra_dma_chip_data *chip_data;
unsigned long sid_m2d_reserved;
unsigned long sid_d2m_reserved;
u32 chan_mask;
void __iomem *base_addr;
struct device *dev;
struct dma_device dma_dev;
Expand Down Expand Up @@ -1288,23 +1292,23 @@ static struct dma_chan *tegra_dma_of_xlate(struct of_phandle_args *dma_spec,
}

static const struct tegra_dma_chip_data tegra186_dma_chip_data = {
.nr_channels = 31,
.nr_channels = 32,
.channel_reg_size = SZ_64K,
.max_dma_count = SZ_1G,
.hw_support_pause = false,
.terminate = tegra_dma_stop_client,
};

static const struct tegra_dma_chip_data tegra194_dma_chip_data = {
.nr_channels = 31,
.nr_channels = 32,
.channel_reg_size = SZ_64K,
.max_dma_count = SZ_1G,
.hw_support_pause = true,
.terminate = tegra_dma_pause,
};

static const struct tegra_dma_chip_data tegra234_dma_chip_data = {
.nr_channels = 31,
.nr_channels = 32,
.channel_reg_size = SZ_64K,
.max_dma_count = SZ_1G,
.hw_support_pause = true,
Expand Down Expand Up @@ -1380,15 +1384,28 @@ static int tegra_dma_probe(struct platform_device *pdev)
}
stream_id = iommu_spec->ids[0] & 0xffff;

ret = device_property_read_u32(&pdev->dev, "dma-channel-mask",
&tdma->chan_mask);
if (ret) {
dev_warn(&pdev->dev,
"Missing dma-channel-mask property, using default channel mask %#x\n",
TEGRA_GPCDMA_DEFAULT_CHANNEL_MASK);
tdma->chan_mask = TEGRA_GPCDMA_DEFAULT_CHANNEL_MASK;
}

INIT_LIST_HEAD(&tdma->dma_dev.channels);
for (i = 0; i < cdata->nr_channels; i++) {
struct tegra_dma_channel *tdc = &tdma->channels[i];

/* Check for channel mask */
if (!((1 << i) & tdma->chan_mask))
continue;

tdc->irq = platform_get_irq(pdev, i);
if (tdc->irq < 0)
return tdc->irq;

tdc->chan_base_offset = TEGRA_GPCDMA_CHANNEL_BASE_ADD_OFFSET +
tdc->chan_base_offset = TEGRA_GPCDMA_CHANNEL_BASE_ADDR_OFFSET +
i * cdata->channel_reg_size;
snprintf(tdc->name, sizeof(tdc->name), "gpcdma.%d", i);
tdc->tdma = tdma;
Expand Down Expand Up @@ -1450,7 +1467,7 @@ static int tegra_dma_probe(struct platform_device *pdev)
}

dev_info(&pdev->dev, "GPC DMA driver register %d channels\n",
cdata->nr_channels);
hweight_long(tdma->chan_mask));

return 0;
}
Expand All @@ -1473,6 +1490,9 @@ static int __maybe_unused tegra_dma_pm_suspend(struct device *dev)
for (i = 0; i < tdma->chip_data->nr_channels; i++) {
struct tegra_dma_channel *tdc = &tdma->channels[i];

if (!((1 << i) & tdma->chan_mask))
continue;

if (tdc->dma_desc) {
dev_err(tdma->dev, "channel %u busy\n", i);
return -EBUSY;
Expand All @@ -1492,6 +1512,9 @@ static int __maybe_unused tegra_dma_pm_resume(struct device *dev)
for (i = 0; i < tdma->chip_data->nr_channels; i++) {
struct tegra_dma_channel *tdc = &tdma->channels[i];

if (!((1 << i) & tdma->chan_mask))
continue;

tegra_dma_program_sid(tdc, tdc->stream_id);
}

Expand Down

0 comments on commit b760183

Please sign in to comment.