Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ps3.h
Go to the documentation of this file.
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/init.h>
25 #include <linux/types.h>
26 #include <linux/device.h>
27 #include <asm/cell-pmu.h>
28 
31  struct {
36  };
37 };
38 
40 int ps3_compare_firmware_version(u16 major, u16 minor, u16 rev);
41 
42 /* 'Other OS' area */
43 
49 };
50 
52 
53 extern u64 ps3_os_area_get_rtc_diff(void);
54 extern void ps3_os_area_set_rtc_diff(u64 rtc_diff);
55 
57  ssize_t (*read)(void *buf, size_t count, loff_t pos);
58  ssize_t (*write)(const void *buf, size_t count, loff_t pos);
59 };
60 
61 extern void ps3_os_area_flash_register(const struct ps3_os_area_flash_ops *ops);
62 
63 /* dma routines */
64 
70 };
71 
75 };
76 
77 struct ps3_dma_region_ops;
78 
94  /* device variables */
96  unsigned char ioid;
99  unsigned long len;
100  unsigned long offset;
101 
102  /* driver variables (set by ps3_dma_region_create) */
103  unsigned long bus_addr;
104  struct {
106  struct list_head head;
107  } chunk_list;
108 };
109 
111  int (*create)(struct ps3_dma_region *);
112  int (*free)(struct ps3_dma_region *);
113  int (*map)(struct ps3_dma_region *,
114  unsigned long virt_addr,
115  unsigned long len,
117  u64 iopte_pp);
118  int (*unmap)(struct ps3_dma_region *,
120  unsigned long len);
121 };
129 struct ps3_system_bus_device;
130 
133  enum ps3_dma_region_type region_type, void *addr, unsigned long len);
136 int ps3_dma_map(struct ps3_dma_region *r, unsigned long virt_addr,
137  unsigned long len, dma_addr_t *bus_addr,
138  u64 iopte_pp);
139 int ps3_dma_unmap(struct ps3_dma_region *r, dma_addr_t bus_addr,
140  unsigned long len);
141 
142 /* mmio routines */
143 
147 };
148 
149 struct ps3_mmio_region_ops;
159  unsigned long bus_addr;
160  unsigned long len;
162  unsigned long lpar_addr;
163 };
164 
166  int (*create)(struct ps3_mmio_region *);
167  int (*free)(struct ps3_mmio_region *);
168 };
177  struct ps3_mmio_region *r, unsigned long bus_addr, unsigned long len,
181 unsigned long ps3_mm_phys_to_lpar(unsigned long phys_addr);
182 
183 /* inrerrupt routines */
184 
189 };
190 
191 int ps3_irq_plug_setup(enum ps3_cpu_binding cpu, unsigned long outlet,
192  unsigned int *virq);
193 int ps3_irq_plug_destroy(unsigned int virq);
194 int ps3_event_receive_port_setup(enum ps3_cpu_binding cpu, unsigned int *virq);
195 int ps3_event_receive_port_destroy(unsigned int virq);
196 int ps3_send_event_locally(unsigned int virq);
197 
198 int ps3_io_irq_setup(enum ps3_cpu_binding cpu, unsigned int interrupt_id,
199  unsigned int *virq);
200 int ps3_io_irq_destroy(unsigned int virq);
201 int ps3_vuart_irq_setup(enum ps3_cpu_binding cpu, void* virt_addr_bmp,
202  unsigned int *virq);
203 int ps3_vuart_irq_destroy(unsigned int virq);
204 int ps3_spe_irq_setup(enum ps3_cpu_binding cpu, unsigned long spe_id,
205  unsigned int class, unsigned int *virq);
206 int ps3_spe_irq_destroy(unsigned int virq);
207 
209  enum ps3_cpu_binding cpu, unsigned int *virq);
211  unsigned int virq);
212 
213 /* lv1 result codes */
214 
217  /* not used -1 */
225  LV1_BUSY = -9,
226  LV1_EMPTY = -10,
228  /* not used -12 */
244 };
245 
246 static inline const char* ps3_result(int result)
247 {
248 #if defined(DEBUG)
249  switch (result) {
250  case LV1_SUCCESS:
251  return "LV1_SUCCESS (0)";
252  case -1:
253  return "** unknown result ** (-1)";
255  return "LV1_RESOURCE_SHORTAGE (-2)";
256  case LV1_NO_PRIVILEGE:
257  return "LV1_NO_PRIVILEGE (-3)";
259  return "LV1_DENIED_BY_POLICY (-4)";
261  return "LV1_ACCESS_VIOLATION (-5)";
262  case LV1_NO_ENTRY:
263  return "LV1_NO_ENTRY (-6)";
264  case LV1_DUPLICATE_ENTRY:
265  return "LV1_DUPLICATE_ENTRY (-7)";
266  case LV1_TYPE_MISMATCH:
267  return "LV1_TYPE_MISMATCH (-8)";
268  case LV1_BUSY:
269  return "LV1_BUSY (-9)";
270  case LV1_EMPTY:
271  return "LV1_EMPTY (-10)";
272  case LV1_WRONG_STATE:
273  return "LV1_WRONG_STATE (-11)";
274  case -12:
275  return "** unknown result ** (-12)";
276  case LV1_NO_MATCH:
277  return "LV1_NO_MATCH (-13)";
279  return "LV1_ALREADY_CONNECTED (-14)";
281  return "LV1_UNSUPPORTED_PARAMETER_VALUE (-15)";
283  return "LV1_CONDITION_NOT_SATISFIED (-16)";
285  return "LV1_ILLEGAL_PARAMETER_VALUE (-17)";
286  case LV1_BAD_OPTION:
287  return "LV1_BAD_OPTION (-18)";
289  return "LV1_IMPLEMENTATION_LIMITATION (-19)";
290  case LV1_NOT_IMPLEMENTED:
291  return "LV1_NOT_IMPLEMENTED (-20)";
293  return "LV1_INVALID_CLASS_ID (-21)";
295  return "LV1_CONSTRAINT_NOT_SATISFIED (-22)";
296  case LV1_ALIGNMENT_ERROR:
297  return "LV1_ALIGNMENT_ERROR (-23)";
298  case LV1_HARDWARE_ERROR:
299  return "LV1_HARDWARE_ERROR (-24)";
301  return "LV1_INVALID_DATA_FORMAT (-25)";
303  return "LV1_INVALID_OPERATION (-26)";
304  case LV1_INTERNAL_ERROR:
305  return "LV1_INTERNAL_ERROR (-32768)";
306  default:
307  BUG();
308  return "** unknown result **";
309  };
310 #else
311  return "";
312 #endif
313 }
314 
315 /* system bus routines */
316 
329 };
330 
334 };
335 
336 #define PS3_MODULE_ALIAS_EHCI "ps3:1:0"
337 #define PS3_MODULE_ALIAS_OHCI "ps3:2:0"
338 #define PS3_MODULE_ALIAS_GELIC "ps3:3:0"
339 #define PS3_MODULE_ALIAS_AV_SETTINGS "ps3:4:0"
340 #define PS3_MODULE_ALIAS_SYSTEM_MANAGER "ps3:5:0"
341 #define PS3_MODULE_ALIAS_STOR_DISK "ps3:6:0"
342 #define PS3_MODULE_ALIAS_STOR_ROM "ps3:7:0"
343 #define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8:0"
344 #define PS3_MODULE_ALIAS_SOUND "ps3:9:0"
345 #define PS3_MODULE_ALIAS_GPU_FB "ps3:10:1"
346 #define PS3_MODULE_ALIAS_GPU_RAMDISK "ps3:10:2"
347 #define PS3_MODULE_ALIAS_LPM "ps3:11:0"
348 
354 };
355 
364 
365  u64 bus_id; /* SB */
366  u64 dev_id; /* SB */
367  unsigned int interrupt_id; /* SB */
368  struct ps3_dma_region *d_region; /* SB, IOC0 */
369  struct ps3_mmio_region *m_region; /* SB, IOC0*/
370  unsigned int port_number; /* VUART */
371  struct { /* LPM */
375  } lpm;
376 
377 /* struct iommu_table *iommu_table; -- waiting for BenH's cleanups */
378  struct device core;
379  void *driver_priv; /* private driver variables */
380 };
381 
384 
394  int (*remove)(struct ps3_system_bus_device *);
396 /* int (*suspend)(struct ps3_system_bus_device *, pm_message_t); */
397 /* int (*resume)(struct ps3_system_bus_device *); */
398 };
399 
403 
404 static inline struct ps3_system_bus_driver *ps3_drv_to_system_bus_drv(
405  struct device_driver *_drv)
406 {
407  return container_of(_drv, struct ps3_system_bus_driver, core);
408 }
409 static inline struct ps3_system_bus_device *ps3_dev_to_system_bus_dev(
410  struct device *_dev)
411 {
412  return container_of(_dev, struct ps3_system_bus_device, core);
413 }
414 static inline struct ps3_system_bus_driver *
415  ps3_system_bus_dev_to_system_bus_drv(struct ps3_system_bus_device *_dev)
416 {
417  BUG_ON(!_dev);
418  BUG_ON(!_dev->core.driver);
419  return ps3_drv_to_system_bus_drv(_dev->core.driver);
420 }
421 
428 static inline void ps3_system_bus_set_drvdata(
429  struct ps3_system_bus_device *dev, void *data)
430 {
431  dev_set_drvdata(&dev->core, data);
432 }
433 static inline void *ps3_system_bus_get_drvdata(
434  struct ps3_system_bus_device *dev)
435 {
436  return dev_get_drvdata(&dev->core);
437 }
438 
439 /* These two need global scope for get_dma_ops(). */
440 
441 extern struct bus_type ps3_system_bus_type;
442 
443 /* system manager */
444 
449 };
450 
451 void ps3_sys_manager_register_ops(const struct ps3_sys_manager_ops *ops);
455 int ps3_sys_manager_get_wol(void);
457 
458 struct ps3_prealloc {
459  const char *name;
460  void *address;
461  unsigned long size;
462  unsigned long align;
463 };
464 
465 extern struct ps3_prealloc ps3fb_videomemory;
467 
468 /* logical performance monitor */
469 
480 };
481 
493 };
494 
495 int ps3_lpm_open(enum ps3_lpm_tb_type tb_type, void *tb_cache,
496  u64 tb_cache_size);
497 int ps3_lpm_close(void);
498 int ps3_lpm_copy_tb(unsigned long offset, void *buf, unsigned long count,
499  unsigned long *bytes_copied);
500 int ps3_lpm_copy_tb_to_user(unsigned long offset, void __user *buf,
501  unsigned long count, unsigned long *bytes_copied);
502 void ps3_set_bookmark(u64 bookmark);
503 void ps3_set_pm_bookmark(u64 tag, u64 incident, u64 th_id);
504 int ps3_set_signal(u64 rtas_signal_group, u8 signal_bit, u16 sub_unit,
505  u8 bus_word);
506 
507 u32 ps3_read_phys_ctr(u32 cpu, u32 phys_ctr);
508 void ps3_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val);
509 u32 ps3_read_ctr(u32 cpu, u32 ctr);
510 void ps3_write_ctr(u32 cpu, u32 ctr, u32 val);
511 
515 void ps3_write_pm(u32 cpu, enum pm_reg_name reg, u32 val);
516 
517 u32 ps3_get_ctr_size(u32 cpu, u32 phys_ctr);
518 void ps3_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size);
519 
520 void ps3_enable_pm(u32 cpu);
521 void ps3_disable_pm(u32 cpu);
524 
526 void ps3_sync_irq(int node);
528 u64 ps3_get_spe_id(void *arg);
529 
530 #endif