diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2013-03-22 10:34:03 -0400 |
---|---|---|
committer | Thierry Reding <thierry.reding@avionic-design.de> | 2013-04-22 06:32:43 -0400 |
commit | 6579324a41cc414009a601738b70a53d6376325c (patch) | |
tree | 61b3491351217d07ff75851c6d989bf02b213383 /drivers/gpu/host1x/cdma.h | |
parent | 7ede0b0bf3e2595d40d6195b6fe4c4dcef438830 (diff) |
gpu: host1x: Add channel support
Add support for host1x client modules, and host1x channels to submit
work to the clients.
Signed-off-by: Arto Merilainen <amerilainen@nvidia.com>
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: Thierry Reding <thierry.reding@avionic-design.de>
Tested-by: Thierry Reding <thierry.reding@avionic-design.de>
Tested-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
Diffstat (limited to 'drivers/gpu/host1x/cdma.h')
-rw-r--r-- | drivers/gpu/host1x/cdma.h | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/drivers/gpu/host1x/cdma.h b/drivers/gpu/host1x/cdma.h new file mode 100644 index 000000000000..313c4b784348 --- /dev/null +++ b/drivers/gpu/host1x/cdma.h | |||
@@ -0,0 +1,100 @@ | |||
1 | /* | ||
2 | * Tegra host1x Command DMA | ||
3 | * | ||
4 | * Copyright (c) 2010-2013, NVIDIA Corporation. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms and conditions of the GNU General Public License, | ||
8 | * version 2, as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
13 | * more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #ifndef __HOST1X_CDMA_H | ||
20 | #define __HOST1X_CDMA_H | ||
21 | |||
22 | #include <linux/sched.h> | ||
23 | #include <linux/semaphore.h> | ||
24 | #include <linux/list.h> | ||
25 | |||
26 | struct host1x_syncpt; | ||
27 | struct host1x_userctx_timeout; | ||
28 | struct host1x_job; | ||
29 | |||
30 | /* | ||
31 | * cdma | ||
32 | * | ||
33 | * This is in charge of a host command DMA channel. | ||
34 | * Sends ops to a push buffer, and takes responsibility for unpinning | ||
35 | * (& possibly freeing) of memory after those ops have completed. | ||
36 | * Producer: | ||
37 | * begin | ||
38 | * push - send ops to the push buffer | ||
39 | * end - start command DMA and enqueue handles to be unpinned | ||
40 | * Consumer: | ||
41 | * update - call to update sync queue and push buffer, unpin memory | ||
42 | */ | ||
43 | |||
44 | struct push_buffer { | ||
45 | u32 *mapped; /* mapped pushbuffer memory */ | ||
46 | dma_addr_t phys; /* physical address of pushbuffer */ | ||
47 | u32 fence; /* index we've written */ | ||
48 | u32 pos; /* index to write to */ | ||
49 | u32 size_bytes; | ||
50 | }; | ||
51 | |||
52 | struct buffer_timeout { | ||
53 | struct delayed_work wq; /* work queue */ | ||
54 | bool initialized; /* timer one-time setup flag */ | ||
55 | struct host1x_syncpt *syncpt; /* buffer completion syncpt */ | ||
56 | u32 syncpt_val; /* syncpt value when completed */ | ||
57 | ktime_t start_ktime; /* starting time */ | ||
58 | /* context timeout information */ | ||
59 | int client; | ||
60 | }; | ||
61 | |||
62 | enum cdma_event { | ||
63 | CDMA_EVENT_NONE, /* not waiting for any event */ | ||
64 | CDMA_EVENT_SYNC_QUEUE_EMPTY, /* wait for empty sync queue */ | ||
65 | CDMA_EVENT_PUSH_BUFFER_SPACE /* wait for space in push buffer */ | ||
66 | }; | ||
67 | |||
68 | struct host1x_cdma { | ||
69 | struct mutex lock; /* controls access to shared state */ | ||
70 | struct semaphore sem; /* signalled when event occurs */ | ||
71 | enum cdma_event event; /* event that sem is waiting for */ | ||
72 | unsigned int slots_used; /* pb slots used in current submit */ | ||
73 | unsigned int slots_free; /* pb slots free in current submit */ | ||
74 | unsigned int first_get; /* DMAGET value, where submit begins */ | ||
75 | unsigned int last_pos; /* last value written to DMAPUT */ | ||
76 | struct push_buffer push_buffer; /* channel's push buffer */ | ||
77 | struct list_head sync_queue; /* job queue */ | ||
78 | struct buffer_timeout timeout; /* channel's timeout state/wq */ | ||
79 | bool running; | ||
80 | bool torndown; | ||
81 | }; | ||
82 | |||
83 | #define cdma_to_channel(cdma) container_of(cdma, struct host1x_channel, cdma) | ||
84 | #define cdma_to_host1x(cdma) dev_get_drvdata(cdma_to_channel(cdma)->dev->parent) | ||
85 | #define pb_to_cdma(pb) container_of(pb, struct host1x_cdma, push_buffer) | ||
86 | |||
87 | int host1x_cdma_init(struct host1x_cdma *cdma); | ||
88 | int host1x_cdma_deinit(struct host1x_cdma *cdma); | ||
89 | void host1x_cdma_stop(struct host1x_cdma *cdma); | ||
90 | int host1x_cdma_begin(struct host1x_cdma *cdma, struct host1x_job *job); | ||
91 | void host1x_cdma_push(struct host1x_cdma *cdma, u32 op1, u32 op2); | ||
92 | void host1x_cdma_end(struct host1x_cdma *cdma, struct host1x_job *job); | ||
93 | void host1x_cdma_update(struct host1x_cdma *cdma); | ||
94 | void host1x_cdma_peek(struct host1x_cdma *cdma, u32 dmaget, int slot, | ||
95 | u32 *out); | ||
96 | unsigned int host1x_cdma_wait_locked(struct host1x_cdma *cdma, | ||
97 | enum cdma_event event); | ||
98 | void host1x_cdma_update_sync_queue(struct host1x_cdma *cdma, | ||
99 | struct device *dev); | ||
100 | #endif | ||