Merge HEAD from master.kernel.org:/pub/scm/linux/kernel/git/paulus/ppc64-2.6
This commit is contained in:
commit
8bc2bee26b
|
@ -21,11 +21,13 @@ CC := $(CC) -m32
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDFLAGS_vmlinux := -Ttext $(KERNELLOAD) -Bstatic
|
LDFLAGS_vmlinux := -Ttext $(KERNELLOAD) -Bstatic
|
||||||
CPPFLAGS += -Iarch/$(ARCH)
|
CPPFLAGS += -Iarch/$(ARCH) -Iinclude3
|
||||||
AFLAGS += -Iarch/$(ARCH)
|
AFLAGS += -Iarch/$(ARCH)
|
||||||
CFLAGS += -Iarch/$(ARCH) -msoft-float -pipe \
|
CFLAGS += -Iarch/$(ARCH) -msoft-float -pipe \
|
||||||
-ffixed-r2 -mmultiple
|
-ffixed-r2 -mmultiple
|
||||||
CPP = $(CC) -E $(CFLAGS)
|
CPP = $(CC) -E $(CFLAGS)
|
||||||
|
# Temporary hack until we have migrated to asm-powerpc
|
||||||
|
LINUXINCLUDE += -Iinclude3
|
||||||
|
|
||||||
CHECKFLAGS += -D__powerpc__
|
CHECKFLAGS += -D__powerpc__
|
||||||
|
|
||||||
|
@ -101,6 +103,7 @@ endef
|
||||||
|
|
||||||
archclean:
|
archclean:
|
||||||
$(Q)$(MAKE) $(clean)=arch/ppc/boot
|
$(Q)$(MAKE) $(clean)=arch/ppc/boot
|
||||||
|
$(Q)rm -rf include3
|
||||||
|
|
||||||
prepare: include/asm-$(ARCH)/offsets.h checkbin
|
prepare: include/asm-$(ARCH)/offsets.h checkbin
|
||||||
|
|
||||||
|
@ -110,6 +113,12 @@ arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
|
||||||
include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
|
include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
|
||||||
$(call filechk,gen-asm-offsets)
|
$(call filechk,gen-asm-offsets)
|
||||||
|
|
||||||
|
# Temporary hack until we have migrated to asm-powerpc
|
||||||
|
include/asm: include3/asm
|
||||||
|
include3/asm:
|
||||||
|
$(Q)if [ ! -d include3 ]; then mkdir -p include3; fi
|
||||||
|
$(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm
|
||||||
|
|
||||||
# Use the file '.tmp_gas_check' for binutils tests, as gas won't output
|
# Use the file '.tmp_gas_check' for binutils tests, as gas won't output
|
||||||
# to stdout and these checks are run even on install targets.
|
# to stdout and these checks are run even on install targets.
|
||||||
TOUT := .tmp_gas_check
|
TOUT := .tmp_gas_check
|
||||||
|
|
|
@ -55,6 +55,8 @@ LDFLAGS := -m elf64ppc
|
||||||
LDFLAGS_vmlinux := -Bstatic -e $(KERNELLOAD) -Ttext $(KERNELLOAD)
|
LDFLAGS_vmlinux := -Bstatic -e $(KERNELLOAD) -Ttext $(KERNELLOAD)
|
||||||
CFLAGS += -msoft-float -pipe -mminimal-toc -mtraceback=none \
|
CFLAGS += -msoft-float -pipe -mminimal-toc -mtraceback=none \
|
||||||
-mcall-aixdesc
|
-mcall-aixdesc
|
||||||
|
# Temporary hack until we have migrated to asm-powerpc
|
||||||
|
CPPFLAGS += -Iinclude3
|
||||||
|
|
||||||
GCC_VERSION := $(call cc-version)
|
GCC_VERSION := $(call cc-version)
|
||||||
GCC_BROKEN_VEC := $(shell if [ $(GCC_VERSION) -lt 0400 ] ; then echo "y"; fi ;)
|
GCC_BROKEN_VEC := $(shell if [ $(GCC_VERSION) -lt 0400 ] ; then echo "y"; fi ;)
|
||||||
|
@ -112,6 +114,7 @@ all: $(KBUILD_IMAGE)
|
||||||
|
|
||||||
archclean:
|
archclean:
|
||||||
$(Q)$(MAKE) $(clean)=$(boot)
|
$(Q)$(MAKE) $(clean)=$(boot)
|
||||||
|
$(Q)rm -rf include3
|
||||||
|
|
||||||
prepare: include/asm-ppc64/offsets.h
|
prepare: include/asm-ppc64/offsets.h
|
||||||
|
|
||||||
|
@ -121,6 +124,12 @@ arch/ppc64/kernel/asm-offsets.s: include/asm include/linux/version.h \
|
||||||
include/asm-ppc64/offsets.h: arch/ppc64/kernel/asm-offsets.s
|
include/asm-ppc64/offsets.h: arch/ppc64/kernel/asm-offsets.s
|
||||||
$(call filechk,gen-asm-offsets)
|
$(call filechk,gen-asm-offsets)
|
||||||
|
|
||||||
|
# Temporary hack until we have migrated to asm-powerpc
|
||||||
|
include/asm: include3/asm
|
||||||
|
include3/asm:
|
||||||
|
$(Q)if [ ! -d include3 ]; then mkdir -p include3; fi;
|
||||||
|
$(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm
|
||||||
|
|
||||||
define archhelp
|
define archhelp
|
||||||
echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)'
|
echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)'
|
||||||
echo ' zImage.initrd- Compressed kernel image with initrd attached,'
|
echo ' zImage.initrd- Compressed kernel image with initrd attached,'
|
||||||
|
|
|
@ -103,10 +103,10 @@ CONFIG_PREEMPT_NONE=y
|
||||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
# CONFIG_PREEMPT_BKL is not set
|
# CONFIG_PREEMPT_BKL is not set
|
||||||
CONFIG_HZ_100=y
|
# CONFIG_HZ_100 is not set
|
||||||
# CONFIG_HZ_250 is not set
|
CONFIG_HZ_250=y
|
||||||
# CONFIG_HZ_1000 is not set
|
# CONFIG_HZ_1000 is not set
|
||||||
CONFIG_HZ=100
|
CONFIG_HZ=250
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_SECCOMP=y
|
CONFIG_SECCOMP=y
|
||||||
CONFIG_ISA_DMA_API=y
|
CONFIG_ISA_DMA_API=y
|
||||||
|
|
|
@ -94,10 +94,10 @@ CONFIG_PREEMPT_NONE=y
|
||||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
# CONFIG_PREEMPT_BKL is not set
|
# CONFIG_PREEMPT_BKL is not set
|
||||||
CONFIG_HZ_100=y
|
# CONFIG_HZ_100 is not set
|
||||||
# CONFIG_HZ_250 is not set
|
CONFIG_HZ_250=y
|
||||||
# CONFIG_HZ_1000 is not set
|
# CONFIG_HZ_1000 is not set
|
||||||
CONFIG_HZ=100
|
CONFIG_HZ=250
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_LPARCFG=y
|
CONFIG_LPARCFG=y
|
||||||
CONFIG_SECCOMP=y
|
CONFIG_SECCOMP=y
|
||||||
|
|
|
@ -103,10 +103,10 @@ CONFIG_PREEMPT_NONE=y
|
||||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
# CONFIG_PREEMPT_BKL is not set
|
# CONFIG_PREEMPT_BKL is not set
|
||||||
CONFIG_HZ_100=y
|
# CONFIG_HZ_100 is not set
|
||||||
# CONFIG_HZ_250 is not set
|
CONFIG_HZ_250=y
|
||||||
# CONFIG_HZ_1000 is not set
|
# CONFIG_HZ_1000 is not set
|
||||||
CONFIG_HZ=100
|
CONFIG_HZ=250
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_SECCOMP=y
|
CONFIG_SECCOMP=y
|
||||||
CONFIG_ISA_DMA_API=y
|
CONFIG_ISA_DMA_API=y
|
||||||
|
|
|
@ -112,10 +112,10 @@ CONFIG_PREEMPT_NONE=y
|
||||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
# CONFIG_PREEMPT_BKL is not set
|
# CONFIG_PREEMPT_BKL is not set
|
||||||
CONFIG_HZ_100=y
|
# CONFIG_HZ_100 is not set
|
||||||
# CONFIG_HZ_250 is not set
|
CONFIG_HZ_250=y
|
||||||
# CONFIG_HZ_1000 is not set
|
# CONFIG_HZ_1000 is not set
|
||||||
CONFIG_HZ=100
|
CONFIG_HZ=250
|
||||||
CONFIG_EEH=y
|
CONFIG_EEH=y
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_PPC_RTAS=y
|
CONFIG_PPC_RTAS=y
|
||||||
|
|
|
@ -114,10 +114,10 @@ CONFIG_PREEMPT_NONE=y
|
||||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
# CONFIG_PREEMPT_BKL is not set
|
# CONFIG_PREEMPT_BKL is not set
|
||||||
CONFIG_HZ_100=y
|
# CONFIG_HZ_100 is not set
|
||||||
# CONFIG_HZ_250 is not set
|
CONFIG_HZ_250=y
|
||||||
# CONFIG_HZ_1000 is not set
|
# CONFIG_HZ_1000 is not set
|
||||||
CONFIG_HZ=100
|
CONFIG_HZ=250
|
||||||
CONFIG_EEH=y
|
CONFIG_EEH=y
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_PPC_RTAS=y
|
CONFIG_PPC_RTAS=y
|
||||||
|
|
|
@ -1269,7 +1269,21 @@ initial_stab:
|
||||||
.= 0x7000
|
.= 0x7000
|
||||||
.globl fwnmi_data_area
|
.globl fwnmi_data_area
|
||||||
fwnmi_data_area:
|
fwnmi_data_area:
|
||||||
.space PAGE_SIZE
|
|
||||||
|
/* iSeries does not use the FWNMI stuff, so it is safe to put
|
||||||
|
* this here, even if we later allow kernels that will boot on
|
||||||
|
* both pSeries and iSeries */
|
||||||
|
#ifdef CONFIG_PPC_ISERIES
|
||||||
|
. = LPARMAP_PHYS
|
||||||
|
#include "lparmap.s"
|
||||||
|
/*
|
||||||
|
* This ".text" is here for old compilers that generate a trailing
|
||||||
|
* .note section when compiling .c files to .s
|
||||||
|
*/
|
||||||
|
.text
|
||||||
|
#endif /* CONFIG_PPC_ISERIES */
|
||||||
|
|
||||||
|
. = 0x8000
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On pSeries, secondary processors spin in the following code.
|
* On pSeries, secondary processors spin in the following code.
|
||||||
|
|
|
@ -68,7 +68,7 @@ static void __init iommu_vio_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vio_register_device: - Register a new vio device.
|
* vio_register_device_iseries: - Register a new iSeries vio device.
|
||||||
* @voidev: The device to register.
|
* @voidev: The device to register.
|
||||||
*/
|
*/
|
||||||
static struct vio_dev *__init vio_register_device_iseries(char *type,
|
static struct vio_dev *__init vio_register_device_iseries(char *type,
|
||||||
|
@ -76,7 +76,7 @@ static struct vio_dev *__init vio_register_device_iseries(char *type,
|
||||||
{
|
{
|
||||||
struct vio_dev *viodev;
|
struct vio_dev *viodev;
|
||||||
|
|
||||||
/* allocate a vio_dev for this node */
|
/* allocate a vio_dev for this device */
|
||||||
viodev = kmalloc(sizeof(struct vio_dev), GFP_KERNEL);
|
viodev = kmalloc(sizeof(struct vio_dev), GFP_KERNEL);
|
||||||
if (!viodev)
|
if (!viodev)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -84,8 +84,15 @@ static struct vio_dev *__init vio_register_device_iseries(char *type,
|
||||||
|
|
||||||
snprintf(viodev->dev.bus_id, BUS_ID_SIZE, "%s%d", type, unit_num);
|
snprintf(viodev->dev.bus_id, BUS_ID_SIZE, "%s%d", type, unit_num);
|
||||||
|
|
||||||
return vio_register_device_common(viodev, viodev->dev.bus_id, type,
|
viodev->name = viodev->dev.bus_id;
|
||||||
unit_num, &vio_iommu_table);
|
viodev->type = type;
|
||||||
|
viodev->unit_address = unit_num;
|
||||||
|
viodev->iommu_table = &vio_iommu_table;
|
||||||
|
if (vio_register_device(viodev) == NULL) {
|
||||||
|
kfree(viodev);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return viodev;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init probe_bus_iseries(void)
|
void __init probe_bus_iseries(void)
|
||||||
|
@ -124,6 +131,10 @@ static int vio_match_device_iseries(const struct vio_device_id *id,
|
||||||
return strncmp(dev->type, id->type, strlen(id->type)) == 0;
|
return strncmp(dev->type, id->type, strlen(id->type)) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct vio_bus_ops vio_bus_ops_iseries = {
|
||||||
|
.match = vio_match_device_iseries,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vio_bus_init_iseries: - Initialize the iSeries virtual IO bus
|
* vio_bus_init_iseries: - Initialize the iSeries virtual IO bus
|
||||||
*/
|
*/
|
||||||
|
@ -131,7 +142,7 @@ static int __init vio_bus_init_iseries(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = vio_bus_init(vio_match_device_iseries, NULL, NULL);
|
err = vio_bus_init(&vio_bus_ops_iseries);
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
iommu_vio_init();
|
iommu_vio_init();
|
||||||
vio_bus_device.iommu_table = &vio_iommu_table;
|
vio_bus_device.iommu_table = &vio_iommu_table;
|
||||||
|
|
|
@ -273,6 +273,7 @@ static void parse_system_parameter_string(struct seq_file *m)
|
||||||
if (!workbuffer) {
|
if (!workbuffer) {
|
||||||
printk(KERN_ERR "%s %s kmalloc failure at line %d \n",
|
printk(KERN_ERR "%s %s kmalloc failure at line %d \n",
|
||||||
__FILE__, __FUNCTION__, __LINE__);
|
__FILE__, __FUNCTION__, __LINE__);
|
||||||
|
kfree(local_buffer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef LPARCFG_DEBUG
|
#ifdef LPARCFG_DEBUG
|
||||||
|
|
|
@ -236,7 +236,6 @@ void of_device_unregister(struct of_device *ofdev)
|
||||||
struct of_device* of_platform_device_create(struct device_node *np, const char *bus_id)
|
struct of_device* of_platform_device_create(struct device_node *np, const char *bus_id)
|
||||||
{
|
{
|
||||||
struct of_device *dev;
|
struct of_device *dev;
|
||||||
u32 *reg;
|
|
||||||
|
|
||||||
dev = kmalloc(sizeof(*dev), GFP_KERNEL);
|
dev = kmalloc(sizeof(*dev), GFP_KERNEL);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
|
@ -250,7 +249,6 @@ struct of_device* of_platform_device_create(struct device_node *np, const char *
|
||||||
dev->dev.bus = &of_platform_bus_type;
|
dev->dev.bus = &of_platform_bus_type;
|
||||||
dev->dev.release = of_release_dev;
|
dev->dev.release = of_release_dev;
|
||||||
|
|
||||||
reg = (u32 *)get_property(np, "reg", NULL);
|
|
||||||
strlcpy(dev->dev.bus_id, bus_id, BUS_ID_SIZE);
|
strlcpy(dev->dev.bus_id, bus_id, BUS_ID_SIZE);
|
||||||
|
|
||||||
if (of_device_register(dev) != 0) {
|
if (of_device_register(dev) != 0) {
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/kobject.h>
|
#include <linux/kobject.h>
|
||||||
#include <asm/iommu.h>
|
#include <asm/iommu.h>
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
|
#include <asm/prom.h>
|
||||||
#include <asm/vio.h>
|
#include <asm/vio.h>
|
||||||
#include <asm/hvcall.h>
|
#include <asm/hvcall.h>
|
||||||
|
|
||||||
|
@ -75,6 +76,12 @@ static void vio_unregister_device_pseries(struct vio_dev *viodev)
|
||||||
device_remove_file(&viodev->dev, &dev_attr_devspec);
|
device_remove_file(&viodev->dev, &dev_attr_devspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct vio_bus_ops vio_bus_ops_pseries = {
|
||||||
|
.match = vio_match_device_pseries,
|
||||||
|
.unregister_device = vio_unregister_device_pseries,
|
||||||
|
.release_device = vio_release_device_pseries,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vio_bus_init_pseries: - Initialize the pSeries virtual IO bus
|
* vio_bus_init_pseries: - Initialize the pSeries virtual IO bus
|
||||||
*/
|
*/
|
||||||
|
@ -82,9 +89,7 @@ static int __init vio_bus_init_pseries(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = vio_bus_init(vio_match_device_pseries,
|
err = vio_bus_init(&vio_bus_ops_pseries);
|
||||||
vio_unregister_device_pseries,
|
|
||||||
vio_release_device_pseries);
|
|
||||||
if (err == 0)
|
if (err == 0)
|
||||||
probe_bus_pseries();
|
probe_bus_pseries();
|
||||||
return err;
|
return err;
|
||||||
|
@ -181,11 +186,13 @@ struct vio_dev * __devinit vio_register_device_node(struct device_node *of_node)
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(viodev->dev.bus_id, BUS_ID_SIZE, "%x", *unit_address);
|
snprintf(viodev->dev.bus_id, BUS_ID_SIZE, "%x", *unit_address);
|
||||||
|
viodev->name = of_node->name;
|
||||||
|
viodev->type = of_node->type;
|
||||||
|
viodev->unit_address = *unit_address;
|
||||||
|
viodev->iommu_table = vio_build_iommu_table(viodev);
|
||||||
|
|
||||||
/* register with generic device framework */
|
/* register with generic device framework */
|
||||||
if (vio_register_device_common(viodev, of_node->name, of_node->type,
|
if (vio_register_device(viodev) == NULL) {
|
||||||
*unit_address, vio_build_iommu_table(viodev))
|
|
||||||
== NULL) {
|
|
||||||
/* XXX free TCE table */
|
/* XXX free TCE table */
|
||||||
kfree(viodev);
|
kfree(viodev);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -892,7 +892,10 @@ static void __init prom_init_mem(void)
|
||||||
if ( RELOC(of_platform) == PLATFORM_PSERIES_LPAR )
|
if ( RELOC(of_platform) == PLATFORM_PSERIES_LPAR )
|
||||||
RELOC(alloc_top) = RELOC(rmo_top);
|
RELOC(alloc_top) = RELOC(rmo_top);
|
||||||
else
|
else
|
||||||
RELOC(alloc_top) = RELOC(rmo_top) = min(0x40000000ul, RELOC(ram_top));
|
/* Some RS64 machines have buggy firmware where claims up at 1GB
|
||||||
|
* fails. Cap at 768MB as a workaround. Still plenty of room.
|
||||||
|
*/
|
||||||
|
RELOC(alloc_top) = RELOC(rmo_top) = min(0x30000000ul, RELOC(ram_top));
|
||||||
|
|
||||||
prom_printf("memory layout at init:\n");
|
prom_printf("memory layout at init:\n");
|
||||||
prom_printf(" memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit));
|
prom_printf(" memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit));
|
||||||
|
|
|
@ -32,14 +32,13 @@ struct vio_dev vio_bus_device = { /* fake "parent" device */
|
||||||
.dev.bus = &vio_bus_type,
|
.dev.bus = &vio_bus_type,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int (*is_match)(const struct vio_device_id *id,
|
static struct vio_bus_ops vio_bus_ops;
|
||||||
const struct vio_dev *dev);
|
|
||||||
static void (*unregister_device_callback)(struct vio_dev *dev);
|
|
||||||
static void (*release_device_callback)(struct device *dev);
|
|
||||||
|
|
||||||
/* convert from struct device to struct vio_dev and pass to driver.
|
/*
|
||||||
|
* Convert from struct device to struct vio_dev and pass to driver.
|
||||||
* dev->driver has already been set by generic code because vio_bus_match
|
* dev->driver has already been set by generic code because vio_bus_match
|
||||||
* succeeded. */
|
* succeeded.
|
||||||
|
*/
|
||||||
static int vio_bus_probe(struct device *dev)
|
static int vio_bus_probe(struct device *dev)
|
||||||
{
|
{
|
||||||
struct vio_dev *viodev = to_vio_dev(dev);
|
struct vio_dev *viodev = to_vio_dev(dev);
|
||||||
|
@ -51,9 +50,8 @@ static int vio_bus_probe(struct device *dev)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
id = vio_match_device(viodrv->id_table, viodev);
|
id = vio_match_device(viodrv->id_table, viodev);
|
||||||
if (id) {
|
if (id)
|
||||||
error = viodrv->probe(viodev, id);
|
error = viodrv->probe(viodev, id);
|
||||||
}
|
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -64,9 +62,8 @@ static int vio_bus_remove(struct device *dev)
|
||||||
struct vio_dev *viodev = to_vio_dev(dev);
|
struct vio_dev *viodev = to_vio_dev(dev);
|
||||||
struct vio_driver *viodrv = to_vio_driver(dev->driver);
|
struct vio_driver *viodrv = to_vio_driver(dev->driver);
|
||||||
|
|
||||||
if (viodrv->remove) {
|
if (viodrv->remove)
|
||||||
return viodrv->remove(viodev);
|
return viodrv->remove(viodev);
|
||||||
}
|
|
||||||
|
|
||||||
/* driver can't remove */
|
/* driver can't remove */
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -102,7 +99,8 @@ void vio_unregister_driver(struct vio_driver *viodrv)
|
||||||
EXPORT_SYMBOL(vio_unregister_driver);
|
EXPORT_SYMBOL(vio_unregister_driver);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vio_match_device: - Tell if a VIO device has a matching VIO device id structure.
|
* vio_match_device: - Tell if a VIO device has a matching
|
||||||
|
* VIO device id structure.
|
||||||
* @ids: array of VIO device id structures to search in
|
* @ids: array of VIO device id structures to search in
|
||||||
* @dev: the VIO device structure to match against
|
* @dev: the VIO device structure to match against
|
||||||
*
|
*
|
||||||
|
@ -110,11 +108,11 @@ EXPORT_SYMBOL(vio_unregister_driver);
|
||||||
* system is in its list of supported devices. Returns the matching
|
* system is in its list of supported devices. Returns the matching
|
||||||
* vio_device_id structure or NULL if there is no match.
|
* vio_device_id structure or NULL if there is no match.
|
||||||
*/
|
*/
|
||||||
static const struct vio_device_id * vio_match_device(const struct vio_device_id *ids,
|
static const struct vio_device_id *vio_match_device(
|
||||||
const struct vio_dev *dev)
|
const struct vio_device_id *ids, const struct vio_dev *dev)
|
||||||
{
|
{
|
||||||
while (ids->type) {
|
while (ids->type[0] != '\0') {
|
||||||
if (is_match(ids, dev))
|
if (vio_bus_ops.match(ids, dev))
|
||||||
return ids;
|
return ids;
|
||||||
ids++;
|
ids++;
|
||||||
}
|
}
|
||||||
|
@ -124,16 +122,11 @@ static const struct vio_device_id * vio_match_device(const struct vio_device_id
|
||||||
/**
|
/**
|
||||||
* vio_bus_init: - Initialize the virtual IO bus
|
* vio_bus_init: - Initialize the virtual IO bus
|
||||||
*/
|
*/
|
||||||
int __init vio_bus_init(int (*match_func)(const struct vio_device_id *id,
|
int __init vio_bus_init(struct vio_bus_ops *ops)
|
||||||
const struct vio_dev *dev),
|
|
||||||
void (*unregister_dev)(struct vio_dev *),
|
|
||||||
void (*release_dev)(struct device *))
|
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
is_match = match_func;
|
vio_bus_ops = *ops;
|
||||||
unregister_device_callback = unregister_dev;
|
|
||||||
release_device_callback = release_dev;
|
|
||||||
|
|
||||||
err = bus_register(&vio_bus_type);
|
err = bus_register(&vio_bus_type);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -141,7 +134,8 @@ int __init vio_bus_init(int (*match_func)(const struct vio_device_id *id,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the fake parent of all vio devices, just to give us
|
/*
|
||||||
|
* The fake parent of all vio devices, just to give us
|
||||||
* a nice directory
|
* a nice directory
|
||||||
*/
|
*/
|
||||||
err = device_register(&vio_bus_device.dev);
|
err = device_register(&vio_bus_device.dev);
|
||||||
|
@ -157,25 +151,20 @@ int __init vio_bus_init(int (*match_func)(const struct vio_device_id *id,
|
||||||
/* vio_dev refcount hit 0 */
|
/* vio_dev refcount hit 0 */
|
||||||
static void __devinit vio_dev_release(struct device *dev)
|
static void __devinit vio_dev_release(struct device *dev)
|
||||||
{
|
{
|
||||||
if (release_device_callback)
|
if (vio_bus_ops.release_device)
|
||||||
release_device_callback(dev);
|
vio_bus_ops.release_device(dev);
|
||||||
kfree(to_vio_dev(dev));
|
kfree(to_vio_dev(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t viodev_show_name(struct device *dev, struct device_attribute *attr, char *buf)
|
static ssize_t viodev_show_name(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return sprintf(buf, "%s\n", to_vio_dev(dev)->name);
|
return sprintf(buf, "%s\n", to_vio_dev(dev)->name);
|
||||||
}
|
}
|
||||||
DEVICE_ATTR(name, S_IRUSR | S_IRGRP | S_IROTH, viodev_show_name, NULL);
|
DEVICE_ATTR(name, S_IRUSR | S_IRGRP | S_IROTH, viodev_show_name, NULL);
|
||||||
|
|
||||||
struct vio_dev * __devinit vio_register_device_common(
|
struct vio_dev * __devinit vio_register_device(struct vio_dev *viodev)
|
||||||
struct vio_dev *viodev, char *name, char *type,
|
|
||||||
uint32_t unit_address, struct iommu_table *iommu_table)
|
|
||||||
{
|
{
|
||||||
viodev->name = name;
|
|
||||||
viodev->type = type;
|
|
||||||
viodev->unit_address = unit_address;
|
|
||||||
viodev->iommu_table = iommu_table;
|
|
||||||
/* init generic 'struct device' fields: */
|
/* init generic 'struct device' fields: */
|
||||||
viodev->dev.parent = &vio_bus_device.dev;
|
viodev->dev.parent = &vio_bus_device.dev;
|
||||||
viodev->dev.bus = &vio_bus_type;
|
viodev->dev.bus = &vio_bus_type;
|
||||||
|
@ -194,8 +183,8 @@ struct vio_dev * __devinit vio_register_device_common(
|
||||||
|
|
||||||
void __devinit vio_unregister_device(struct vio_dev *viodev)
|
void __devinit vio_unregister_device(struct vio_dev *viodev)
|
||||||
{
|
{
|
||||||
if (unregister_device_callback)
|
if (vio_bus_ops.unregister_device)
|
||||||
unregister_device_callback(viodev);
|
vio_bus_ops.unregister_device(viodev);
|
||||||
device_remove_file(&viodev->dev, &dev_attr_name);
|
device_remove_file(&viodev->dev, &dev_attr_name);
|
||||||
device_unregister(&viodev->dev);
|
device_unregister(&viodev->dev);
|
||||||
}
|
}
|
||||||
|
@ -262,16 +251,8 @@ static int vio_bus_match(struct device *dev, struct device_driver *drv)
|
||||||
const struct vio_dev *vio_dev = to_vio_dev(dev);
|
const struct vio_dev *vio_dev = to_vio_dev(dev);
|
||||||
struct vio_driver *vio_drv = to_vio_driver(drv);
|
struct vio_driver *vio_drv = to_vio_driver(drv);
|
||||||
const struct vio_device_id *ids = vio_drv->id_table;
|
const struct vio_device_id *ids = vio_drv->id_table;
|
||||||
const struct vio_device_id *found_id;
|
|
||||||
|
|
||||||
if (!ids)
|
return (ids != NULL) && (vio_match_device(ids, vio_dev) != NULL);
|
||||||
return 0;
|
|
||||||
|
|
||||||
found_id = vio_match_device(ids, vio_dev);
|
|
||||||
if (found_id)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct bus_type vio_bus_type = {
|
struct bus_type vio_bus_type = {
|
||||||
|
|
|
@ -128,13 +128,11 @@ _GLOBAL(__hash_page)
|
||||||
/* We eventually do the icache sync here (maybe inline that
|
/* We eventually do the icache sync here (maybe inline that
|
||||||
* code rather than call a C function...)
|
* code rather than call a C function...)
|
||||||
*/
|
*/
|
||||||
BEGIN_FTR_SECTION
|
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
mr r4,r30
|
mr r4,r30
|
||||||
mr r5,r7
|
mr r5,r7
|
||||||
bl .hash_page_do_lazy_icache
|
bl .hash_page_do_lazy_icache
|
||||||
END_FTR_SECTION_IFSET(CPU_FTR_NOEXECUTE)
|
END_FTR_SECTION(CPU_FTR_NOEXECUTE|CPU_FTR_COHERENT_ICACHE, CPU_FTR_NOEXECUTE)
|
||||||
END_FTR_SECTION_IFCLR(CPU_FTR_COHERENT_ICACHE)
|
|
||||||
|
|
||||||
/* At this point, r3 contains new PP bits, save them in
|
/* At this point, r3 contains new PP bits, save them in
|
||||||
* place of "access" in the param area (sic)
|
* place of "access" in the param area (sic)
|
||||||
|
|
|
@ -153,6 +153,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||||
|
|
||||||
case PV_970:
|
case PV_970:
|
||||||
case PV_970FX:
|
case PV_970FX:
|
||||||
|
case PV_970MP:
|
||||||
model = &op_model_power4;
|
model = &op_model_power4;
|
||||||
model->num_counters = 8;
|
model->num_counters = 8;
|
||||||
ops->cpu_type = "ppc64/970";
|
ops->cpu_type = "ppc64/970";
|
||||||
|
|
|
@ -776,7 +776,7 @@ static int viodasd_remove(struct vio_dev *vdev)
|
||||||
*/
|
*/
|
||||||
static struct vio_device_id viodasd_device_table[] __devinitdata = {
|
static struct vio_device_id viodasd_device_table[] __devinitdata = {
|
||||||
{ "viodasd", "" },
|
{ "viodasd", "" },
|
||||||
{ 0, }
|
{ "", "" }
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(vio, viodasd_device_table);
|
MODULE_DEVICE_TABLE(vio, viodasd_device_table);
|
||||||
|
|
|
@ -734,7 +734,7 @@ static int viocd_remove(struct vio_dev *vdev)
|
||||||
*/
|
*/
|
||||||
static struct vio_device_id viocd_device_table[] __devinitdata = {
|
static struct vio_device_id viocd_device_table[] __devinitdata = {
|
||||||
{ "viocd", "" },
|
{ "viocd", "" },
|
||||||
{ 0, }
|
{ "", "" }
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(vio, viocd_device_table);
|
MODULE_DEVICE_TABLE(vio, viocd_device_table);
|
||||||
|
|
|
@ -39,7 +39,7 @@ char hvc_driver_name[] = "hvc_console";
|
||||||
|
|
||||||
static struct vio_device_id hvc_driver_table[] __devinitdata = {
|
static struct vio_device_id hvc_driver_table[] __devinitdata = {
|
||||||
{"serial", "hvterm1"},
|
{"serial", "hvterm1"},
|
||||||
{ NULL, }
|
{ "", "" }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(vio, hvc_driver_table);
|
MODULE_DEVICE_TABLE(vio, hvc_driver_table);
|
||||||
|
|
||||||
|
|
|
@ -527,7 +527,7 @@ static int khvcsd(void *unused)
|
||||||
|
|
||||||
static struct vio_device_id hvcs_driver_table[] __devinitdata= {
|
static struct vio_device_id hvcs_driver_table[] __devinitdata= {
|
||||||
{"serial-server", "hvterm2"},
|
{"serial-server", "hvterm2"},
|
||||||
{ NULL, }
|
{ "", "" }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(vio, hvcs_driver_table);
|
MODULE_DEVICE_TABLE(vio, hvcs_driver_table);
|
||||||
|
|
||||||
|
|
|
@ -991,7 +991,7 @@ static int viotape_remove(struct vio_dev *vdev)
|
||||||
*/
|
*/
|
||||||
static struct vio_device_id viotape_device_table[] __devinitdata = {
|
static struct vio_device_id viotape_device_table[] __devinitdata = {
|
||||||
{ "viotape", "" },
|
{ "viotape", "" },
|
||||||
{ 0, }
|
{ "", "" }
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(vio, viotape_device_table);
|
MODULE_DEVICE_TABLE(vio, viotape_device_table);
|
||||||
|
|
|
@ -1144,7 +1144,7 @@ static void ibmveth_proc_unregister_driver(void)
|
||||||
|
|
||||||
static struct vio_device_id ibmveth_device_table[] __devinitdata= {
|
static struct vio_device_id ibmveth_device_table[] __devinitdata= {
|
||||||
{ "network", "IBM,l-lan"},
|
{ "network", "IBM,l-lan"},
|
||||||
{ 0,}
|
{ "", "" }
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(vio, ibmveth_device_table);
|
MODULE_DEVICE_TABLE(vio, ibmveth_device_table);
|
||||||
|
|
|
@ -1370,7 +1370,7 @@ static int veth_probe(struct vio_dev *vdev, const struct vio_device_id *id)
|
||||||
*/
|
*/
|
||||||
static struct vio_device_id veth_device_table[] __devinitdata = {
|
static struct vio_device_id veth_device_table[] __devinitdata = {
|
||||||
{ "vlan", "" },
|
{ "vlan", "" },
|
||||||
{ NULL, NULL }
|
{ "", "" }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(vio, veth_device_table);
|
MODULE_DEVICE_TABLE(vio, veth_device_table);
|
||||||
|
|
||||||
|
|
|
@ -1442,7 +1442,7 @@ static int ibmvscsi_remove(struct vio_dev *vdev)
|
||||||
*/
|
*/
|
||||||
static struct vio_device_id ibmvscsi_device_table[] __devinitdata = {
|
static struct vio_device_id ibmvscsi_device_table[] __devinitdata = {
|
||||||
{"vscsi", "IBM,v-scsi"},
|
{"vscsi", "IBM,v-scsi"},
|
||||||
{0,}
|
{ "", "" }
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(vio, ibmvscsi_device_table);
|
MODULE_DEVICE_TABLE(vio, ibmvscsi_device_table);
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <asm/vio.h>
|
#include <asm/vio.h>
|
||||||
|
#include <asm/prom.h>
|
||||||
#include <asm/iommu.h>
|
#include <asm/iommu.h>
|
||||||
#include <asm/hvcall.h>
|
#include <asm/hvcall.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
|
|
1
include/asm-powerpc/cputime.h
Normal file
1
include/asm-powerpc/cputime.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#include <asm-generic/cputime.h>
|
1
include/asm-powerpc/emergency-restart.h
Normal file
1
include/asm-powerpc/emergency-restart.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#include <asm-generic/emergency-restart.h>
|
1
include/asm-powerpc/percpu.h
Normal file
1
include/asm-powerpc/percpu.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#include <asm-generic/percpu.h>
|
1
include/asm-powerpc/resource.h
Normal file
1
include/asm-powerpc/resource.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#include <asm-generic/resource.h>
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef __PPC_CPUTIME_H
|
|
||||||
#define __PPC_CPUTIME_H
|
|
||||||
|
|
||||||
#include <asm-generic/cputime.h>
|
|
||||||
|
|
||||||
#endif /* __PPC_CPUTIME_H */
|
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef _ASM_EMERGENCY_RESTART_H
|
|
||||||
#define _ASM_EMERGENCY_RESTART_H
|
|
||||||
|
|
||||||
#include <asm-generic/emergency-restart.h>
|
|
||||||
|
|
||||||
#endif /* _ASM_EMERGENCY_RESTART_H */
|
|
|
@ -1 +0,0 @@
|
||||||
#include <asm-generic/hdreg.h>
|
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef __PPC_LOCAL_H
|
|
||||||
#define __PPC_LOCAL_H
|
|
||||||
|
|
||||||
#include <asm-generic/local.h>
|
|
||||||
|
|
||||||
#endif /* __PPC_LOCAL_H */
|
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef __ARCH_PPC_PERCPU__
|
|
||||||
#define __ARCH_PPC_PERCPU__
|
|
||||||
|
|
||||||
#include <asm-generic/percpu.h>
|
|
||||||
|
|
||||||
#endif /* __ARCH_PPC_PERCPU__ */
|
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef _PPC_RESOURCE_H
|
|
||||||
#define _PPC_RESOURCE_H
|
|
||||||
|
|
||||||
#include <asm-generic/resource.h>
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,10 +0,0 @@
|
||||||
/*
|
|
||||||
* 8253/8254 Programmable Interval Timer
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _8253PIT_H
|
|
||||||
#define _8253PIT_H
|
|
||||||
|
|
||||||
#define PIT_TICK_RATE 1193182UL
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,23 +0,0 @@
|
||||||
#ifndef AGP_H
|
|
||||||
#define AGP_H 1
|
|
||||||
|
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
/* nothing much needed here */
|
|
||||||
|
|
||||||
#define map_page_into_agp(page)
|
|
||||||
#define unmap_page_from_agp(page)
|
|
||||||
#define flush_agp_mappings()
|
|
||||||
#define flush_agp_cache() mb()
|
|
||||||
|
|
||||||
/* Convert a physical address to an address suitable for the GART. */
|
|
||||||
#define phys_to_gart(x) (x)
|
|
||||||
#define gart_to_phys(x) (x)
|
|
||||||
|
|
||||||
/* GATT allocation. Returns/accepts GATT kernel virtual address. */
|
|
||||||
#define alloc_gatt_pages(order) \
|
|
||||||
((char *)__get_free_pages(GFP_KERNEL, (order)))
|
|
||||||
#define free_gatt_pages(table, order) \
|
|
||||||
free_pages((unsigned long)(table), (order))
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef __PPC_CPUTIME_H
|
|
||||||
#define __PPC_CPUTIME_H
|
|
||||||
|
|
||||||
#include <asm-generic/cputime.h>
|
|
||||||
|
|
||||||
#endif /* __PPC_CPUTIME_H */
|
|
|
@ -1 +0,0 @@
|
||||||
#include <asm-generic/div64.h>
|
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef _ASM_EMERGENCY_RESTART_H
|
|
||||||
#define _ASM_EMERGENCY_RESTART_H
|
|
||||||
|
|
||||||
#include <asm-generic/emergency-restart.h>
|
|
||||||
|
|
||||||
#endif /* _ASM_EMERGENCY_RESTART_H */
|
|
|
@ -1,18 +0,0 @@
|
||||||
#ifndef _PPC64_ERRNO_H
|
|
||||||
#define _PPC64_ERRNO_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 <asm-generic/errno.h>
|
|
||||||
|
|
||||||
#undef EDEADLOCK
|
|
||||||
#define EDEADLOCK 58 /* File locking deadlock error */
|
|
||||||
|
|
||||||
#define _LAST_ERRNO 516
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1 +0,0 @@
|
||||||
#include <asm-generic/hdreg.h>
|
|
|
@ -1,74 +0,0 @@
|
||||||
#ifndef _PPC64_IOCTL_H
|
|
||||||
#define _PPC64_IOCTL_H
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This was copied from the alpha as it's a bit cleaner there.
|
|
||||||
* -- Cort
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _IOC_NRBITS 8
|
|
||||||
#define _IOC_TYPEBITS 8
|
|
||||||
#define _IOC_SIZEBITS 13
|
|
||||||
#define _IOC_DIRBITS 3
|
|
||||||
|
|
||||||
#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
|
|
||||||
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
|
|
||||||
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
|
|
||||||
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
|
|
||||||
|
|
||||||
#define _IOC_NRSHIFT 0
|
|
||||||
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
|
|
||||||
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
|
|
||||||
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit.
|
|
||||||
* And this turns out useful to catch old ioctl numbers in header
|
|
||||||
* files for us.
|
|
||||||
*/
|
|
||||||
#define _IOC_NONE 1U
|
|
||||||
#define _IOC_READ 2U
|
|
||||||
#define _IOC_WRITE 4U
|
|
||||||
|
|
||||||
#define _IOC(dir,type,nr,size) \
|
|
||||||
(((dir) << _IOC_DIRSHIFT) | \
|
|
||||||
((type) << _IOC_TYPESHIFT) | \
|
|
||||||
((nr) << _IOC_NRSHIFT) | \
|
|
||||||
((size) << _IOC_SIZESHIFT))
|
|
||||||
|
|
||||||
/* provoke compile error for invalid uses of size argument */
|
|
||||||
extern unsigned int __invalid_size_argument_for_IOC;
|
|
||||||
#define _IOC_TYPECHECK(t) \
|
|
||||||
((sizeof(t) == sizeof(t[1]) && \
|
|
||||||
sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
|
|
||||||
sizeof(t) : __invalid_size_argument_for_IOC)
|
|
||||||
|
|
||||||
/* used to create numbers */
|
|
||||||
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
|
|
||||||
#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
|
|
||||||
#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
|
|
||||||
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
|
|
||||||
#define _IOR_BAD(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
|
|
||||||
#define _IOW_BAD(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
|
|
||||||
#define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
|
|
||||||
|
|
||||||
/* used to decode them.. */
|
|
||||||
#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
|
|
||||||
#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
|
|
||||||
#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
|
|
||||||
#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
|
|
||||||
|
|
||||||
/* various drivers, such as the pcmcia stuff, need these... */
|
|
||||||
#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
|
|
||||||
#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
|
|
||||||
#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
|
|
||||||
#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
|
|
||||||
#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
|
|
||||||
|
|
||||||
#endif /* _PPC64_IOCTL_H */
|
|
|
@ -1,114 +0,0 @@
|
||||||
#ifndef _ASM_PPC64_IOCTLS_H
|
|
||||||
#define _ASM_PPC64_IOCTLS_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 <asm/ioctl.h>
|
|
||||||
|
|
||||||
#define FIOCLEX _IO('f', 1)
|
|
||||||
#define FIONCLEX _IO('f', 2)
|
|
||||||
#define FIOASYNC _IOW('f', 125, int)
|
|
||||||
#define FIONBIO _IOW('f', 126, int)
|
|
||||||
#define FIONREAD _IOR('f', 127, int)
|
|
||||||
#define TIOCINQ FIONREAD
|
|
||||||
#define FIOQSIZE _IOR('f', 128, loff_t)
|
|
||||||
|
|
||||||
#define TIOCGETP _IOR('t', 8, struct sgttyb)
|
|
||||||
#define TIOCSETP _IOW('t', 9, struct sgttyb)
|
|
||||||
#define TIOCSETN _IOW('t', 10, struct sgttyb) /* TIOCSETP wo flush */
|
|
||||||
|
|
||||||
#define TIOCSETC _IOW('t', 17, struct tchars)
|
|
||||||
#define TIOCGETC _IOR('t', 18, struct tchars)
|
|
||||||
#define TCGETS _IOR('t', 19, struct termios)
|
|
||||||
#define TCSETS _IOW('t', 20, struct termios)
|
|
||||||
#define TCSETSW _IOW('t', 21, struct termios)
|
|
||||||
#define TCSETSF _IOW('t', 22, struct termios)
|
|
||||||
|
|
||||||
#define TCGETA _IOR('t', 23, struct termio)
|
|
||||||
#define TCSETA _IOW('t', 24, struct termio)
|
|
||||||
#define TCSETAW _IOW('t', 25, struct termio)
|
|
||||||
#define TCSETAF _IOW('t', 28, struct termio)
|
|
||||||
|
|
||||||
#define TCSBRK _IO('t', 29)
|
|
||||||
#define TCXONC _IO('t', 30)
|
|
||||||
#define TCFLSH _IO('t', 31)
|
|
||||||
|
|
||||||
#define TIOCSWINSZ _IOW('t', 103, struct winsize)
|
|
||||||
#define TIOCGWINSZ _IOR('t', 104, struct winsize)
|
|
||||||
#define TIOCSTART _IO('t', 110) /* start output, like ^Q */
|
|
||||||
#define TIOCSTOP _IO('t', 111) /* stop output, like ^S */
|
|
||||||
#define TIOCOUTQ _IOR('t', 115, int) /* output queue size */
|
|
||||||
|
|
||||||
#define TIOCGLTC _IOR('t', 116, struct ltchars)
|
|
||||||
#define TIOCSLTC _IOW('t', 117, struct ltchars)
|
|
||||||
#define TIOCSPGRP _IOW('t', 118, int)
|
|
||||||
#define TIOCGPGRP _IOR('t', 119, int)
|
|
||||||
|
|
||||||
#define TIOCEXCL 0x540C
|
|
||||||
#define TIOCNXCL 0x540D
|
|
||||||
#define TIOCSCTTY 0x540E
|
|
||||||
|
|
||||||
#define TIOCSTI 0x5412
|
|
||||||
#define TIOCMGET 0x5415
|
|
||||||
#define TIOCMBIS 0x5416
|
|
||||||
#define TIOCMBIC 0x5417
|
|
||||||
#define TIOCMSET 0x5418
|
|
||||||
# define TIOCM_LE 0x001
|
|
||||||
# define TIOCM_DTR 0x002
|
|
||||||
# define TIOCM_RTS 0x004
|
|
||||||
# define TIOCM_ST 0x008
|
|
||||||
# define TIOCM_SR 0x010
|
|
||||||
# define TIOCM_CTS 0x020
|
|
||||||
# define TIOCM_CAR 0x040
|
|
||||||
# define TIOCM_RNG 0x080
|
|
||||||
# define TIOCM_DSR 0x100
|
|
||||||
# define TIOCM_CD TIOCM_CAR
|
|
||||||
# define TIOCM_RI TIOCM_RNG
|
|
||||||
|
|
||||||
#define TIOCGSOFTCAR 0x5419
|
|
||||||
#define TIOCSSOFTCAR 0x541A
|
|
||||||
#define TIOCLINUX 0x541C
|
|
||||||
#define TIOCCONS 0x541D
|
|
||||||
#define TIOCGSERIAL 0x541E
|
|
||||||
#define TIOCSSERIAL 0x541F
|
|
||||||
#define TIOCPKT 0x5420
|
|
||||||
# define TIOCPKT_DATA 0
|
|
||||||
# define TIOCPKT_FLUSHREAD 1
|
|
||||||
# define TIOCPKT_FLUSHWRITE 2
|
|
||||||
# define TIOCPKT_STOP 4
|
|
||||||
# define TIOCPKT_START 8
|
|
||||||
# define TIOCPKT_NOSTOP 16
|
|
||||||
# define TIOCPKT_DOSTOP 32
|
|
||||||
|
|
||||||
|
|
||||||
#define TIOCNOTTY 0x5422
|
|
||||||
#define TIOCSETD 0x5423
|
|
||||||
#define TIOCGETD 0x5424
|
|
||||||
#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */
|
|
||||||
#define TIOCSBRK 0x5427 /* BSD compatibility */
|
|
||||||
#define TIOCCBRK 0x5428 /* BSD compatibility */
|
|
||||||
#define TIOCGSID 0x5429 /* Return the session ID of FD */
|
|
||||||
#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
|
|
||||||
#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
|
|
||||||
|
|
||||||
#define TIOCSERCONFIG 0x5453
|
|
||||||
#define TIOCSERGWILD 0x5454
|
|
||||||
#define TIOCSERSWILD 0x5455
|
|
||||||
#define TIOCGLCKTRMIOS 0x5456
|
|
||||||
#define TIOCSLCKTRMIOS 0x5457
|
|
||||||
#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
|
|
||||||
#define TIOCSERGETLSR 0x5459 /* Get line status register */
|
|
||||||
/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
|
|
||||||
# define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
|
|
||||||
#define TIOCSERGETMULTI 0x545A /* Get multiport config */
|
|
||||||
#define TIOCSERSETMULTI 0x545B /* Set multiport config */
|
|
||||||
|
|
||||||
#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */
|
|
||||||
#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
|
|
||||||
|
|
||||||
#endif /* _ASM_PPC64_IOCTLS_H */
|
|
|
@ -1 +0,0 @@
|
||||||
#include <asm-generic/ipc.h>
|
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef __ASM_LINKAGE_H
|
|
||||||
#define __ASM_LINKAGE_H
|
|
||||||
|
|
||||||
/* Nothing to see here... */
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,23 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/include/asm-ppc/namei.h
|
|
||||||
* Adapted from linux/include/asm-alpha/namei.h
|
|
||||||
*
|
|
||||||
* Included from linux/fs/namei.c
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __PPC64_NAMEI_H
|
|
||||||
#define __PPC64_NAMEI_H
|
|
||||||
|
|
||||||
/* This dummy routine maybe changed to something useful
|
|
||||||
* for /usr/gnemul/ emulation stuff.
|
|
||||||
* Look at asm-sparc/namei.h for details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define __emul_prefix() NULL
|
|
||||||
|
|
||||||
#endif /* __PPC64_NAMEI_H */
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef _ASM_PPC64_PARAM_H
|
#ifndef _ASM_PPC64_PARAM_H
|
||||||
#define _ASM_PPC64_PARAM_H
|
#define _ASM_PPC64_PARAM_H
|
||||||
|
|
||||||
|
#include <linux/config.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -9,7 +11,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
# define HZ 1000 /* Internal kernel timer frequency */
|
# define HZ CONFIG_HZ /* Internal kernel timer frequency */
|
||||||
# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
|
# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
|
||||||
# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
|
# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef __ARCH_PPC64_PERCPU__
|
|
||||||
#define __ARCH_PPC64_PERCPU__
|
|
||||||
|
|
||||||
#include <asm-generic/percpu.h>
|
|
||||||
|
|
||||||
#endif /* __ARCH_PPC64_PERCPU__ */
|
|
|
@ -489,8 +489,10 @@ extern pgd_t swapper_pg_dir[];
|
||||||
|
|
||||||
extern void paging_init(void);
|
extern void paging_init(void);
|
||||||
|
|
||||||
|
#ifdef CONFIG_HUGETLB_PAGE
|
||||||
#define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) \
|
#define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) \
|
||||||
free_pgd_range(tlb, addr, end, floor, ceiling)
|
free_pgd_range(tlb, addr, end, floor, ceiling)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This gets called at the end of handling a page fault, when
|
* This gets called at the end of handling a page fault, when
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
#ifndef __PPC64_POLL_H
|
|
||||||
#define __PPC64_POLL_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2001 PPC64 Team, 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define POLLIN 0x0001
|
|
||||||
#define POLLPRI 0x0002
|
|
||||||
#define POLLOUT 0x0004
|
|
||||||
#define POLLERR 0x0008
|
|
||||||
#define POLLHUP 0x0010
|
|
||||||
#define POLLNVAL 0x0020
|
|
||||||
#define POLLRDNORM 0x0040
|
|
||||||
#define POLLRDBAND 0x0080
|
|
||||||
#define POLLWRNORM 0x0100
|
|
||||||
#define POLLWRBAND 0x0200
|
|
||||||
#define POLLMSG 0x0400
|
|
||||||
#define POLLREMOVE 0x1000
|
|
||||||
|
|
||||||
struct pollfd {
|
|
||||||
int fd;
|
|
||||||
short events;
|
|
||||||
short revents;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __PPC64_POLL_H */
|
|
|
@ -268,6 +268,7 @@
|
||||||
#define PV_970FX 0x003C
|
#define PV_970FX 0x003C
|
||||||
#define PV_630 0x0040
|
#define PV_630 0x0040
|
||||||
#define PV_630p 0x0041
|
#define PV_630p 0x0041
|
||||||
|
#define PV_970MP 0x0044
|
||||||
#define PV_BE 0x0070
|
#define PV_BE 0x0070
|
||||||
|
|
||||||
/* Platforms supported by PPC64 */
|
/* Platforms supported by PPC64 */
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef _PPC64_RESOURCE_H
|
|
||||||
#define _PPC64_RESOURCE_H
|
|
||||||
|
|
||||||
#include <asm-generic/resource.h>
|
|
||||||
|
|
||||||
#endif /* _PPC64_RESOURCE_H */
|
|
|
@ -1,13 +0,0 @@
|
||||||
#ifndef _PPC64_SHMPARAM_H
|
|
||||||
#define _PPC64_SHMPARAM_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */
|
|
||||||
|
|
||||||
#endif /* _PPC64_SHMPARAM_H */
|
|
|
@ -1,35 +0,0 @@
|
||||||
#ifndef _PPC64_STRING_H_
|
|
||||||
#define _PPC64_STRING_H_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define __HAVE_ARCH_STRCPY
|
|
||||||
#define __HAVE_ARCH_STRNCPY
|
|
||||||
#define __HAVE_ARCH_STRLEN
|
|
||||||
#define __HAVE_ARCH_STRCMP
|
|
||||||
#define __HAVE_ARCH_STRCAT
|
|
||||||
#define __HAVE_ARCH_MEMSET
|
|
||||||
#define __HAVE_ARCH_MEMCPY
|
|
||||||
#define __HAVE_ARCH_MEMMOVE
|
|
||||||
#define __HAVE_ARCH_MEMCMP
|
|
||||||
#define __HAVE_ARCH_MEMCHR
|
|
||||||
|
|
||||||
extern int strcasecmp(const char *, const char *);
|
|
||||||
extern int strncasecmp(const char *, const char *, int);
|
|
||||||
extern char * strcpy(char *,const char *);
|
|
||||||
extern char * strncpy(char *,const char *, __kernel_size_t);
|
|
||||||
extern __kernel_size_t strlen(const char *);
|
|
||||||
extern int strcmp(const char *,const char *);
|
|
||||||
extern char * strcat(char *, const char *);
|
|
||||||
extern void * memset(void *,int,__kernel_size_t);
|
|
||||||
extern void * memcpy(void *,const void *,__kernel_size_t);
|
|
||||||
extern void * memmove(void *,const void *,__kernel_size_t);
|
|
||||||
extern int memcmp(const void *,const void *,__kernel_size_t);
|
|
||||||
extern void * memchr(const void *,int,__kernel_size_t);
|
|
||||||
|
|
||||||
#endif /* _PPC64_STRING_H_ */
|
|
|
@ -1,21 +0,0 @@
|
||||||
#ifndef __PPC64_UNALIGNED_H
|
|
||||||
#define __PPC64_UNALIGNED_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The PowerPC can do unaligned accesses itself in big endian mode.
|
|
||||||
*
|
|
||||||
* The strange macros are there to make sure these can't
|
|
||||||
* be misused in a way that makes them not work on other
|
|
||||||
* architectures where unaligned accesses aren't as simple.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define get_unaligned(ptr) (*(ptr))
|
|
||||||
|
|
||||||
#define put_unaligned(val, ptr) ((void)( *(ptr) = (val) ))
|
|
||||||
|
|
||||||
#endif /* __PPC64_UNALIGNED_H */
|
|
|
@ -19,13 +19,15 @@
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
|
#include <linux/mod_devicetable.h>
|
||||||
|
|
||||||
#include <asm/hvcall.h>
|
#include <asm/hvcall.h>
|
||||||
#include <asm/prom.h>
|
|
||||||
#include <asm/scatterlist.h>
|
#include <asm/scatterlist.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Architecture-specific constants for drivers to
|
* Architecture-specific constants for drivers to
|
||||||
* extract attributes of the device using vio_get_attribute()
|
* extract attributes of the device using vio_get_attribute()
|
||||||
*/
|
*/
|
||||||
#define VETH_MAC_ADDR "local-mac-address"
|
#define VETH_MAC_ADDR "local-mac-address"
|
||||||
#define VETH_MCAST_FILTER_SIZE "ibm,mac-address-filters"
|
#define VETH_MCAST_FILTER_SIZE "ibm,mac-address-filters"
|
||||||
|
|
||||||
|
@ -37,54 +39,8 @@
|
||||||
#define VIO_IRQ_DISABLE 0UL
|
#define VIO_IRQ_DISABLE 0UL
|
||||||
#define VIO_IRQ_ENABLE 1UL
|
#define VIO_IRQ_ENABLE 1UL
|
||||||
|
|
||||||
struct vio_dev;
|
|
||||||
struct vio_driver;
|
|
||||||
struct vio_device_id;
|
|
||||||
struct iommu_table;
|
struct iommu_table;
|
||||||
|
|
||||||
int vio_register_driver(struct vio_driver *drv);
|
|
||||||
void vio_unregister_driver(struct vio_driver *drv);
|
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_PSERIES
|
|
||||||
struct vio_dev * __devinit vio_register_device_node(
|
|
||||||
struct device_node *node_vdev);
|
|
||||||
#endif
|
|
||||||
void __devinit vio_unregister_device(struct vio_dev *dev);
|
|
||||||
struct vio_dev *vio_find_node(struct device_node *vnode);
|
|
||||||
|
|
||||||
const void * vio_get_attribute(struct vio_dev *vdev, void* which, int* length);
|
|
||||||
int vio_get_irq(struct vio_dev *dev);
|
|
||||||
int vio_enable_interrupts(struct vio_dev *dev);
|
|
||||||
int vio_disable_interrupts(struct vio_dev *dev);
|
|
||||||
extern struct vio_dev * __devinit vio_register_device_common(
|
|
||||||
struct vio_dev *viodev, char *name, char *type,
|
|
||||||
uint32_t unit_address, struct iommu_table *iommu_table);
|
|
||||||
|
|
||||||
extern struct dma_mapping_ops vio_dma_ops;
|
|
||||||
|
|
||||||
extern struct bus_type vio_bus_type;
|
|
||||||
|
|
||||||
struct vio_device_id {
|
|
||||||
char *type;
|
|
||||||
char *compat;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct vio_driver {
|
|
||||||
struct list_head node;
|
|
||||||
char *name;
|
|
||||||
const struct vio_device_id *id_table; /* NULL if wants all devices */
|
|
||||||
int (*probe) (struct vio_dev *dev, const struct vio_device_id *id); /* New device inserted */
|
|
||||||
int (*remove) (struct vio_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */
|
|
||||||
unsigned long driver_data;
|
|
||||||
|
|
||||||
struct device_driver driver;
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline struct vio_driver *to_vio_driver(struct device_driver *drv)
|
|
||||||
{
|
|
||||||
return container_of(drv, struct vio_driver, driver);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The vio_dev structure is used to describe virtual I/O devices.
|
* The vio_dev structure is used to describe virtual I/O devices.
|
||||||
*/
|
*/
|
||||||
|
@ -94,20 +50,57 @@ struct vio_dev {
|
||||||
char *type;
|
char *type;
|
||||||
uint32_t unit_address;
|
uint32_t unit_address;
|
||||||
unsigned int irq;
|
unsigned int irq;
|
||||||
|
|
||||||
struct device dev;
|
struct device dev;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct vio_driver {
|
||||||
|
struct list_head node;
|
||||||
|
char *name;
|
||||||
|
const struct vio_device_id *id_table;
|
||||||
|
int (*probe)(struct vio_dev *dev, const struct vio_device_id *id);
|
||||||
|
int (*remove)(struct vio_dev *dev);
|
||||||
|
unsigned long driver_data;
|
||||||
|
struct device_driver driver;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct vio_bus_ops {
|
||||||
|
int (*match)(const struct vio_device_id *id, const struct vio_dev *dev);
|
||||||
|
void (*unregister_device)(struct vio_dev *);
|
||||||
|
void (*release_device)(struct device *);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct dma_mapping_ops vio_dma_ops;
|
||||||
|
extern struct bus_type vio_bus_type;
|
||||||
extern struct vio_dev vio_bus_device;
|
extern struct vio_dev vio_bus_device;
|
||||||
|
|
||||||
|
extern int vio_register_driver(struct vio_driver *drv);
|
||||||
|
extern void vio_unregister_driver(struct vio_driver *drv);
|
||||||
|
|
||||||
|
extern struct vio_dev * __devinit vio_register_device(struct vio_dev *viodev);
|
||||||
|
extern void __devinit vio_unregister_device(struct vio_dev *dev);
|
||||||
|
|
||||||
|
extern int vio_bus_init(struct vio_bus_ops *);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PPC_PSERIES
|
||||||
|
struct device_node;
|
||||||
|
|
||||||
|
extern struct vio_dev * __devinit vio_register_device_node(
|
||||||
|
struct device_node *node_vdev);
|
||||||
|
extern struct vio_dev *vio_find_node(struct device_node *vnode);
|
||||||
|
extern const void *vio_get_attribute(struct vio_dev *vdev, void *which,
|
||||||
|
int *length);
|
||||||
|
extern int vio_enable_interrupts(struct vio_dev *dev);
|
||||||
|
extern int vio_disable_interrupts(struct vio_dev *dev);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline struct vio_driver *to_vio_driver(struct device_driver *drv)
|
||||||
|
{
|
||||||
|
return container_of(drv, struct vio_driver, driver);
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct vio_dev *to_vio_dev(struct device *dev)
|
static inline struct vio_dev *to_vio_dev(struct device *dev)
|
||||||
{
|
{
|
||||||
return container_of(dev, struct vio_dev, dev);
|
return container_of(dev, struct vio_dev, dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int vio_bus_init(int (*is_match)(const struct vio_device_id *id,
|
|
||||||
const struct vio_dev *dev),
|
|
||||||
void (*)(struct vio_dev *),
|
|
||||||
void (*)(struct device *));
|
|
||||||
|
|
||||||
#endif /* _ASM_VIO_H */
|
#endif /* _ASM_VIO_H */
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
#include <asm-generic/xor.h>
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Device tables which are exported to userspace via
|
* Device tables which are exported to userspace via
|
||||||
* scripts/table2alias.c. You must keep that file in sync with this
|
* scripts/mod/file2alias.c. You must keep that file in sync with this
|
||||||
* header.
|
* header.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -190,6 +190,11 @@ struct of_device_id
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* VIO */
|
||||||
|
struct vio_device_id {
|
||||||
|
char type[32];
|
||||||
|
char compat[32];
|
||||||
|
};
|
||||||
|
|
||||||
/* PCMCIA */
|
/* PCMCIA */
|
||||||
|
|
||||||
|
|
|
@ -341,6 +341,22 @@ static int do_of_entry (const char *filename, struct of_device_id *of, char *ali
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int do_vio_entry(const char *filename, struct vio_device_id *vio,
|
||||||
|
char *alias)
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
|
sprintf(alias, "vio:T%sS%s", vio->type[0] ? vio->type : "*",
|
||||||
|
vio->compat[0] ? vio->compat : "*");
|
||||||
|
|
||||||
|
/* Replace all whitespace with underscores */
|
||||||
|
for (tmp = alias; tmp && *tmp; tmp++)
|
||||||
|
if (isspace (*tmp))
|
||||||
|
*tmp = '_';
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Ignore any prefix, eg. v850 prepends _ */
|
/* Ignore any prefix, eg. v850 prepends _ */
|
||||||
static inline int sym_is(const char *symbol, const char *name)
|
static inline int sym_is(const char *symbol, const char *name)
|
||||||
{
|
{
|
||||||
|
@ -422,6 +438,9 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
|
||||||
else if (sym_is(symname, "__mod_of_device_table"))
|
else if (sym_is(symname, "__mod_of_device_table"))
|
||||||
do_table(symval, sym->st_size, sizeof(struct of_device_id),
|
do_table(symval, sym->st_size, sizeof(struct of_device_id),
|
||||||
do_of_entry, mod);
|
do_of_entry, mod);
|
||||||
|
else if (sym_is(symname, "__mod_vio_device_table"))
|
||||||
|
do_table(symval, sym->st_size, sizeof(struct vio_device_id),
|
||||||
|
do_vio_entry, mod);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue