mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

The code that figures out what is wrong with the powermac irq device tree data belongs with the rest of the powermac irq code. This patch moves it out of prom_parse.c and into powermac/pic.c so that it is only compiled in when actually needed. Signed-off-by: Grant Likely <grant.likely@secretlab.ca> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Stephen Rothwell <sfr@canb.auug.org.au>
179 lines
5.7 KiB
C
179 lines
5.7 KiB
C
#include <linux/of.h> /* linux/of.h gets to determine #include ordering */
|
|
#ifndef _POWERPC_PROM_H
|
|
#define _POWERPC_PROM_H
|
|
#ifdef __KERNEL__
|
|
|
|
/*
|
|
* Definitions for talking to the Open Firmware PROM on
|
|
* Power Macintosh computers.
|
|
*
|
|
* Copyright (C) 1996-2005 Paul Mackerras.
|
|
*
|
|
* Updates for PPC64 by Peter Bergner & David Engebretsen, IBM Corp.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
#include <linux/types.h>
|
|
#include <linux/of_fdt.h>
|
|
#include <linux/of_irq.h>
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/platform_device.h>
|
|
#include <asm/irq.h>
|
|
#include <asm/atomic.h>
|
|
|
|
#define HAVE_ARCH_DEVTREE_FIXUPS
|
|
|
|
#ifdef CONFIG_PPC32
|
|
/*
|
|
* PCI <-> OF matching functions
|
|
* (XXX should these be here?)
|
|
*/
|
|
struct pci_bus;
|
|
struct pci_dev;
|
|
extern int pci_device_from_OF_node(struct device_node *node,
|
|
u8* bus, u8* devfn);
|
|
extern struct device_node* pci_busdev_to_OF_node(struct pci_bus *, int);
|
|
extern struct device_node* pci_device_to_OF_node(struct pci_dev *);
|
|
extern void pci_create_OF_bus_map(void);
|
|
#endif
|
|
|
|
/*
|
|
* OF address retreival & translation
|
|
*/
|
|
|
|
/* Translate an OF address block into a CPU physical address
|
|
*/
|
|
extern u64 of_translate_address(struct device_node *np, const u32 *addr);
|
|
|
|
/* Translate a DMA address from device space to CPU space */
|
|
extern u64 of_translate_dma_address(struct device_node *dev,
|
|
const u32 *in_addr);
|
|
|
|
/* Extract an address from a device, returns the region size and
|
|
* the address space flags too. The PCI version uses a BAR number
|
|
* instead of an absolute index
|
|
*/
|
|
extern const u32 *of_get_address(struct device_node *dev, int index,
|
|
u64 *size, unsigned int *flags);
|
|
#ifdef CONFIG_PCI
|
|
extern const u32 *of_get_pci_address(struct device_node *dev, int bar_no,
|
|
u64 *size, unsigned int *flags);
|
|
#else
|
|
static inline const u32 *of_get_pci_address(struct device_node *dev,
|
|
int bar_no, u64 *size, unsigned int *flags)
|
|
{
|
|
return NULL;
|
|
}
|
|
#endif /* CONFIG_PCI */
|
|
|
|
/* Get an address as a resource. Note that if your address is
|
|
* a PIO address, the conversion will fail if the physical address
|
|
* can't be internally converted to an IO token with
|
|
* pci_address_to_pio(), that is because it's either called to early
|
|
* or it can't be matched to any host bridge IO space
|
|
*/
|
|
extern int of_address_to_resource(struct device_node *dev, int index,
|
|
struct resource *r);
|
|
#ifdef CONFIG_PCI
|
|
extern int of_pci_address_to_resource(struct device_node *dev, int bar,
|
|
struct resource *r);
|
|
#else
|
|
static inline int of_pci_address_to_resource(struct device_node *dev, int bar,
|
|
struct resource *r)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
#endif /* CONFIG_PCI */
|
|
|
|
/* Parse the ibm,dma-window property of an OF node into the busno, phys and
|
|
* size parameters.
|
|
*/
|
|
void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
|
|
unsigned long *busno, unsigned long *phys, unsigned long *size);
|
|
|
|
extern void kdump_move_device_tree(void);
|
|
|
|
/* CPU OF node matching */
|
|
struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
|
|
|
|
/* cache lookup */
|
|
struct device_node *of_find_next_cache_node(struct device_node *np);
|
|
|
|
/* Get the MAC address */
|
|
extern const void *of_get_mac_address(struct device_node *np);
|
|
|
|
/*
|
|
* OF interrupt mapping
|
|
*/
|
|
|
|
#define OF_IMAP_OLDWORLD_MAC 0x00000001
|
|
#define OF_IMAP_NO_PHANDLE 0x00000002
|
|
|
|
#if defined(CONFIG_PPC32) && defined(CONFIG_PPC_PMAC)
|
|
/* Workarounds only needed for 32bit powermac machines */
|
|
extern unsigned int of_irq_workarounds;
|
|
extern struct device_node *of_irq_dflt_pic;
|
|
extern int of_irq_map_oldworld(struct device_node *device, int index,
|
|
struct of_irq *out_irq);
|
|
#else
|
|
#define of_irq_workarounds (0)
|
|
#define of_irq_dflt_pic (NULL)
|
|
static inline int of_irq_map_oldworld(struct device_node *device, int index,
|
|
struct of_irq *out_irq)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* of_irq_map_raw - Low level interrupt tree parsing
|
|
* @parent: the device interrupt parent
|
|
* @intspec: interrupt specifier ("interrupts" property of the device)
|
|
* @ointsize: size of the passed in interrupt specifier
|
|
* @addr: address specifier (start of "reg" property of the device)
|
|
* @out_irq: structure of_irq filled by this function
|
|
*
|
|
* Returns 0 on success and a negative number on error
|
|
*
|
|
* This function is a low-level interrupt tree walking function. It
|
|
* can be used to do a partial walk with synthetized reg and interrupts
|
|
* properties, for example when resolving PCI interrupts when no device
|
|
* node exist for the parent.
|
|
*
|
|
*/
|
|
|
|
extern int of_irq_map_raw(struct device_node *parent, const u32 *intspec,
|
|
u32 ointsize, const u32 *addr,
|
|
struct of_irq *out_irq);
|
|
|
|
/**
|
|
* of_irq_map_pci - Resolve the interrupt for a PCI device
|
|
* @pdev: the device whose interrupt is to be resolved
|
|
* @out_irq: structure of_irq filled by this function
|
|
*
|
|
* This function resolves the PCI interrupt for a given PCI device. If a
|
|
* device-node exists for a given pci_dev, it will use normal OF tree
|
|
* walking. If not, it will implement standard swizzling and walk up the
|
|
* PCI tree until an device-node is found, at which point it will finish
|
|
* resolving using the OF tree walking.
|
|
*/
|
|
struct pci_dev;
|
|
extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq);
|
|
|
|
extern int of_irq_to_resource(struct device_node *dev, int index,
|
|
struct resource *r);
|
|
|
|
/**
|
|
* of_iomap - Maps the memory mapped IO for a given device_node
|
|
* @device: the device whose io range will be mapped
|
|
* @index: index of the io range
|
|
*
|
|
* Returns a pointer to the mapped memory
|
|
*/
|
|
extern void __iomem *of_iomap(struct device_node *device, int index);
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _POWERPC_PROM_H */
|