home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / powerpc / include / asm / machdep.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  11.5 KB  |  367 lines

  1. #ifndef _ASM_POWERPC_MACHDEP_H
  2. #define _ASM_POWERPC_MACHDEP_H
  3. #ifdef __KERNEL__
  4.  
  5. /*
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License
  8.  * as published by the Free Software Foundation; either version
  9.  * 2 of the License, or (at your option) any later version.
  10.  */
  11.  
  12. #include <linux/seq_file.h>
  13. #include <linux/init.h>
  14. #include <linux/dma-mapping.h>
  15.  
  16. #include <asm/setup.h>
  17.  
  18. /* We export this macro for external modules like Alsa to know if
  19.  * ppc_md.feature_call is implemented or not
  20.  */
  21. #define CONFIG_PPC_HAS_FEATURE_CALLS
  22.  
  23. struct pt_regs;
  24. struct pci_bus;    
  25. struct device_node;
  26. struct iommu_table;
  27. struct rtc_time;
  28. struct file;
  29. struct pci_controller;
  30. #ifdef CONFIG_KEXEC
  31. struct kimage;
  32. #endif
  33.  
  34. #ifdef CONFIG_SMP
  35. struct smp_ops_t {
  36.     void  (*message_pass)(int target, int msg);
  37.     int   (*probe)(void);
  38.     void  (*kick_cpu)(int nr);
  39.     void  (*setup_cpu)(int nr);
  40.     void  (*take_timebase)(void);
  41.     void  (*give_timebase)(void);
  42.     int   (*cpu_enable)(unsigned int nr);
  43.     int   (*cpu_disable)(void);
  44.     void  (*cpu_die)(unsigned int nr);
  45.     int   (*cpu_bootable)(unsigned int nr);
  46. };
  47. #endif
  48.  
  49. struct machdep_calls {
  50.     char        *name;
  51. #ifdef CONFIG_PPC64
  52.     void            (*hpte_invalidate)(unsigned long slot,
  53.                        unsigned long va,
  54.                        int psize, int ssize,
  55.                        int local);
  56.     long        (*hpte_updatepp)(unsigned long slot, 
  57.                      unsigned long newpp, 
  58.                      unsigned long va,
  59.                      int psize, int ssize,
  60.                      int local);
  61.     void            (*hpte_updateboltedpp)(unsigned long newpp, 
  62.                            unsigned long ea,
  63.                            int psize, int ssize);
  64.     long        (*hpte_insert)(unsigned long hpte_group,
  65.                        unsigned long va,
  66.                        unsigned long prpn,
  67.                        unsigned long rflags,
  68.                        unsigned long vflags,
  69.                        int psize, int ssize);
  70.     long        (*hpte_remove)(unsigned long hpte_group);
  71.     void            (*hpte_removebolted)(unsigned long ea,
  72.                          int psize, int ssize);
  73.     void        (*flush_hash_range)(unsigned long number, int local);
  74.  
  75.     /* special for kexec, to be called in real mode, linar mapping is
  76.      * destroyed as well */
  77.     void        (*hpte_clear_all)(void);
  78.  
  79.     int        (*tce_build)(struct iommu_table *tbl,
  80.                      long index,
  81.                      long npages,
  82.                      unsigned long uaddr,
  83.                      enum dma_data_direction direction,
  84.                      struct dma_attrs *attrs);
  85.     void        (*tce_free)(struct iommu_table *tbl,
  86.                     long index,
  87.                     long npages);
  88.     unsigned long    (*tce_get)(struct iommu_table *tbl,
  89.                     long index);
  90.     void        (*tce_flush)(struct iommu_table *tbl);
  91.  
  92.     void __iomem *    (*ioremap)(phys_addr_t addr, unsigned long size,
  93.                    unsigned long flags);
  94.     void        (*iounmap)(volatile void __iomem *token);
  95.  
  96. #ifdef CONFIG_PM
  97.     void        (*iommu_save)(void);
  98.     void        (*iommu_restore)(void);
  99. #endif
  100. #endif /* CONFIG_PPC64 */
  101.  
  102.     void        (*pci_dma_dev_setup)(struct pci_dev *dev);
  103.     void        (*pci_dma_bus_setup)(struct pci_bus *bus);
  104.  
  105.     int        (*probe)(void);
  106.     void        (*setup_arch)(void); /* Optional, may be NULL */
  107.     void        (*init_early)(void);
  108.     /* Optional, may be NULL. */
  109.     void        (*show_cpuinfo)(struct seq_file *m);
  110.     void        (*show_percpuinfo)(struct seq_file *m, int i);
  111.  
  112.     void        (*init_IRQ)(void);
  113.     unsigned int    (*get_irq)(void);
  114. #ifdef CONFIG_KEXEC
  115.     void        (*kexec_cpu_down)(int crash_shutdown, int secondary);
  116. #endif
  117.  
  118.     /* PCI stuff */
  119.     /* Called after scanning the bus, before allocating resources */
  120.     void        (*pcibios_fixup)(void);
  121.     int        (*pci_probe_mode)(struct pci_bus *);
  122.     void        (*pci_irq_fixup)(struct pci_dev *dev);
  123.  
  124.     /* To setup PHBs when using automatic OF platform driver for PCI */
  125.     int        (*pci_setup_phb)(struct pci_controller *host);
  126.  
  127. #ifdef CONFIG_PCI_MSI
  128.     int        (*msi_check_device)(struct pci_dev* dev,
  129.                         int nvec, int type);
  130.     int        (*setup_msi_irqs)(struct pci_dev *dev,
  131.                       int nvec, int type);
  132.     void        (*teardown_msi_irqs)(struct pci_dev *dev);
  133. #endif
  134.  
  135.     void        (*restart)(char *cmd);
  136.     void        (*power_off)(void);
  137.     void        (*halt)(void);
  138.     void        (*panic)(char *str);
  139.     void        (*cpu_die)(void);
  140.  
  141.     long        (*time_init)(void); /* Optional, may be NULL */
  142.  
  143.     int        (*set_rtc_time)(struct rtc_time *);
  144.     void        (*get_rtc_time)(struct rtc_time *);
  145.     unsigned long    (*get_boot_time)(void);
  146.     unsigned char     (*rtc_read_val)(int addr);
  147.     void        (*rtc_write_val)(int addr, unsigned char val);
  148.  
  149.     void        (*calibrate_decr)(void);
  150.  
  151.     void        (*progress)(char *, unsigned short);
  152.  
  153.     /* Interface for platform error logging */
  154.     void         (*log_error)(char *buf, unsigned int err_type, int fatal);
  155.  
  156.     unsigned char     (*nvram_read_val)(int addr);
  157.     void        (*nvram_write_val)(int addr, unsigned char val);
  158.     ssize_t        (*nvram_write)(char *buf, size_t count, loff_t *index);
  159.     ssize_t        (*nvram_read)(char *buf, size_t count, loff_t *index);    
  160.     ssize_t        (*nvram_size)(void);        
  161.     void        (*nvram_sync)(void);
  162.  
  163.     /* Exception handlers */
  164.     int        (*system_reset_exception)(struct pt_regs *regs);
  165.     int         (*machine_check_exception)(struct pt_regs *regs);
  166.  
  167.     /* Motherboard/chipset features. This is a kind of general purpose
  168.      * hook used to control some machine specific features (like reset
  169.      * lines, chip power control, etc...).
  170.      */
  171.     long         (*feature_call)(unsigned int feature, ...);
  172.  
  173.     /* Get legacy PCI/IDE interrupt mapping */ 
  174.     int        (*pci_get_legacy_ide_irq)(struct pci_dev *dev, int channel);
  175.     
  176.     /* Get access protection for /dev/mem */
  177.     pgprot_t    (*phys_mem_access_prot)(struct file *file,
  178.                         unsigned long pfn,
  179.                         unsigned long size,
  180.                         pgprot_t vma_prot);
  181.  
  182.     /* Idle loop for this platform, leave empty for default idle loop */
  183.     void        (*idle_loop)(void);
  184.  
  185.     /*
  186.      * Function for waiting for work with reduced power in idle loop;
  187.      * called with interrupts disabled.
  188.      */
  189.     void        (*power_save)(void);
  190.  
  191.     /* Function to enable performance monitor counters for this
  192.        platform, called once per cpu. */
  193.     void        (*enable_pmcs)(void);
  194.  
  195.     /* Set DABR for this platform, leave empty for default implemenation */
  196.     int        (*set_dabr)(unsigned long dabr);
  197.  
  198. #ifdef CONFIG_PPC32    /* XXX for now */
  199.     /* A general init function, called by ppc_init in init/main.c.
  200.        May be NULL. */
  201.     void        (*init)(void);
  202.  
  203.     void        (*kgdb_map_scc)(void);
  204.  
  205.     /*
  206.      * optional PCI "hooks"
  207.      */
  208.     /* Called in indirect_* to avoid touching devices */
  209.     int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
  210.  
  211.     /* Called at then very end of pcibios_init() */
  212.     void (*pcibios_after_init)(void);
  213.  
  214. #endif /* CONFIG_PPC32 */
  215.  
  216.     /* Called after PPC generic resource fixup to perform
  217.        machine specific fixups */
  218.     void (*pcibios_fixup_resources)(struct pci_dev *);
  219.  
  220.     /* Called for each PCI bus in the system when it's probed */
  221.     void (*pcibios_fixup_bus)(struct pci_bus *);
  222.  
  223.     /* Called when pci_enable_device() is called. Returns 0 to
  224.      * allow assignment/enabling of the device. */
  225.     int  (*pcibios_enable_device_hook)(struct pci_dev *);
  226.  
  227.     /* Called to shutdown machine specific hardware not already controlled
  228.      * by other drivers.
  229.      */
  230.     void (*machine_shutdown)(void);
  231.  
  232. #ifdef CONFIG_KEXEC
  233.     /* Called to do the minimal shutdown needed to run a kexec'd kernel
  234.      * to run successfully.
  235.      * XXX Should we move this one out of kexec scope?
  236.      */
  237.     void (*machine_crash_shutdown)(struct pt_regs *regs);
  238.  
  239.     /* Called to do what every setup is needed on image and the
  240.      * reboot code buffer. Returns 0 on success.
  241.      * Provide your own (maybe dummy) implementation if your platform
  242.      * claims to support kexec.
  243.      */
  244.     int (*machine_kexec_prepare)(struct kimage *image);
  245.  
  246.     /* Called to handle any machine specific cleanup on image */
  247.     void (*machine_kexec_cleanup)(struct kimage *image);
  248.  
  249.     /* Called to perform the _real_ kexec.
  250.      * Do NOT allocate memory or fail here. We are past the point of
  251.      * no return.
  252.      */
  253.     void (*machine_kexec)(struct kimage *image);
  254. #endif /* CONFIG_KEXEC */
  255.  
  256. #ifdef CONFIG_SUSPEND
  257.     /* These are called to disable and enable, respectively, IRQs when
  258.      * entering a suspend state.  If NULL, then the generic versions
  259.      * will be called.  The generic versions disable/enable the
  260.      * decrementer along with interrupts.
  261.      */
  262.     void (*suspend_disable_irqs)(void);
  263.     void (*suspend_enable_irqs)(void);
  264. #endif
  265. };
  266.  
  267. extern void e500_idle(void);
  268. extern void power4_idle(void);
  269. extern void power4_cpu_offline_powersave(void);
  270. extern void ppc6xx_idle(void);
  271.  
  272. /*
  273.  * ppc_md contains a copy of the machine description structure for the
  274.  * current platform. machine_id contains the initial address where the
  275.  * description was found during boot.
  276.  */
  277. extern struct machdep_calls ppc_md;
  278. extern struct machdep_calls *machine_id;
  279.  
  280. #define __machine_desc __attribute__ ((__section__ (".machine.desc")))
  281.  
  282. #define define_machine(name)                    \
  283.     extern struct machdep_calls mach_##name;        \
  284.     EXPORT_SYMBOL(mach_##name);                \
  285.     struct machdep_calls mach_##name __machine_desc =
  286.  
  287. #define machine_is(name) \
  288.     ({ \
  289.         extern struct machdep_calls mach_##name \
  290.             __attribute__((weak));         \
  291.         machine_id == &mach_##name; \
  292.     })
  293.  
  294. extern void probe_machine(void);
  295.  
  296. extern char cmd_line[COMMAND_LINE_SIZE];
  297.  
  298. #ifdef CONFIG_PPC_PMAC
  299. /*
  300.  * Power macintoshes have either a CUDA, PMU or SMU controlling
  301.  * system reset, power, NVRAM, RTC.
  302.  */
  303. typedef enum sys_ctrler_kind {
  304.     SYS_CTRLER_UNKNOWN = 0,
  305.     SYS_CTRLER_CUDA = 1,
  306.     SYS_CTRLER_PMU = 2,
  307.     SYS_CTRLER_SMU = 3,
  308. } sys_ctrler_t;
  309. extern sys_ctrler_t sys_ctrler;
  310.  
  311. #endif /* CONFIG_PPC_PMAC */
  312.  
  313. extern void setup_pci_ptrs(void);
  314.  
  315. #ifdef CONFIG_SMP
  316. /* Poor default implementations */
  317. extern void __devinit smp_generic_give_timebase(void);
  318. extern void __devinit smp_generic_take_timebase(void);
  319. #endif /* CONFIG_SMP */
  320.  
  321.  
  322. /* Functions to produce codes on the leds.
  323.  * The SRC code should be unique for the message category and should
  324.  * be limited to the lower 24 bits (the upper 8 are set by these funcs),
  325.  * and (for boot & dump) should be sorted numerically in the order
  326.  * the events occur.
  327.  */
  328. /* Print a boot progress message. */
  329. void ppc64_boot_msg(unsigned int src, const char *msg);
  330. /* Print a termination message (print only -- does not stop the kernel) */
  331. void ppc64_terminate_msg(unsigned int src, const char *msg);
  332.  
  333. static inline void log_error(char *buf, unsigned int err_type, int fatal)
  334. {
  335.     if (ppc_md.log_error)
  336.         ppc_md.log_error(buf, err_type, fatal);
  337. }
  338.  
  339. #define __define_machine_initcall(mach,level,fn,id) \
  340.     static int __init __machine_initcall_##mach##_##fn(void) { \
  341.         if (machine_is(mach)) return fn(); \
  342.         return 0; \
  343.     } \
  344.     __define_initcall(level,__machine_initcall_##mach##_##fn,id);
  345.  
  346. #define machine_core_initcall(mach,fn)        __define_machine_initcall(mach,"1",fn,1)
  347. #define machine_core_initcall_sync(mach,fn)    __define_machine_initcall(mach,"1s",fn,1s)
  348. #define machine_postcore_initcall(mach,fn)    __define_machine_initcall(mach,"2",fn,2)
  349. #define machine_postcore_initcall_sync(mach,fn)    __define_machine_initcall(mach,"2s",fn,2s)
  350. #define machine_arch_initcall(mach,fn)        __define_machine_initcall(mach,"3",fn,3)
  351. #define machine_arch_initcall_sync(mach,fn)    __define_machine_initcall(mach,"3s",fn,3s)
  352. #define machine_subsys_initcall(mach,fn)    __define_machine_initcall(mach,"4",fn,4)
  353. #define machine_subsys_initcall_sync(mach,fn)    __define_machine_initcall(mach,"4s",fn,4s)
  354. #define machine_fs_initcall(mach,fn)        __define_machine_initcall(mach,"5",fn,5)
  355. #define machine_fs_initcall_sync(mach,fn)    __define_machine_initcall(mach,"5s",fn,5s)
  356. #define machine_rootfs_initcall(mach,fn)    __define_machine_initcall(mach,"rootfs",fn,rootfs)
  357. #define machine_device_initcall(mach,fn)    __define_machine_initcall(mach,"6",fn,6)
  358. #define machine_device_initcall_sync(mach,fn)    __define_machine_initcall(mach,"6s",fn,6s)
  359. #define machine_late_initcall(mach,fn)        __define_machine_initcall(mach,"7",fn,7)
  360. #define machine_late_initcall_sync(mach,fn)    __define_machine_initcall(mach,"7s",fn,7s)
  361.  
  362. void generic_suspend_disable_irqs(void);
  363. void generic_suspend_enable_irqs(void);
  364.  
  365. #endif /* __KERNEL__ */
  366. #endif /* _ASM_POWERPC_MACHDEP_H */
  367.