Commit a4d43929 authored by Russell King's avatar Russell King Committed by Linus Torvalds

[PATCH] 1: 2.5.29-dma

The following patch adds support for CONFIG_GENERIC_ISA_DMA, which went
into the 2.4-ac kernel series prior to 2.5 happening.

The following patch allows architectures to decide whether they want
the generic ISA DMA functionality provided by kernel/dma.c and other
supporting files.

In addition, we move the procfs "/proc/dma" support code out of fs/proc
into kernel/dma.c, and adapt it to use the new seq_file code.
parent 3a6ecd1b
...@@ -7,6 +7,7 @@ define_bool CONFIG_ALPHA y ...@@ -7,6 +7,7 @@ define_bool CONFIG_ALPHA y
define_bool CONFIG_UID16 n define_bool CONFIG_UID16 n
define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n
define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y
define_bool CONFIG_GENERIC_ISA_DMA y
source init/Config.in source init/Config.in
......
...@@ -9,6 +9,7 @@ define_bool CONFIG_ISA y ...@@ -9,6 +9,7 @@ define_bool CONFIG_ISA y
define_bool CONFIG_SBUS n define_bool CONFIG_SBUS n
define_bool CONFIG_UID16 y define_bool CONFIG_UID16 y
define_bool CONFIG_GENERIC_ISA_DMA y
source init/Config.in source init/Config.in
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
define_bool CONFIG_UID16 y define_bool CONFIG_UID16 y
define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y
define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n
define_bool CONFIG_GENERIC_ISA_DMA y
mainmenu_name "Linux/68k Kernel Configuration" mainmenu_name "Linux/68k Kernel Configuration"
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
# #
define_bool CONFIG_MIPS y define_bool CONFIG_MIPS y
define_bool CONFIG_SMP n define_bool CONFIG_SMP n
define_bool CONFIG_GENERIC_ISA_DMA y
mainmenu_name "Linux Kernel Configuration" mainmenu_name "Linux Kernel Configuration"
......
...@@ -26,6 +26,7 @@ endmenu ...@@ -26,6 +26,7 @@ endmenu
define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y
define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n
define_bool CONFIG_GENERIC_ISA_DMA y
# #
# Select some configuration options automatically based on user selections # Select some configuration options automatically based on user selections
......
...@@ -9,6 +9,7 @@ define_bool CONFIG_PARISC y ...@@ -9,6 +9,7 @@ define_bool CONFIG_PARISC y
define_bool CONFIG_UID16 n define_bool CONFIG_UID16 n
define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y
define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n
define_bool CONFIG_GENERIC_ISA_DMA y
source init/Config.in source init/Config.in
......
...@@ -7,6 +7,7 @@ define_bool CONFIG_UID16 n ...@@ -7,6 +7,7 @@ define_bool CONFIG_UID16 n
define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n
define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y
define_bool CONFIG_HAVE_DEC_LOCK y define_bool CONFIG_HAVE_DEC_LOCK y
define_bool CONFIG_GENERIC_ISA_DMA y
mainmenu_name "Linux/PowerPC Kernel Configuration" mainmenu_name "Linux/PowerPC Kernel Configuration"
......
...@@ -9,6 +9,7 @@ define_bool CONFIG_SUPERH y ...@@ -9,6 +9,7 @@ define_bool CONFIG_SUPERH y
define_bool CONFIG_UID16 y define_bool CONFIG_UID16 y
define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y
define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n
define_bool CONFIG_GENERIC_ISA_DMA y
source init/Config.in source init/Config.in
......
...@@ -6,6 +6,7 @@ mainmenu_name "Linux/SPARC Kernel Configuration" ...@@ -6,6 +6,7 @@ mainmenu_name "Linux/SPARC Kernel Configuration"
define_bool CONFIG_UID16 y define_bool CONFIG_UID16 y
define_bool CONFIG_HIGHMEM y define_bool CONFIG_HIGHMEM y
define_bool CONFIG_GENERIC_ISA_DMA y
source init/Config.in source init/Config.in
......
...@@ -26,6 +26,7 @@ bool 'Support for hot-pluggable devices' CONFIG_HOTPLUG ...@@ -26,6 +26,7 @@ bool 'Support for hot-pluggable devices' CONFIG_HOTPLUG
define_bool CONFIG_HAVE_DEC_LOCK y define_bool CONFIG_HAVE_DEC_LOCK y
define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n
define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y
define_bool CONFIG_GENERIC_ISA_DMA y
define_bool CONFIG_ISA n define_bool CONFIG_ISA n
define_bool CONFIG_ISAPNP n define_bool CONFIG_ISAPNP n
define_bool CONFIG_EISA n define_bool CONFIG_EISA n
......
...@@ -430,13 +430,6 @@ static int filesystems_read_proc(char *page, char **start, off_t off, ...@@ -430,13 +430,6 @@ static int filesystems_read_proc(char *page, char **start, off_t off,
return proc_calc_metrics(page, start, off, count, eof, len); return proc_calc_metrics(page, start, off, count, eof, len);
} }
static int dma_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
int len = get_dma_list(page);
return proc_calc_metrics(page, start, off, count, eof, len);
}
static int ioports_read_proc(char *page, char **start, off_t off, static int ioports_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data) int count, int *eof, void *data)
{ {
...@@ -589,7 +582,6 @@ void __init proc_misc_init(void) ...@@ -589,7 +582,6 @@ void __init proc_misc_init(void)
{"stat", kstat_read_proc}, {"stat", kstat_read_proc},
{"devices", devices_read_proc}, {"devices", devices_read_proc},
{"filesystems", filesystems_read_proc}, {"filesystems", filesystems_read_proc},
{"dma", dma_read_proc},
{"ioports", ioports_read_proc}, {"ioports", ioports_read_proc},
{"cmdline", cmdline_read_proc}, {"cmdline", cmdline_read_proc},
#ifdef CONFIG_SGI_DS1286 #ifdef CONFIG_SGI_DS1286
......
...@@ -10,13 +10,14 @@ ...@@ -10,13 +10,14 @@
O_TARGET := kernel.o O_TARGET := kernel.o
export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o \ export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o \
printk.o platform.o suspend.o printk.o platform.o suspend.o dma.o
obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \ obj-y = sched.o fork.o exec_domain.o panic.o printk.o \
module.o exit.o itimer.o time.o softirq.o resource.o \ module.o exit.o itimer.o time.o softirq.o resource.o \
sysctl.o capability.o ptrace.o timer.o user.o \ sysctl.o capability.o ptrace.o timer.o user.o \
signal.o sys.o kmod.o context.o futex.o platform.o signal.o sys.o kmod.o context.o futex.o platform.o
obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
obj-$(CONFIG_SMP) += cpu.o obj-$(CONFIG_SMP) += cpu.o
obj-$(CONFIG_UID16) += uid16.o obj-$(CONFIG_UID16) += uid16.o
obj-$(CONFIG_MODULES) += ksyms.o obj-$(CONFIG_MODULES) += ksyms.o
......
...@@ -9,11 +9,14 @@ ...@@ -9,11 +9,14 @@
* [It also happened to remove the sizeof(char *) == sizeof(int) * [It also happened to remove the sizeof(char *) == sizeof(int)
* assumption introduced because of those /proc/dma patches. -- Hennus] * assumption introduced because of those /proc/dma patches. -- Hennus]
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/seq_file.h>
#include <linux/proc_fs.h>
#include <linux/init.h>
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -65,20 +68,6 @@ static struct dma_chan dma_chan_busy[MAX_DMA_CHANNELS] = { ...@@ -65,20 +68,6 @@ static struct dma_chan dma_chan_busy[MAX_DMA_CHANNELS] = {
{ 0, 0 } { 0, 0 }
}; };
int get_dma_list(char *buf)
{
int i, len = 0;
for (i = 0 ; i < MAX_DMA_CHANNELS ; i++) {
if (dma_chan_busy[i].lock) {
len += sprintf(buf+len, "%2d: %s\n",
i,
dma_chan_busy[i].device_id);
}
}
return len;
} /* get_dma_list */
int request_dma(unsigned int dmanr, const char * device_id) int request_dma(unsigned int dmanr, const char * device_id)
{ {
...@@ -109,6 +98,19 @@ void free_dma(unsigned int dmanr) ...@@ -109,6 +98,19 @@ void free_dma(unsigned int dmanr)
} /* free_dma */ } /* free_dma */
static int proc_dma_show(struct seq_file *m, void *v)
{
int i;
for (i = 0 ; i < MAX_DMA_CHANNELS ; i++) {
if (dma_chan_busy[i].lock) {
seq_printf(m, "%2d: %s\n", i,
dma_chan_busy[i].device_id);
}
}
return 0;
}
#else #else
int request_dma(unsigned int dmanr, const char *device_id) int request_dma(unsigned int dmanr, const char *device_id)
...@@ -120,9 +122,54 @@ void free_dma(unsigned int dmanr) ...@@ -120,9 +122,54 @@ void free_dma(unsigned int dmanr)
{ {
} }
int get_dma_list(char *buf) static int proc_dma_show(struct seq_file *m, void *v)
{ {
strcpy(buf, "No DMA\n"); seq_puts(m, "No DMA\n");
return 7; return 0;
} }
#endif #endif
#ifdef CONFIG_PROC_FS
static int proc_dma_open(struct inode *inode, struct file *file)
{
char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
struct seq_file *m;
int res;
if (!buf)
return -ENOMEM;
res = single_open(file, proc_dma_show, NULL);
if (!res) {
m = file->private_data;
m->buf = buf;
m->size = PAGE_SIZE;
} else
kfree(buf);
return res;
}
static struct file_operations proc_dma_operations = {
open: proc_dma_open,
read: seq_read,
llseek: seq_lseek,
release: single_release,
};
static int __init proc_dma_init(void)
{
struct proc_dir_entry *e;
e = create_proc_entry("dma", 0, NULL);
if (e)
e->proc_fops = &proc_dma_operations;
return 0;
}
__initcall(proc_dma_init);
#endif
EXPORT_SYMBOL(request_dma);
EXPORT_SYMBOL(free_dma);
EXPORT_SYMBOL(dma_spin_lock);
...@@ -64,9 +64,6 @@ extern void set_device_ro(kdev_t dev,int flag); ...@@ -64,9 +64,6 @@ extern void set_device_ro(kdev_t dev,int flag);
extern void *sys_call_table; extern void *sys_call_table;
extern struct timezone sys_tz; extern struct timezone sys_tz;
extern int request_dma(unsigned int dmanr, const char * deviceID);
extern void free_dma(unsigned int dmanr);
extern spinlock_t dma_spin_lock;
#ifdef CONFIG_MODVERSIONS #ifdef CONFIG_MODVERSIONS
const struct module_symbol __export_Using_Versions const struct module_symbol __export_Using_Versions
...@@ -437,10 +434,6 @@ EXPORT_SYMBOL(unlock_kiovec); ...@@ -437,10 +434,6 @@ EXPORT_SYMBOL(unlock_kiovec);
EXPORT_SYMBOL(brw_kiovec); EXPORT_SYMBOL(brw_kiovec);
EXPORT_SYMBOL(kiobuf_wait_for_io); EXPORT_SYMBOL(kiobuf_wait_for_io);
/* dma handling */
EXPORT_SYMBOL(request_dma);
EXPORT_SYMBOL(free_dma);
EXPORT_SYMBOL(dma_spin_lock);
#ifdef HAVE_DISABLE_HLT #ifdef HAVE_DISABLE_HLT
EXPORT_SYMBOL(disable_hlt); EXPORT_SYMBOL(disable_hlt);
EXPORT_SYMBOL(enable_hlt); EXPORT_SYMBOL(enable_hlt);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment