Linux Audio

Check our new training course

Loading...
v6.9.4
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2#ifndef _ASM_POWERPC_MACHDEP_H
  3#define _ASM_POWERPC_MACHDEP_H
  4#ifdef __KERNEL__
  5
  6#include <linux/compiler.h>
 
 
 
 
 
 
  7#include <linux/seq_file.h>
  8#include <linux/init.h>
  9#include <linux/dma-mapping.h>
 10#include <linux/export.h>
 11
 
 
 
 
 
 
 
 12struct pt_regs;
 13struct pci_bus;
 14struct device_node;
 15struct iommu_table;
 16struct rtc_time;
 17struct file;
 18struct pci_controller;
 19struct kimage;
 20struct pci_host_bridge;
 21
 22struct machdep_calls {
 23	const char	*name;
 24	const char	*compatible;
 25	const char * const *compatibles;
 26#ifdef CONFIG_PPC64
 
 
 
 
 27#ifdef CONFIG_PM
 
 28	void		(*iommu_restore)(void);
 29#endif
 30#ifdef CONFIG_MEMORY_HOTPLUG
 31	unsigned long	(*memory_block_size)(void);
 32#endif
 33#endif /* CONFIG_PPC64 */
 34
 35	void		(*dma_set_mask)(struct device *dev, u64 dma_mask);
 
 
 36
 37	int		(*probe)(void);
 38	void		(*setup_arch)(void); /* Optional, may be NULL */
 39	/* Optional, may be NULL. */
 40	void		(*show_cpuinfo)(struct seq_file *m);
 
 41	/* Returns the current operating frequency of "cpu" in Hz */
 42	unsigned long  	(*get_proc_freq)(unsigned int cpu);
 43
 44	void		(*init_IRQ)(void);
 45
 46	/* Return an irq, or 0 to indicate there are none pending. */
 47	unsigned int	(*get_irq)(void);
 48
 49	/* PCI stuff */
 50	/* Called after allocating resources */
 51	void		(*pcibios_fixup)(void);
 52	void		(*pci_irq_fixup)(struct pci_dev *dev);
 53	int		(*pcibios_root_bridge_prepare)(struct pci_host_bridge
 54				*bridge);
 55
 56	/* finds all the pci_controllers present at boot */
 57	void 		(*discover_phbs)(void);
 58
 59	/* To setup PHBs when using automatic OF platform driver for PCI */
 60	int		(*pci_setup_phb)(struct pci_controller *host);
 61
 62	void __noreturn	(*restart)(char *cmd);
 63	void __noreturn (*halt)(void);
 64	void		(*panic)(char *str);
 
 65
 66	long		(*time_init)(void); /* Optional, may be NULL */
 67
 68	int		(*set_rtc_time)(struct rtc_time *);
 69	void		(*get_rtc_time)(struct rtc_time *);
 70	time64_t	(*get_boot_time)(void);
 
 
 71
 72	void		(*calibrate_decr)(void);
 73
 74	void		(*progress)(char *, unsigned short);
 75
 76	/* Interface for platform error logging */
 77	void 		(*log_error)(char *buf, unsigned int err_type, int fatal);
 78
 79	unsigned char 	(*nvram_read_val)(int addr);
 80	void		(*nvram_write_val)(int addr, unsigned char val);
 81	ssize_t		(*nvram_write)(char *buf, size_t count, loff_t *index);
 82	ssize_t		(*nvram_read)(char *buf, size_t count, loff_t *index);
 83	ssize_t		(*nvram_size)(void);
 84	void		(*nvram_sync)(void);
 85
 86	/* Exception handlers */
 87	int		(*system_reset_exception)(struct pt_regs *regs);
 88	int 		(*machine_check_exception)(struct pt_regs *regs);
 89	int		(*handle_hmi_exception)(struct pt_regs *regs);
 90
 91	/* Early exception handlers called in realmode */
 92	int		(*hmi_exception_early)(struct pt_regs *regs);
 93	long		(*machine_check_early)(struct pt_regs *regs);
 94
 95	/* Called during machine check exception to retrive fixup address. */
 96	bool		(*mce_check_early_recovery)(struct pt_regs *regs);
 97
 98	void            (*machine_check_log_err)(void);
 99
100	/* Motherboard/chipset features. This is a kind of general purpose
101	 * hook used to control some machine specific features (like reset
102	 * lines, chip power control, etc...).
103	 */
104	long	 	(*feature_call)(unsigned int feature, ...);
105
106	/* Get legacy PCI/IDE interrupt mapping */
107	int		(*pci_get_legacy_ide_irq)(struct pci_dev *dev, int channel);
108
109	/* Get access protection for /dev/mem */
110	pgprot_t	(*phys_mem_access_prot)(unsigned long pfn,
 
111						unsigned long size,
112						pgprot_t vma_prot);
113
114	/*
115	 * Function for waiting for work with reduced power in idle loop;
116	 * called with interrupts disabled.
117	 */
118	void		(*power_save)(void);
119
120	/* Function to enable performance monitor counters for this
121	   platform, called once per cpu. */
122	void		(*enable_pmcs)(void);
123
124	/* Set DABR for this platform, leave empty for default implementation */
125	int		(*set_dabr)(unsigned long dabr,
126				    unsigned long dabrx);
127
128	/* Set DAWR for this platform, leave empty for default implementation */
129	int		(*set_dawr)(int nr, unsigned long dawr,
130				    unsigned long dawrx);
131
132#ifdef CONFIG_PPC32	/* XXX for now */
133	/* A general init function, called by ppc_init in init/main.c.
134	   May be NULL. */
135	void		(*init)(void);
136
 
 
137	/*
138	 * optional PCI "hooks"
139	 */
140	/* Called at then very end of pcibios_init() */
141	void (*pcibios_after_init)(void);
142
143#endif /* CONFIG_PPC32 */
144
145	/* Called in indirect_* to avoid touching devices */
146	int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
147
148	/* Called after PPC generic resource fixup to perform
149	   machine specific fixups */
150	void (*pcibios_fixup_resources)(struct pci_dev *);
151
152	/* Called for each PCI bus in the system when it's probed */
153	void (*pcibios_fixup_bus)(struct pci_bus *);
154
155	/* Called after scan and before resource survey */
156	void (*pcibios_fixup_phb)(struct pci_controller *hose);
157
158	/*
159	 * Called after device has been added to bus and
160	 * before sysfs has been created.
161	 */
162	void (*pcibios_bus_add_device)(struct pci_dev *pdev);
163
164	resource_size_t (*pcibios_default_alignment)(void);
165
166#ifdef CONFIG_PCI_IOV
167	void (*pcibios_fixup_sriov)(struct pci_dev *pdev);
168	resource_size_t (*pcibios_iov_resource_alignment)(struct pci_dev *, int resno);
169	int (*pcibios_sriov_enable)(struct pci_dev *pdev, u16 num_vfs);
170	int (*pcibios_sriov_disable)(struct pci_dev *pdev);
171#endif /* CONFIG_PCI_IOV */
172
173	/* Called to shutdown machine specific hardware not already controlled
174	 * by other drivers.
175	 */
176	void (*machine_shutdown)(void);
177
178#ifdef CONFIG_KEXEC_CORE
179	void (*kexec_cpu_down)(int crash_shutdown, int secondary);
180
 
 
 
 
 
 
 
181	/* Called to perform the _real_ kexec.
182	 * Do NOT allocate memory or fail here. We are past the point of
183	 * no return.
184	 */
185	void (*machine_kexec)(struct kimage *image);
186#endif /* CONFIG_KEXEC_CORE */
187
188#ifdef CONFIG_SUSPEND
189	/* These are called to disable and enable, respectively, IRQs when
190	 * entering a suspend state.  If NULL, then the generic versions
191	 * will be called.  The generic versions disable/enable the
192	 * decrementer along with interrupts.
193	 */
194	void (*suspend_disable_irqs)(void);
195	void (*suspend_enable_irqs)(void);
196#endif
 
197
198#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
199	ssize_t (*cpu_probe)(const char *, size_t);
200	ssize_t (*cpu_release)(const char *, size_t);
201#endif
202
 
203	int (*get_random_seed)(unsigned long *v);
 
204};
205
206extern void e500_idle(void);
207extern void power4_idle(void);
 
208extern void ppc6xx_idle(void);
 
209
210/*
211 * ppc_md contains a copy of the machine description structure for the
212 * current platform. machine_id contains the initial address where the
213 * description was found during boot.
214 */
215extern struct machdep_calls ppc_md;
216extern struct machdep_calls *machine_id;
217
218#define __machine_desc __section(".machine.desc")
219
220#define define_machine(name)					\
221	extern struct machdep_calls mach_##name;		\
222	EXPORT_SYMBOL(mach_##name);				\
223	struct machdep_calls mach_##name __machine_desc =
224
225static inline bool __machine_is(const struct machdep_calls *md)
226{
227	WARN_ON(!machine_id); // complain if used before probe_machine()
228	return machine_id == md;
229}
230
231#define machine_is(name)                                        \
232	({                                                      \
233		extern struct machdep_calls mach_##name __weak; \
234		__machine_is(&mach_##name);                     \
235	})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
237static inline void log_error(char *buf, unsigned int err_type, int fatal)
238{
239	if (ppc_md.log_error)
240		ppc_md.log_error(buf, err_type, fatal);
241}
242
243#define __define_machine_initcall(mach, fn, id) \
244	static int __init __machine_initcall_##mach##_##fn(void) { \
245		if (machine_is(mach)) return fn(); \
246		return 0; \
247	} \
248	__define_initcall(__machine_initcall_##mach##_##fn, id);
249
250#define machine_early_initcall(mach, fn)	__define_machine_initcall(mach, fn, early)
251#define machine_core_initcall(mach, fn)		__define_machine_initcall(mach, fn, 1)
252#define machine_core_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 1s)
253#define machine_postcore_initcall(mach, fn)	__define_machine_initcall(mach, fn, 2)
254#define machine_postcore_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 2s)
255#define machine_arch_initcall(mach, fn)		__define_machine_initcall(mach, fn, 3)
256#define machine_arch_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 3s)
257#define machine_subsys_initcall(mach, fn)	__define_machine_initcall(mach, fn, 4)
258#define machine_subsys_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 4s)
259#define machine_fs_initcall(mach, fn)		__define_machine_initcall(mach, fn, 5)
260#define machine_fs_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 5s)
261#define machine_rootfs_initcall(mach, fn)	__define_machine_initcall(mach, fn, rootfs)
262#define machine_device_initcall(mach, fn)	__define_machine_initcall(mach, fn, 6)
263#define machine_device_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 6s)
264#define machine_late_initcall(mach, fn)		__define_machine_initcall(mach, fn, 7)
265#define machine_late_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 7s)
266
267#endif /* __KERNEL__ */
268#endif /* _ASM_POWERPC_MACHDEP_H */
v4.10.11
 
  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#include <linux/export.h>
 16
 17#include <asm/setup.h>
 18
 19/* We export this macro for external modules like Alsa to know if
 20 * ppc_md.feature_call is implemented or not
 21 */
 22#define CONFIG_PPC_HAS_FEATURE_CALLS
 23
 24struct pt_regs;
 25struct pci_bus;	
 26struct device_node;
 27struct iommu_table;
 28struct rtc_time;
 29struct file;
 30struct pci_controller;
 31struct kimage;
 32struct pci_host_bridge;
 33
 34struct machdep_calls {
 35	char		*name;
 
 
 36#ifdef CONFIG_PPC64
 37	void __iomem *	(*ioremap)(phys_addr_t addr, unsigned long size,
 38				   unsigned long flags, void *caller);
 39	void		(*iounmap)(volatile void __iomem *token);
 40
 41#ifdef CONFIG_PM
 42	void		(*iommu_save)(void);
 43	void		(*iommu_restore)(void);
 44#endif
 45#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
 46	unsigned long	(*memory_block_size)(void);
 47#endif
 48#endif /* CONFIG_PPC64 */
 49
 50	/* Platform set_dma_mask and dma_get_required_mask overrides */
 51	int		(*dma_set_mask)(struct device *dev, u64 dma_mask);
 52	u64		(*dma_get_required_mask)(struct device *dev);
 53
 54	int		(*probe)(void);
 55	void		(*setup_arch)(void); /* Optional, may be NULL */
 56	/* Optional, may be NULL. */
 57	void		(*show_cpuinfo)(struct seq_file *m);
 58	void		(*show_percpuinfo)(struct seq_file *m, int i);
 59	/* Returns the current operating frequency of "cpu" in Hz */
 60	unsigned long  	(*get_proc_freq)(unsigned int cpu);
 61
 62	void		(*init_IRQ)(void);
 63
 64	/* Return an irq, or 0 to indicate there are none pending. */
 65	unsigned int	(*get_irq)(void);
 66
 67	/* PCI stuff */
 68	/* Called after allocating resources */
 69	void		(*pcibios_fixup)(void);
 70	void		(*pci_irq_fixup)(struct pci_dev *dev);
 71	int		(*pcibios_root_bridge_prepare)(struct pci_host_bridge
 72				*bridge);
 73
 
 
 
 74	/* To setup PHBs when using automatic OF platform driver for PCI */
 75	int		(*pci_setup_phb)(struct pci_controller *host);
 76
 77	void __noreturn	(*restart)(char *cmd);
 78	void __noreturn (*halt)(void);
 79	void		(*panic)(char *str);
 80	void		(*cpu_die)(void);
 81
 82	long		(*time_init)(void); /* Optional, may be NULL */
 83
 84	int		(*set_rtc_time)(struct rtc_time *);
 85	void		(*get_rtc_time)(struct rtc_time *);
 86	unsigned long	(*get_boot_time)(void);
 87	unsigned char 	(*rtc_read_val)(int addr);
 88	void		(*rtc_write_val)(int addr, unsigned char val);
 89
 90	void		(*calibrate_decr)(void);
 91
 92	void		(*progress)(char *, unsigned short);
 93
 94	/* Interface for platform error logging */
 95	void 		(*log_error)(char *buf, unsigned int err_type, int fatal);
 96
 97	unsigned char 	(*nvram_read_val)(int addr);
 98	void		(*nvram_write_val)(int addr, unsigned char val);
 99	ssize_t		(*nvram_write)(char *buf, size_t count, loff_t *index);
100	ssize_t		(*nvram_read)(char *buf, size_t count, loff_t *index);	
101	ssize_t		(*nvram_size)(void);		
102	void		(*nvram_sync)(void);
103
104	/* Exception handlers */
105	int		(*system_reset_exception)(struct pt_regs *regs);
106	int 		(*machine_check_exception)(struct pt_regs *regs);
107	int		(*handle_hmi_exception)(struct pt_regs *regs);
108
109	/* Early exception handlers called in realmode */
110	int		(*hmi_exception_early)(struct pt_regs *regs);
 
111
112	/* Called during machine check exception to retrive fixup address. */
113	bool		(*mce_check_early_recovery)(struct pt_regs *regs);
114
 
 
115	/* Motherboard/chipset features. This is a kind of general purpose
116	 * hook used to control some machine specific features (like reset
117	 * lines, chip power control, etc...).
118	 */
119	long	 	(*feature_call)(unsigned int feature, ...);
120
121	/* Get legacy PCI/IDE interrupt mapping */ 
122	int		(*pci_get_legacy_ide_irq)(struct pci_dev *dev, int channel);
123	
124	/* Get access protection for /dev/mem */
125	pgprot_t	(*phys_mem_access_prot)(struct file *file,
126						unsigned long pfn,
127						unsigned long size,
128						pgprot_t vma_prot);
129
130	/*
131	 * Function for waiting for work with reduced power in idle loop;
132	 * called with interrupts disabled.
133	 */
134	void		(*power_save)(void);
135
136	/* Function to enable performance monitor counters for this
137	   platform, called once per cpu. */
138	void		(*enable_pmcs)(void);
139
140	/* Set DABR for this platform, leave empty for default implementation */
141	int		(*set_dabr)(unsigned long dabr,
142				    unsigned long dabrx);
143
144	/* Set DAWR for this platform, leave empty for default implementation */
145	int		(*set_dawr)(unsigned long dawr,
146				    unsigned long dawrx);
147
148#ifdef CONFIG_PPC32	/* XXX for now */
149	/* A general init function, called by ppc_init in init/main.c.
150	   May be NULL. */
151	void		(*init)(void);
152
153	void		(*kgdb_map_scc)(void);
154
155	/*
156	 * optional PCI "hooks"
157	 */
158	/* Called at then very end of pcibios_init() */
159	void (*pcibios_after_init)(void);
160
161#endif /* CONFIG_PPC32 */
162
163	/* Called in indirect_* to avoid touching devices */
164	int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
165
166	/* Called after PPC generic resource fixup to perform
167	   machine specific fixups */
168	void (*pcibios_fixup_resources)(struct pci_dev *);
169
170	/* Called for each PCI bus in the system when it's probed */
171	void (*pcibios_fixup_bus)(struct pci_bus *);
172
173	/* Called after scan and before resource survey */
174	void (*pcibios_fixup_phb)(struct pci_controller *hose);
175
 
 
 
 
 
 
 
 
176#ifdef CONFIG_PCI_IOV
177	void (*pcibios_fixup_sriov)(struct pci_dev *pdev);
178	resource_size_t (*pcibios_iov_resource_alignment)(struct pci_dev *, int resno);
 
 
179#endif /* CONFIG_PCI_IOV */
180
181	/* Called to shutdown machine specific hardware not already controlled
182	 * by other drivers.
183	 */
184	void (*machine_shutdown)(void);
185
186#ifdef CONFIG_KEXEC_CORE
187	void (*kexec_cpu_down)(int crash_shutdown, int secondary);
188
189	/* Called to do what every setup is needed on image and the
190	 * reboot code buffer. Returns 0 on success.
191	 * Provide your own (maybe dummy) implementation if your platform
192	 * claims to support kexec.
193	 */
194	int (*machine_kexec_prepare)(struct kimage *image);
195
196	/* Called to perform the _real_ kexec.
197	 * Do NOT allocate memory or fail here. We are past the point of
198	 * no return.
199	 */
200	void (*machine_kexec)(struct kimage *image);
201#endif /* CONFIG_KEXEC_CORE */
202
203#ifdef CONFIG_SUSPEND
204	/* These are called to disable and enable, respectively, IRQs when
205	 * entering a suspend state.  If NULL, then the generic versions
206	 * will be called.  The generic versions disable/enable the
207	 * decrementer along with interrupts.
208	 */
209	void (*suspend_disable_irqs)(void);
210	void (*suspend_enable_irqs)(void);
211#endif
212	int (*suspend_disable_cpu)(void);
213
214#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
215	ssize_t (*cpu_probe)(const char *, size_t);
216	ssize_t (*cpu_release)(const char *, size_t);
217#endif
218
219#ifdef CONFIG_ARCH_RANDOM
220	int (*get_random_seed)(unsigned long *v);
221#endif
222};
223
224extern void e500_idle(void);
225extern void power4_idle(void);
226extern void power7_idle(void);
227extern void ppc6xx_idle(void);
228extern void book3e_idle(void);
229
230/*
231 * ppc_md contains a copy of the machine description structure for the
232 * current platform. machine_id contains the initial address where the
233 * description was found during boot.
234 */
235extern struct machdep_calls ppc_md;
236extern struct machdep_calls *machine_id;
237
238#define __machine_desc __attribute__ ((__section__ (".machine.desc")))
239
240#define define_machine(name)					\
241	extern struct machdep_calls mach_##name;		\
242	EXPORT_SYMBOL(mach_##name);				\
243	struct machdep_calls mach_##name __machine_desc =
244
245#define machine_is(name) \
246	({ \
247		extern struct machdep_calls mach_##name \
248			__attribute__((weak));		 \
249		machine_id == &mach_##name; \
 
 
 
 
 
250	})
251
252extern void probe_machine(void);
253
254#ifdef CONFIG_PPC_PMAC
255/*
256 * Power macintoshes have either a CUDA, PMU or SMU controlling
257 * system reset, power, NVRAM, RTC.
258 */
259typedef enum sys_ctrler_kind {
260	SYS_CTRLER_UNKNOWN = 0,
261	SYS_CTRLER_CUDA = 1,
262	SYS_CTRLER_PMU = 2,
263	SYS_CTRLER_SMU = 3,
264} sys_ctrler_t;
265extern sys_ctrler_t sys_ctrler;
266
267#endif /* CONFIG_PPC_PMAC */
268
269static inline void log_error(char *buf, unsigned int err_type, int fatal)
270{
271	if (ppc_md.log_error)
272		ppc_md.log_error(buf, err_type, fatal);
273}
274
275#define __define_machine_initcall(mach, fn, id) \
276	static int __init __machine_initcall_##mach##_##fn(void) { \
277		if (machine_is(mach)) return fn(); \
278		return 0; \
279	} \
280	__define_initcall(__machine_initcall_##mach##_##fn, id);
281
282#define machine_early_initcall(mach, fn)	__define_machine_initcall(mach, fn, early)
283#define machine_core_initcall(mach, fn)		__define_machine_initcall(mach, fn, 1)
284#define machine_core_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 1s)
285#define machine_postcore_initcall(mach, fn)	__define_machine_initcall(mach, fn, 2)
286#define machine_postcore_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 2s)
287#define machine_arch_initcall(mach, fn)		__define_machine_initcall(mach, fn, 3)
288#define machine_arch_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 3s)
289#define machine_subsys_initcall(mach, fn)	__define_machine_initcall(mach, fn, 4)
290#define machine_subsys_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 4s)
291#define machine_fs_initcall(mach, fn)		__define_machine_initcall(mach, fn, 5)
292#define machine_fs_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 5s)
293#define machine_rootfs_initcall(mach, fn)	__define_machine_initcall(mach, fn, rootfs)
294#define machine_device_initcall(mach, fn)	__define_machine_initcall(mach, fn, 6)
295#define machine_device_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 6s)
296#define machine_late_initcall(mach, fn)		__define_machine_initcall(mach, fn, 7)
297#define machine_late_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 7s)
298
299#endif /* __KERNEL__ */
300#endif /* _ASM_POWERPC_MACHDEP_H */