nvhost: Fix tegra_host/status debug output
[linux-2.6.git] / drivers / video / tegra / host / nvhost_cdma.h
1 /*
2  * drivers/video/tegra/host/nvhost_cdma.h
3  *
4  * Tegra Graphics Host Command DMA
5  *
6  * Copyright (c) 2010-2011, NVIDIA Corporation.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  * more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  */
22
23 #ifndef __NVHOST_CDMA_H
24 #define __NVHOST_CDMA_H
25
26 #include <linux/sched.h>
27 #include <linux/semaphore.h>
28
29 #include <linux/nvhost.h>
30 #include <mach/nvmap.h>
31
32 #include "nvhost_acm.h"
33
34 /*
35  * cdma
36  *
37  * This is in charge of a host command DMA channel.
38  * Sends ops to a push buffer, and takes responsibility for unpinning
39  * (& possibly freeing) of memory after those ops have completed.
40  * Producer:
41  *      begin
42  *              push - send ops to the push buffer
43  *      end - start command DMA and enqueue handles to be unpinned
44  * Consumer:
45  *      update - call to update sync queue and push buffer, unpin memory
46  */
47
48
49 struct push_buffer {
50         struct nvmap_handle_ref *mem;   /* handle to pushbuffer memory */
51         u32 *mapped;                    /* mapped pushbuffer memory */
52         u32 phys;                       /* physical address of pushbuffer */
53         u32 fence;                      /* index we've written */
54         u32 cur;                        /* index to write to */
55         struct nvmap_handle **handles;  /* nvmap handle for each opcode pair */
56 };
57
58 struct sync_queue {
59         unsigned int read;                  /* read position within buffer */
60         unsigned int write;                 /* write position within buffer */
61         u32 *buffer;                        /* queue data */
62 };
63
64 enum cdma_event {
65         CDMA_EVENT_NONE,                /* not waiting for any event */
66         CDMA_EVENT_SYNC_QUEUE_EMPTY,    /* wait for empty sync queue */
67         CDMA_EVENT_SYNC_QUEUE_SPACE,    /* wait for space in sync queue */
68         CDMA_EVENT_PUSH_BUFFER_SPACE    /* wait for space in push buffer */
69 };
70
71 struct nvhost_cdma {
72         struct mutex lock;              /* controls access to shared state */
73         struct semaphore sem;           /* signalled when event occurs */
74         enum cdma_event event;          /* event that sem is waiting for */
75         unsigned int slots_used;        /* pb slots used in current submit */
76         unsigned int slots_free;        /* pb slots free in current submit */
77         unsigned int last_put;          /* last value written to DMAPUT */
78         struct push_buffer push_buffer; /* channel's push buffer */
79         struct sync_queue sync_queue;   /* channel's sync queue */
80         bool running;
81
82 };
83
84 #define cdma_to_channel(cdma) container_of(cdma, struct nvhost_channel, cdma)
85 #define cdma_to_dev(cdma) ((cdma_to_channel(cdma))->dev)
86 #define cdma_op(cdma) (cdma_to_dev(cdma)->op.cdma)
87 #define cdma_to_nvmap(cdma) ((cdma_to_dev(cdma))->nvmap)
88 #define pb_to_cdma(pb) container_of(pb, struct nvhost_cdma, push_buffer)
89 #define cdma_pb_op(cdma) (cdma_to_dev(cdma)->op.push_buffer)
90
91
92 int     nvhost_cdma_init(struct nvhost_cdma *cdma);
93 void    nvhost_cdma_deinit(struct nvhost_cdma *cdma);
94 void    nvhost_cdma_stop(struct nvhost_cdma *cdma);
95 void    nvhost_cdma_begin(struct nvhost_cdma *cdma);
96 void    nvhost_cdma_push(struct nvhost_cdma *cdma, u32 op1, u32 op2);
97 void    nvhost_cdma_push_gather(struct nvhost_cdma *cdma,
98                 struct nvmap_handle *handle, u32 op1, u32 op2);
99 void    nvhost_cdma_end(struct nvhost_cdma *cdma,
100                 struct nvmap_client *user_nvmap,
101                 u32 sync_point_id, u32 sync_point_value,
102                 struct nvmap_handle **handles, unsigned int nr_handles);
103 void    nvhost_cdma_update(struct nvhost_cdma *cdma);
104 void    nvhost_cdma_flush(struct nvhost_cdma *cdma);
105 void    nvhost_cdma_peek(struct nvhost_cdma *cdma,
106                 u32 dmaget, int slot, u32 *out);
107
108 unsigned int nvhost_cdma_wait(struct nvhost_cdma *cdma, enum cdma_event event);
109 #endif