[PATCH] frv: implement and export various things required by modules
Export a number of features required to build all the modules. It also implements the following simple features: (*) csum_partial_copy_from_user() for MMU as well as no-MMU. (*) __ucmpdi2(). so that they can be exported too. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
8369ce4cfe
commit
402344012e
@@ -16,10 +16,11 @@
|
|||||||
#include <asm/semaphore.h>
|
#include <asm/semaphore.h>
|
||||||
#include <asm/checksum.h>
|
#include <asm/checksum.h>
|
||||||
#include <asm/hardirq.h>
|
#include <asm/hardirq.h>
|
||||||
#include <asm/current.h>
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
extern void dump_thread(struct pt_regs *, struct user *);
|
extern void dump_thread(struct pt_regs *, struct user *);
|
||||||
extern long __memcpy_user(void *dst, const void *src, size_t count);
|
extern long __memcpy_user(void *dst, const void *src, size_t count);
|
||||||
|
extern long __memset_user(void *dst, const void *src, size_t count);
|
||||||
|
|
||||||
/* platform dependent support */
|
/* platform dependent support */
|
||||||
|
|
||||||
@@ -50,7 +51,11 @@ EXPORT_SYMBOL(disable_irq);
|
|||||||
EXPORT_SYMBOL(__res_bus_clock_speed_HZ);
|
EXPORT_SYMBOL(__res_bus_clock_speed_HZ);
|
||||||
EXPORT_SYMBOL(__page_offset);
|
EXPORT_SYMBOL(__page_offset);
|
||||||
EXPORT_SYMBOL(__memcpy_user);
|
EXPORT_SYMBOL(__memcpy_user);
|
||||||
EXPORT_SYMBOL(flush_dcache_page);
|
EXPORT_SYMBOL(__memset_user);
|
||||||
|
EXPORT_SYMBOL(frv_dcache_writeback);
|
||||||
|
EXPORT_SYMBOL(frv_cache_invalidate);
|
||||||
|
EXPORT_SYMBOL(frv_icache_invalidate);
|
||||||
|
EXPORT_SYMBOL(frv_cache_wback_inv);
|
||||||
|
|
||||||
#ifndef CONFIG_MMU
|
#ifndef CONFIG_MMU
|
||||||
EXPORT_SYMBOL(memory_start);
|
EXPORT_SYMBOL(memory_start);
|
||||||
@@ -72,6 +77,9 @@ EXPORT_SYMBOL(memcmp);
|
|||||||
EXPORT_SYMBOL(memscan);
|
EXPORT_SYMBOL(memscan);
|
||||||
EXPORT_SYMBOL(memmove);
|
EXPORT_SYMBOL(memmove);
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(__outsl_ns);
|
||||||
|
EXPORT_SYMBOL(__insl_ns);
|
||||||
|
|
||||||
EXPORT_SYMBOL(get_wchan);
|
EXPORT_SYMBOL(get_wchan);
|
||||||
|
|
||||||
#ifdef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS
|
#ifdef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS
|
||||||
@@ -80,14 +88,13 @@ EXPORT_SYMBOL(atomic_test_and_OR_mask);
|
|||||||
EXPORT_SYMBOL(atomic_test_and_XOR_mask);
|
EXPORT_SYMBOL(atomic_test_and_XOR_mask);
|
||||||
EXPORT_SYMBOL(atomic_add_return);
|
EXPORT_SYMBOL(atomic_add_return);
|
||||||
EXPORT_SYMBOL(atomic_sub_return);
|
EXPORT_SYMBOL(atomic_sub_return);
|
||||||
EXPORT_SYMBOL(__xchg_8);
|
|
||||||
EXPORT_SYMBOL(__xchg_16);
|
|
||||||
EXPORT_SYMBOL(__xchg_32);
|
EXPORT_SYMBOL(__xchg_32);
|
||||||
EXPORT_SYMBOL(__cmpxchg_8);
|
|
||||||
EXPORT_SYMBOL(__cmpxchg_16);
|
|
||||||
EXPORT_SYMBOL(__cmpxchg_32);
|
EXPORT_SYMBOL(__cmpxchg_32);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(__debug_bug_printk);
|
||||||
|
EXPORT_SYMBOL(__delay_loops_MHz);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* libgcc functions - functions that are used internally by the
|
* libgcc functions - functions that are used internally by the
|
||||||
* compiler... (prototypes are not correct though, but that
|
* compiler... (prototypes are not correct though, but that
|
||||||
@@ -101,6 +108,8 @@ extern void __divdi3(void);
|
|||||||
extern void __lshrdi3(void);
|
extern void __lshrdi3(void);
|
||||||
extern void __moddi3(void);
|
extern void __moddi3(void);
|
||||||
extern void __muldi3(void);
|
extern void __muldi3(void);
|
||||||
|
extern void __mulll(void);
|
||||||
|
extern void __umulll(void);
|
||||||
extern void __negdi2(void);
|
extern void __negdi2(void);
|
||||||
extern void __ucmpdi2(void);
|
extern void __ucmpdi2(void);
|
||||||
extern void __udivdi3(void);
|
extern void __udivdi3(void);
|
||||||
@@ -116,8 +125,10 @@ EXPORT_SYMBOL(__ashrdi3);
|
|||||||
EXPORT_SYMBOL(__lshrdi3);
|
EXPORT_SYMBOL(__lshrdi3);
|
||||||
//EXPORT_SYMBOL(__moddi3);
|
//EXPORT_SYMBOL(__moddi3);
|
||||||
EXPORT_SYMBOL(__muldi3);
|
EXPORT_SYMBOL(__muldi3);
|
||||||
|
EXPORT_SYMBOL(__mulll);
|
||||||
|
EXPORT_SYMBOL(__umulll);
|
||||||
EXPORT_SYMBOL(__negdi2);
|
EXPORT_SYMBOL(__negdi2);
|
||||||
//EXPORT_SYMBOL(__ucmpdi2);
|
EXPORT_SYMBOL(__ucmpdi2);
|
||||||
//EXPORT_SYMBOL(__udivdi3);
|
//EXPORT_SYMBOL(__udivdi3);
|
||||||
//EXPORT_SYMBOL(__udivmoddi4);
|
//EXPORT_SYMBOL(__udivmoddi4);
|
||||||
//EXPORT_SYMBOL(__umoddi3);
|
//EXPORT_SYMBOL(__umoddi3);
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
@@ -178,6 +179,8 @@ void disable_irq_nosync(unsigned int irq)
|
|||||||
spin_unlock_irqrestore(&level->lock, flags);
|
spin_unlock_irqrestore(&level->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(disable_irq_nosync);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* disable_irq - disable an irq and wait for completion
|
* disable_irq - disable an irq and wait for completion
|
||||||
* @irq: Interrupt to disable
|
* @irq: Interrupt to disable
|
||||||
@@ -204,6 +207,8 @@ void disable_irq(unsigned int irq)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(disable_irq);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enable_irq - enable handling of an irq
|
* enable_irq - enable handling of an irq
|
||||||
* @irq: Interrupt to enable
|
* @irq: Interrupt to enable
|
||||||
@@ -268,6 +273,8 @@ void enable_irq(unsigned int irq)
|
|||||||
spin_unlock_irqrestore(&level->lock, flags);
|
spin_unlock_irqrestore(&level->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(enable_irq);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*
|
/*
|
||||||
* handles all normal device IRQ's
|
* handles all normal device IRQ's
|
||||||
@@ -425,6 +432,8 @@ int request_irq(unsigned int irq,
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(request_irq);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* free_irq - free an interrupt
|
* free_irq - free an interrupt
|
||||||
* @irq: Interrupt line to free
|
* @irq: Interrupt line to free
|
||||||
@@ -496,6 +505,8 @@ void free_irq(unsigned int irq, void *dev_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(free_irq);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IRQ autodetection code..
|
* IRQ autodetection code..
|
||||||
*
|
*
|
||||||
@@ -519,6 +530,8 @@ unsigned long probe_irq_on(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(probe_irq_on);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return a mask of triggered interrupts (this
|
* Return a mask of triggered interrupts (this
|
||||||
* can handle only legacy ISA interrupts).
|
* can handle only legacy ISA interrupts).
|
||||||
@@ -542,6 +555,8 @@ unsigned int probe_irq_mask(unsigned long xmask)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(probe_irq_mask);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the one interrupt that triggered (this can
|
* Return the one interrupt that triggered (this can
|
||||||
* handle any interrupt source).
|
* handle any interrupt source).
|
||||||
@@ -571,6 +586,8 @@ int probe_irq_off(unsigned long xmask)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(probe_irq_off);
|
||||||
|
|
||||||
/* this was setup_x86_irq but it seems pretty generic */
|
/* this was setup_x86_irq but it seems pretty generic */
|
||||||
int setup_irq(unsigned int irq, struct irqaction *new)
|
int setup_irq(unsigned int irq, struct irqaction *new)
|
||||||
{
|
{
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/module.h>
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
#include <linux/pm_legacy.h>
|
#include <linux/pm_legacy.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
#include "local.h"
|
#include "local.h"
|
||||||
|
|
||||||
void (*pm_power_off)(void);
|
void (*pm_power_off)(void);
|
||||||
|
EXPORT_SYMBOL(pm_power_off);
|
||||||
|
|
||||||
extern void frv_change_cmode(int);
|
extern void frv_change_cmode(int);
|
||||||
|
|
||||||
|
@@ -189,6 +189,8 @@ void do_gettimeofday(struct timeval *tv)
|
|||||||
tv->tv_usec = usec;
|
tv->tv_usec = usec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(do_gettimeofday);
|
||||||
|
|
||||||
int do_settimeofday(struct timespec *tv)
|
int do_settimeofday(struct timespec *tv)
|
||||||
{
|
{
|
||||||
time_t wtm_sec, sec = tv->tv_sec;
|
time_t wtm_sec, sec = tv->tv_sec;
|
||||||
@@ -218,6 +220,7 @@ int do_settimeofday(struct timespec *tv)
|
|||||||
clock_was_set();
|
clock_was_set();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(do_settimeofday);
|
EXPORT_SYMBOL(do_settimeofday);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/fpu.h>
|
#include <asm/fpu.h>
|
||||||
@@ -250,6 +251,8 @@ void dump_stack(void)
|
|||||||
show_stack(NULL, NULL);
|
show_stack(NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dump_stack);
|
||||||
|
|
||||||
void show_stack(struct task_struct *task, unsigned long *sp)
|
void show_stack(struct task_struct *task, unsigned long *sp)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
#include <linux/module.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -58,8 +59,11 @@ long strncpy_from_user(char *dst, const char *src, long count)
|
|||||||
memset(p, 0, count); /* clear remainder of buffer [security] */
|
memset(p, 0, count); /* clear remainder of buffer [security] */
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
} /* end strncpy_from_user() */
|
} /* end strncpy_from_user() */
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(strncpy_from_user);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*
|
/*
|
||||||
* Return the size of a string (including the ending 0)
|
* Return the size of a string (including the ending 0)
|
||||||
@@ -92,4 +96,7 @@ long strnlen_user(const char *src, long count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return p - src + 1; /* return length including NUL */
|
return p - src + 1; /* return length including NUL */
|
||||||
|
|
||||||
} /* end strnlen_user() */
|
} /* end strnlen_user() */
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(strnlen_user);
|
||||||
|
@@ -3,6 +3,6 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
lib-y := \
|
lib-y := \
|
||||||
__ashldi3.o __lshrdi3.o __muldi3.o __ashrdi3.o __negdi2.o \
|
__ashldi3.o __lshrdi3.o __muldi3.o __ashrdi3.o __negdi2.o __ucmpdi2.o \
|
||||||
checksum.o memcpy.o memset.o atomic-ops.o \
|
checksum.o memcpy.o memset.o atomic-ops.o \
|
||||||
outsl_ns.o outsl_sw.o insl_ns.o insl_sw.o cache.o
|
outsl_ns.o outsl_sw.o insl_ns.o insl_sw.o cache.o
|
||||||
|
45
arch/frv/lib/__ucmpdi2.S
Normal file
45
arch/frv/lib/__ucmpdi2.S
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/* __ucmpdi2.S: 64-bit unsigned compare
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
|
||||||
|
* Written by David Howells (dhowells@redhat.com)
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
.text
|
||||||
|
.p2align 4
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# int __ucmpdi2(unsigned long long a [GR8:GR9],
|
||||||
|
# unsigned long long b [GR10:GR11])
|
||||||
|
#
|
||||||
|
# - returns 0, 1, or 2 as a <, =, > b respectively.
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
.globl __ucmpdi2
|
||||||
|
.type __ucmpdi2,@function
|
||||||
|
__ucmpdi2:
|
||||||
|
or.p gr8,gr0,gr4
|
||||||
|
subcc gr8,gr10,gr0,icc0
|
||||||
|
setlos.p #0,gr8
|
||||||
|
bclr icc0,#2 ; a.msw < b.msw
|
||||||
|
|
||||||
|
setlos.p #2,gr8
|
||||||
|
bhilr icc0,#0 ; a.msw > b.msw
|
||||||
|
|
||||||
|
subcc.p gr9,gr11,gr0,icc1
|
||||||
|
setlos #0,gr8
|
||||||
|
setlos.p #2,gr9
|
||||||
|
setlos #1,gr7
|
||||||
|
cknc icc1,cc6
|
||||||
|
cor.p gr9,gr0,gr8, cc6,#1
|
||||||
|
cckls icc1,cc4, cc6,#1
|
||||||
|
andcr cc6,cc4,cc4
|
||||||
|
cor gr7,gr0,gr8, cc4,#1
|
||||||
|
bralr
|
||||||
|
.size __ucmpdi2, .-__ucmpdi2
|
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include <net/checksum.h>
|
#include <net/checksum.h>
|
||||||
#include <asm/checksum.h>
|
#include <asm/checksum.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
static inline unsigned short from32to16(unsigned long x)
|
static inline unsigned short from32to16(unsigned long x)
|
||||||
{
|
{
|
||||||
@@ -115,34 +116,52 @@ unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(csum_partial);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this routine is used for miscellaneous IP-like checksums, mainly
|
* this routine is used for miscellaneous IP-like checksums, mainly
|
||||||
* in icmp.c
|
* in icmp.c
|
||||||
*/
|
*/
|
||||||
unsigned short ip_compute_csum(const unsigned char * buff, int len)
|
unsigned short ip_compute_csum(const unsigned char * buff, int len)
|
||||||
{
|
{
|
||||||
return ~do_csum(buff,len);
|
return ~do_csum(buff, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(ip_compute_csum);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* copy from fs while checksumming, otherwise like csum_partial
|
* copy from fs while checksumming, otherwise like csum_partial
|
||||||
*/
|
*/
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
csum_partial_copy_from_user(const char *src, char *dst, int len, int sum, int *csum_err)
|
csum_partial_copy_from_user(const char __user *src, char *dst,
|
||||||
|
int len, int sum, int *csum_err)
|
||||||
{
|
{
|
||||||
if (csum_err) *csum_err = 0;
|
int rem;
|
||||||
memcpy(dst, src, len);
|
|
||||||
|
if (csum_err)
|
||||||
|
*csum_err = 0;
|
||||||
|
|
||||||
|
rem = copy_from_user(dst, src, len);
|
||||||
|
if (rem != 0) {
|
||||||
|
if (csum_err)
|
||||||
|
*csum_err = -EFAULT;
|
||||||
|
memset(dst + len - rem, 0, rem);
|
||||||
|
len = rem;
|
||||||
|
}
|
||||||
|
|
||||||
return csum_partial(dst, len, sum);
|
return csum_partial(dst, len, sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(csum_partial_copy_from_user);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* copy from ds while checksumming, otherwise like csum_partial
|
* copy from ds while checksumming, otherwise like csum_partial
|
||||||
*/
|
*/
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
csum_partial_copy(const char *src, char *dst, int len, int sum)
|
csum_partial_copy(const char *src, char *dst, int len, int sum)
|
||||||
{
|
{
|
||||||
memcpy(dst, src, len);
|
memcpy(dst, src, len);
|
||||||
return csum_partial(dst, len, sum);
|
return csum_partial(dst, len, sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(csum_partial_copy);
|
||||||
|
@@ -83,6 +83,8 @@ void *dma_alloc_coherent(struct device *hwdev, size_t size, dma_addr_t *dma_hand
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_alloc_coherent);
|
||||||
|
|
||||||
void dma_free_coherent(struct device *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle)
|
void dma_free_coherent(struct device *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle)
|
||||||
{
|
{
|
||||||
struct dma_alloc_record *rec;
|
struct dma_alloc_record *rec;
|
||||||
@@ -102,6 +104,8 @@ void dma_free_coherent(struct device *hwdev, size_t size, void *vaddr, dma_addr_
|
|||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_free_coherent);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Map a single buffer of the indicated size for DMA in streaming mode.
|
* Map a single buffer of the indicated size for DMA in streaming mode.
|
||||||
* The 32-bit bus address to use is returned.
|
* The 32-bit bus address to use is returned.
|
||||||
@@ -120,6 +124,8 @@ dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
|
|||||||
return virt_to_bus(ptr);
|
return virt_to_bus(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_map_single);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Map a set of buffers described by scatterlist in streaming
|
* Map a set of buffers described by scatterlist in streaming
|
||||||
* mode for DMA. This is the scather-gather version of the
|
* mode for DMA. This is the scather-gather version of the
|
||||||
@@ -150,3 +156,5 @@ int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
|||||||
|
|
||||||
return nents;
|
return nents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_map_sg);
|
||||||
|
@@ -28,11 +28,15 @@ void *dma_alloc_coherent(struct device *hwdev, size_t size, dma_addr_t *dma_hand
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_alloc_coherent);
|
||||||
|
|
||||||
void dma_free_coherent(struct device *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle)
|
void dma_free_coherent(struct device *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle)
|
||||||
{
|
{
|
||||||
consistent_free(vaddr);
|
consistent_free(vaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_free_coherent);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Map a single buffer of the indicated size for DMA in streaming mode.
|
* Map a single buffer of the indicated size for DMA in streaming mode.
|
||||||
* The 32-bit bus address to use is returned.
|
* The 32-bit bus address to use is returned.
|
||||||
@@ -51,6 +55,8 @@ dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
|
|||||||
return virt_to_bus(ptr);
|
return virt_to_bus(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_map_single);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Map a set of buffers described by scatterlist in streaming
|
* Map a set of buffers described by scatterlist in streaming
|
||||||
* mode for DMA. This is the scather-gather version of the
|
* mode for DMA. This is the scather-gather version of the
|
||||||
@@ -96,6 +102,8 @@ int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
|||||||
return nents;
|
return nents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_map_sg);
|
||||||
|
|
||||||
dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long offset,
|
dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long offset,
|
||||||
size_t size, enum dma_data_direction direction)
|
size_t size, enum dma_data_direction direction)
|
||||||
{
|
{
|
||||||
@@ -103,3 +111,5 @@ dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long off
|
|||||||
flush_dcache_page(page);
|
flush_dcache_page(page);
|
||||||
return (dma_addr_t) page_to_phys(page) + offset;
|
return (dma_addr_t) page_to_phys(page) + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_map_page);
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
|
#include <linux/module.h>
|
||||||
#include <asm/pgalloc.h>
|
#include <asm/pgalloc.h>
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -38,6 +39,8 @@ void flush_dcache_page(struct page *page)
|
|||||||
|
|
||||||
} /* end flush_dcache_page() */
|
} /* end flush_dcache_page() */
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(flush_dcache_page);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*
|
/*
|
||||||
* ICI takes a virtual address and the page may not currently have one
|
* ICI takes a virtual address and the page may not currently have one
|
||||||
@@ -64,3 +67,5 @@ void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
|
|||||||
}
|
}
|
||||||
|
|
||||||
} /* end flush_icache_user_range() */
|
} /* end flush_icache_user_range() */
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(flush_icache_user_range);
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
* 2 of the License, or (at your option) any later version.
|
* 2 of the License, or (at your option) any later version.
|
||||||
*/
|
*/
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
void *kmap(struct page *page)
|
void *kmap(struct page *page)
|
||||||
{
|
{
|
||||||
@@ -18,6 +19,8 @@ void *kmap(struct page *page)
|
|||||||
return kmap_high(page);
|
return kmap_high(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(kmap);
|
||||||
|
|
||||||
void kunmap(struct page *page)
|
void kunmap(struct page *page)
|
||||||
{
|
{
|
||||||
if (in_interrupt())
|
if (in_interrupt())
|
||||||
@@ -27,7 +30,12 @@ void kunmap(struct page *page)
|
|||||||
kunmap_high(page);
|
kunmap_high(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(kunmap);
|
||||||
|
|
||||||
struct page *kmap_atomic_to_page(void *ptr)
|
struct page *kmap_atomic_to_page(void *ptr)
|
||||||
{
|
{
|
||||||
return virt_to_page(ptr);
|
return virt_to_page(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(kmap_atomic_to_page);
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
int find_next_bit(const unsigned long *addr, int size, int offset)
|
int find_next_bit(const unsigned long *addr, int size, int offset)
|
||||||
{
|
{
|
||||||
@@ -53,3 +54,5 @@ int find_next_bit(const unsigned long *addr, int size, int offset)
|
|||||||
|
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(find_next_bit);
|
||||||
|
Reference in New Issue
Block a user