Release 4.16 drivers/gpu/host1x/hw/intr_hw.c
/*
* Tegra host1x Interrupt Management
*
* Copyright (C) 2010 Google, Inc.
* Copyright (c) 2010-2013, NVIDIA Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/io.h>
#include "../intr.h"
#include "../dev.h"
/*
* Sync point threshold interrupt service function
* Handles sync point threshold triggers, in interrupt context
*/
static void host1x_intr_syncpt_handle(struct host1x_syncpt *syncpt)
{
unsigned int id = syncpt->id;
struct host1x *host = syncpt->host;
host1x_sync_writel(host, BIT(id % 32),
HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(id / 32));
host1x_sync_writel(host, BIT(id % 32),
HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(id / 32));
schedule_work(&syncpt->intr.work);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Terje Bergstrom | 65 | 85.53% | 1 | 33.33% |
Mikko Perttunen | 10 | 13.16% | 1 | 33.33% |
Bhaktipriya Shridhar | 1 | 1.32% | 1 | 33.33% |
Total | 76 | 100.00% | 3 | 100.00% |
static irqreturn_t syncpt_thresh_isr(int irq, void *dev_id)
{
struct host1x *host = dev_id;
unsigned long reg;
unsigned int i, id;
for (i = 0; i < DIV_ROUND_UP(host->info->nb_pts, 32); i++) {
reg = host1x_sync_readl(host,
HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(i));
for_each_set_bit(id, ®, 32) {
struct host1x_syncpt *syncpt =
host->syncpt + (i * 32 + id);
host1x_intr_syncpt_handle(syncpt);
}
}
return IRQ_HANDLED;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Terje Bergstrom | 94 | 93.07% | 1 | 25.00% |
Stephen Warren | 4 | 3.96% | 1 | 25.00% |
Mikko Perttunen | 2 | 1.98% | 1 | 25.00% |
Thierry Reding | 1 | 0.99% | 1 | 25.00% |
Total | 101 | 100.00% | 4 | 100.00% |
static void _host1x_intr_disable_all_syncpt_intrs(struct host1x *host)
{
unsigned int i;
for (i = 0; i < DIV_ROUND_UP(host->info->nb_pts, 32); ++i) {
host1x_sync_writel(host, 0xffffffffu,
HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(i));
host1x_sync_writel(host, 0xffffffffu,
HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(i));
}
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Terje Bergstrom | 57 | 90.48% | 1 | 33.33% |
Stephen Warren | 4 | 6.35% | 1 | 33.33% |
Thierry Reding | 2 | 3.17% | 1 | 33.33% |
Total | 63 | 100.00% | 3 | 100.00% |
static void intr_hw_init(struct host1x *host, u32 cpm)
{
#if HOST1X_HW < 6
/* disable the ip_busy_timeout. this prevents write drops */
host1x_sync_writel(host, 0, HOST1X_SYNC_IP_BUSY_TIMEOUT);
/*
* increase the auto-ack timout to the maximum value. 2d will hang
* otherwise on Tegra2.
*/
host1x_sync_writel(host, 0xff, HOST1X_SYNC_CTXSW_TIMEOUT_CFG);
/* update host clocks per usec */
host1x_sync_writel(host, cpm, HOST1X_SYNC_USEC_CLK);
#endif
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mikko Perttunen | 51 | 100.00% | 1 | 100.00% |
Total | 51 | 100.00% | 1 | 100.00% |
static int
_host1x_intr_init_host_sync(struct host1x *host, u32 cpm,
void (*syncpt_thresh_work)(struct work_struct *))
{
unsigned int i;
int err;
host1x_hw_intr_disable_all_syncpt_intrs(host);
for (i = 0; i < host->info->nb_pts; i++)
INIT_WORK(&host->syncpt[i].intr.work, syncpt_thresh_work);
err = devm_request_irq(host->dev, host->intr_syncpt_irq,
syncpt_thresh_isr, IRQF_SHARED,
"host1x_syncpt", host);
if (err < 0) {
WARN_ON(1);
return err;
}
intr_hw_init(host, cpm);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Terje Bergstrom | 112 | 94.92% | 1 | 25.00% |
Thierry Reding | 3 | 2.54% | 1 | 25.00% |
Arnd Bergmann | 2 | 1.69% | 1 | 25.00% |
Mikko Perttunen | 1 | 0.85% | 1 | 25.00% |
Total | 118 | 100.00% | 4 | 100.00% |
static void _host1x_intr_set_syncpt_threshold(struct host1x *host,
unsigned int id,
u32 thresh)
{
host1x_sync_writel(host, thresh, HOST1X_SYNC_SYNCPT_INT_THRESH(id));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Terje Bergstrom | 28 | 93.33% | 1 | 50.00% |
Thierry Reding | 2 | 6.67% | 1 | 50.00% |
Total | 30 | 100.00% | 2 | 100.00% |
static void _host1x_intr_enable_syncpt_intr(struct host1x *host,
unsigned int id)
{
host1x_sync_writel(host, BIT(id % 32),
HOST1X_SYNC_SYNCPT_THRESH_INT_ENABLE_CPU0(id / 32));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Terje Bergstrom | 27 | 79.41% | 1 | 33.33% |
Mikko Perttunen | 5 | 14.71% | 1 | 33.33% |
Thierry Reding | 2 | 5.88% | 1 | 33.33% |
Total | 34 | 100.00% | 3 | 100.00% |
static void _host1x_intr_disable_syncpt_intr(struct host1x *host,
unsigned int id)
{
host1x_sync_writel(host, BIT(id % 32),
HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(id / 32));
host1x_sync_writel(host, BIT(id % 32),
HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(id / 32));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Terje Bergstrom | 41 | 77.36% | 1 | 33.33% |
Mikko Perttunen | 10 | 18.87% | 1 | 33.33% |
Thierry Reding | 2 | 3.77% | 1 | 33.33% |
Total | 53 | 100.00% | 3 | 100.00% |
static int _host1x_free_syncpt_irq(struct host1x *host)
{
unsigned int i;
devm_free_irq(host->dev, host->intr_syncpt_irq, host);
for (i = 0; i < host->info->nb_pts; i++)
cancel_work_sync(&host->syncpt[i].intr.work);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Terje Bergstrom | 32 | 50.79% | 1 | 33.33% |
Bhaktipriya Shridhar | 30 | 47.62% | 1 | 33.33% |
Thierry Reding | 1 | 1.59% | 1 | 33.33% |
Total | 63 | 100.00% | 3 | 100.00% |
static const struct host1x_intr_ops host1x_intr_ops = {
.init_host_sync = _host1x_intr_init_host_sync,
.set_syncpt_threshold = _host1x_intr_set_syncpt_threshold,
.enable_syncpt_intr = _host1x_intr_enable_syncpt_intr,
.disable_syncpt_intr = _host1x_intr_disable_syncpt_intr,
.disable_all_syncpt_intrs = _host1x_intr_disable_all_syncpt_intrs,
.free_syncpt_irq = _host1x_free_syncpt_irq,
};
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Terje Bergstrom | 509 | 79.04% | 1 | 11.11% |
Mikko Perttunen | 79 | 12.27% | 2 | 22.22% |
Bhaktipriya Shridhar | 31 | 4.81% | 1 | 11.11% |
Thierry Reding | 15 | 2.33% | 3 | 33.33% |
Stephen Warren | 8 | 1.24% | 1 | 11.11% |
Arnd Bergmann | 2 | 0.31% | 1 | 11.11% |
Total | 644 | 100.00% | 9 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.