[POWERPC] ps3: add support for ps3 platform
[sfrench/cifs-2.6.git] / include / asm-powerpc / ps3.h
1 /*
2  *  PS3 platform declarations.
3  *
4  *  Copyright (C) 2006 Sony Computer Entertainment Inc.
5  *  Copyright 2006 Sony Corp.
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; version 2 of the License.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #if !defined(_ASM_POWERPC_PS3_H)
22 #define _ASM_POWERPC_PS3_H
23
24 #include <linux/compiler.h> /* for __deprecated */
25 #include <linux/init.h>
26 #include <linux/types.h>
27 #include <linux/device.h>
28
29 /**
30  * struct ps3_device_id - HV bus device identifier from the system repository
31  * @bus_id: HV bus id, {1..} (zero invalid)
32  * @dev_id: HV device id, {0..}
33  */
34
35 struct ps3_device_id {
36         unsigned int bus_id;
37         unsigned int dev_id;
38 };
39
40
41 /* dma routines */
42
43 enum ps3_dma_page_size {
44         PS3_DMA_4K = 12U,
45         PS3_DMA_64K = 16U,
46         PS3_DMA_1M = 20U,
47         PS3_DMA_16M = 24U,
48 };
49
50 enum ps3_dma_region_type {
51         PS3_DMA_OTHER = 0,
52         PS3_DMA_INTERNAL = 2,
53 };
54
55 /**
56  * struct ps3_dma_region - A per device dma state variables structure
57  * @did: The HV device id.
58  * @page_size: The ioc pagesize.
59  * @region_type: The HV region type.
60  * @bus_addr: The 'translated' bus address of the region.
61  * @len: The length in bytes of the region.
62  * @chunk_list: Opaque variable used by the ioc page manager.
63  */
64
65 struct ps3_dma_region {
66         struct ps3_device_id did;
67         enum ps3_dma_page_size page_size;
68         enum ps3_dma_region_type region_type;
69         unsigned long bus_addr;
70         unsigned long len;
71         struct {
72                 spinlock_t lock;
73                 struct list_head head;
74         } chunk_list;
75 };
76
77 /**
78  * struct ps3_dma_region_init - Helper to initialize structure variables
79  *
80  * Helper to properly initialize variables prior to calling
81  * ps3_system_bus_device_register.
82  */
83
84 static inline void ps3_dma_region_init(struct ps3_dma_region *r,
85         const struct ps3_device_id* did, enum ps3_dma_page_size page_size,
86         enum ps3_dma_region_type region_type)
87 {
88         r->did = *did;
89         r->page_size = page_size;
90         r->region_type = region_type;
91 }
92 int ps3_dma_region_create(struct ps3_dma_region *r);
93 int ps3_dma_region_free(struct ps3_dma_region *r);
94 int ps3_dma_map(struct ps3_dma_region *r, unsigned long virt_addr,
95         unsigned long len, unsigned long *bus_addr);
96 int ps3_dma_unmap(struct ps3_dma_region *r, unsigned long bus_addr,
97         unsigned long len);
98
99 /* mmio routines */
100
101 enum ps3_mmio_page_size {
102         PS3_MMIO_4K = 12U,
103         PS3_MMIO_64K = 16U
104 };
105
106 /**
107  * struct ps3_mmio_region - a per device mmio state variables structure
108  *
109  * Current systems can be supported with a single region per device.
110  */
111
112 struct ps3_mmio_region {
113         struct ps3_device_id did;
114         unsigned long bus_addr;
115         unsigned long len;
116         enum ps3_mmio_page_size page_size;
117         unsigned long lpar_addr;
118 };
119
120 /**
121  * struct ps3_mmio_region_init - Helper to initialize structure variables
122  *
123  * Helper to properly initialize variables prior to calling
124  * ps3_system_bus_device_register.
125  */
126
127 static inline void ps3_mmio_region_init(struct ps3_mmio_region *r,
128         const struct ps3_device_id* did, unsigned long bus_addr,
129         unsigned long len, enum ps3_mmio_page_size page_size)
130 {
131         r->did = *did;
132         r->bus_addr = bus_addr;
133         r->len = len;
134         r->page_size = page_size;
135 }
136 int ps3_mmio_region_create(struct ps3_mmio_region *r);
137 int ps3_free_mmio_region(struct ps3_mmio_region *r);
138 unsigned long ps3_mm_phys_to_lpar(unsigned long phys_addr);
139
140 /* inrerrupt routines */
141
142 int ps3_alloc_io_irq(unsigned int interrupt_id, unsigned int *virq);
143 int ps3_free_io_irq(unsigned int virq);
144 int ps3_alloc_event_irq(unsigned int *virq);
145 int ps3_free_event_irq(unsigned int virq);
146 int ps3_send_event_locally(unsigned int virq);
147 int ps3_connect_event_irq(const struct ps3_device_id *did,
148         unsigned int interrupt_id, unsigned int *virq);
149 int ps3_disconnect_event_irq(const struct ps3_device_id *did,
150         unsigned int interrupt_id, unsigned int virq);
151 int ps3_alloc_vuart_irq(void* virt_addr_bmp, unsigned int *virq);
152 int ps3_free_vuart_irq(unsigned int virq);
153 int ps3_alloc_spe_irq(unsigned long spe_id, unsigned int class,
154         unsigned int *virq);
155 int ps3_free_spe_irq(unsigned int virq);
156
157 /* lv1 result codes */
158
159 enum lv1_result {
160         LV1_SUCCESS                     = 0,
161         /* not used                       -1 */
162         LV1_RESOURCE_SHORTAGE           = -2,
163         LV1_NO_PRIVILEGE                = -3,
164         LV1_DENIED_BY_POLICY            = -4,
165         LV1_ACCESS_VIOLATION            = -5,
166         LV1_NO_ENTRY                    = -6,
167         LV1_DUPLICATE_ENTRY             = -7,
168         LV1_TYPE_MISMATCH               = -8,
169         LV1_BUSY                        = -9,
170         LV1_EMPTY                       = -10,
171         LV1_WRONG_STATE                 = -11,
172         /* not used                       -12 */
173         LV1_NO_MATCH                    = -13,
174         LV1_ALREADY_CONNECTED           = -14,
175         LV1_UNSUPPORTED_PARAMETER_VALUE = -15,
176         LV1_CONDITION_NOT_SATISFIED     = -16,
177         LV1_ILLEGAL_PARAMETER_VALUE     = -17,
178         LV1_BAD_OPTION                  = -18,
179         LV1_IMPLEMENTATION_LIMITATION   = -19,
180         LV1_NOT_IMPLEMENTED             = -20,
181         LV1_INVALID_CLASS_ID            = -21,
182         LV1_CONSTRAINT_NOT_SATISFIED    = -22,
183         LV1_ALIGNMENT_ERROR             = -23,
184         LV1_INTERNAL_ERROR              = -32768,
185 };
186
187 static inline const char* ps3_result(int result)
188 {
189 #if defined(DEBUG)
190         switch (result) {
191         case LV1_SUCCESS:
192                 return "LV1_SUCCESS (0)";
193         case -1:
194                 return "** unknown result ** (-1)";
195         case LV1_RESOURCE_SHORTAGE:
196                 return "LV1_RESOURCE_SHORTAGE (-2)";
197         case LV1_NO_PRIVILEGE:
198                 return "LV1_NO_PRIVILEGE (-3)";
199         case LV1_DENIED_BY_POLICY:
200                 return "LV1_DENIED_BY_POLICY (-4)";
201         case LV1_ACCESS_VIOLATION:
202                 return "LV1_ACCESS_VIOLATION (-5)";
203         case LV1_NO_ENTRY:
204                 return "LV1_NO_ENTRY (-6)";
205         case LV1_DUPLICATE_ENTRY:
206                 return "LV1_DUPLICATE_ENTRY (-7)";
207         case LV1_TYPE_MISMATCH:
208                 return "LV1_TYPE_MISMATCH (-8)";
209         case LV1_BUSY:
210                 return "LV1_BUSY (-9)";
211         case LV1_EMPTY:
212                 return "LV1_EMPTY (-10)";
213         case LV1_WRONG_STATE:
214                 return "LV1_WRONG_STATE (-11)";
215         case -12:
216                 return "** unknown result ** (-12)";
217         case LV1_NO_MATCH:
218                 return "LV1_NO_MATCH (-13)";
219         case LV1_ALREADY_CONNECTED:
220                 return "LV1_ALREADY_CONNECTED (-14)";
221         case LV1_UNSUPPORTED_PARAMETER_VALUE:
222                 return "LV1_UNSUPPORTED_PARAMETER_VALUE (-15)";
223         case LV1_CONDITION_NOT_SATISFIED:
224                 return "LV1_CONDITION_NOT_SATISFIED (-16)";
225         case LV1_ILLEGAL_PARAMETER_VALUE:
226                 return "LV1_ILLEGAL_PARAMETER_VALUE (-17)";
227         case LV1_BAD_OPTION:
228                 return "LV1_BAD_OPTION (-18)";
229         case LV1_IMPLEMENTATION_LIMITATION:
230                 return "LV1_IMPLEMENTATION_LIMITATION (-19)";
231         case LV1_NOT_IMPLEMENTED:
232                 return "LV1_NOT_IMPLEMENTED (-20)";
233         case LV1_INVALID_CLASS_ID:
234                 return "LV1_INVALID_CLASS_ID (-21)";
235         case LV1_CONSTRAINT_NOT_SATISFIED:
236                 return "LV1_CONSTRAINT_NOT_SATISFIED (-22)";
237         case LV1_ALIGNMENT_ERROR:
238                 return "LV1_ALIGNMENT_ERROR (-23)";
239         case LV1_INTERNAL_ERROR:
240                 return "LV1_INTERNAL_ERROR (-32768)";
241         default:
242                 BUG();
243                 return "** unknown result **";
244         };
245 #else
246         return "";
247 #endif
248 }
249
250 #endif