Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
6da2b234
Commit
6da2b234
authored
Jan 06, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://lia64.bkbits.net/linux-ia64-release-2.6.11
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
b9b61107
a75f8710
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
387 additions
and
178 deletions
+387
-178
arch/ia64/configs/zx1_defconfig
arch/ia64/configs/zx1_defconfig
+195
-20
arch/ia64/kernel/irq_ia64.c
arch/ia64/kernel/irq_ia64.c
+1
-1
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/perfmon.c
+0
-2
arch/ia64/lib/io.c
arch/ia64/lib/io.c
+7
-10
arch/ia64/lib/swiotlb.c
arch/ia64/lib/swiotlb.c
+179
-135
arch/ia64/mm/contig.c
arch/ia64/mm/contig.c
+2
-2
include/asm-ia64/io.h
include/asm-ia64/io.h
+3
-8
No files found.
arch/ia64/configs/zx1_defconfig
View file @
6da2b234
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.
9-rc2-aegl
#
Mon Sep 27 19:03:13
2004
# Linux kernel version: 2.6.
10
#
Wed Dec 29 09:05:48
2004
#
#
...
...
@@ -11,6 +11,7 @@ CONFIG_EXPERIMENTAL=y
# CONFIG_CLEAN_COMPILE is not set
CONFIG_BROKEN=y
CONFIG_BROKEN_ON_SMP=y
CONFIG_LOCK_KERNEL=y
#
# General setup
...
...
@@ -25,6 +26,7 @@ CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=17
CONFIG_HOTPLUG=y
CONFIG_KOBJECT_UEVENT=y
# CONFIG_IKCONFIG is not set
# CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y
...
...
@@ -32,12 +34,12 @@ CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0
# CONFIG_TINY_SHMEM is not set
#
...
...
@@ -47,6 +49,7 @@ CONFIG_MODULES=y
# CONFIG_MODULE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
# CONFIG_KMOD is not set
#
...
...
@@ -83,6 +86,7 @@ CONFIG_NR_CPUS=16
CONFIG_HAVE_DEC_LOCK=y
CONFIG_IA32_SUPPORT=y
CONFIG_COMPAT=y
CONFIG_IA64_MCA_RECOVERY=y
CONFIG_PERFMON=y
CONFIG_IA64_PALINFO=y
...
...
@@ -106,9 +110,11 @@ CONFIG_ACPI=y
CONFIG_ACPI_BOOT=y
CONFIG_ACPI_INTERPRETER=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_VIDEO=m
CONFIG_ACPI_FAN=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_THERMAL=y
CONFIG_ACPI_BLACKLIST_YEAR=0
# CONFIG_ACPI_DEBUG is not set
CONFIG_ACPI_BUS=y
CONFIG_ACPI_POWER=y
...
...
@@ -136,9 +142,13 @@ CONFIG_HOTPLUG_PCI_ACPI=y
# CONFIG_HOTPLUG_PCI_SHPC is not set
#
# PCMCIA/CardBus support
# PCCARD (PCMCIA/CardBus) support
#
# CONFIG_PCCARD is not set
#
# PC-card bridges
#
# CONFIG_PCMCIA is not set
#
# Device Drivers
...
...
@@ -165,6 +175,7 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
#
# Plug and Play support
#
# CONFIG_PNP is not set
#
# Block devices
...
...
@@ -179,8 +190,19 @@ CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_UB is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_CDROM_PKTCDVD is not set
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
#
# ATA/ATAPI/MFM/RLL support
...
...
@@ -199,7 +221,6 @@ CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
# CONFIG_IDE_TASK_IOCTL is not set
# CONFIG_IDE_TASKFILE_IO is not set
#
# IDE chipset support/bugfixes
...
...
@@ -303,6 +324,7 @@ CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_QLOGIC_ISP is not set
# CONFIG_SCSI_QLOGIC_FC is not set
CONFIG_SCSI_QLOGIC_1280=y
# CONFIG_SCSI_QLOGIC_1280_1040 is not set
CONFIG_SCSI_QLA2XXX=y
# CONFIG_SCSI_QLA21XX is not set
# CONFIG_SCSI_QLA22XX is not set
...
...
@@ -362,6 +384,8 @@ CONFIG_IP_MULTICAST=y
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_TUNNEL is not set
# CONFIG_IP_TCPDIAG is not set
# CONFIG_IP_TCPDIAG_IPV6 is not set
#
# IP: Virtual Server Configuration
...
...
@@ -375,6 +399,7 @@ CONFIG_NETFILTER=y
# IP: Netfilter Configuration
#
# CONFIG_IP_NF_CONNTRACK is not set
# CONFIG_IP_NF_CONNTRACK_MARK is not set
# CONFIG_IP_NF_QUEUE is not set
# CONFIG_IP_NF_IPTABLES is not set
CONFIG_IP_NF_ARPTABLES=y
...
...
@@ -399,7 +424,6 @@ CONFIG_IP_NF_ARPTABLES=y
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
#
# QoS and/or fair queueing
...
...
@@ -469,7 +493,6 @@ CONFIG_E100=y
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_VIA_RHINE is not set
# CONFIG_VIA_VELOCITY is not set
#
# Ethernet (1000 Mbit)
...
...
@@ -483,6 +506,7 @@ CONFIG_E1000=y
# CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set
# CONFIG_SK98LIN is not set
# CONFIG_VIA_VELOCITY is not set
CONFIG_TIGON3=y
#
...
...
@@ -653,6 +677,7 @@ CONFIG_I2C_ALGOPCF=y
# CONFIG_I2C_SIS5595 is not set
# CONFIG_I2C_SIS630 is not set
# CONFIG_I2C_SIS96X is not set
# CONFIG_I2C_STUB is not set
# CONFIG_I2C_VIA is not set
# CONFIG_I2C_VIAPRO is not set
# CONFIG_I2C_VOODOO3 is not set
...
...
@@ -664,20 +689,24 @@ CONFIG_I2C_ALGOPCF=y
# CONFIG_I2C_SENSOR is not set
# CONFIG_SENSORS_ADM1021 is not set
# CONFIG_SENSORS_ADM1025 is not set
# CONFIG_SENSORS_ADM1026 is not set
# CONFIG_SENSORS_ADM1031 is not set
# CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_DS1621 is not set
# CONFIG_SENSORS_FSCHER is not set
# CONFIG_SENSORS_GL518SM is not set
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM75 is not set
# CONFIG_SENSORS_LM77 is not set
# CONFIG_SENSORS_LM78 is not set
# CONFIG_SENSORS_LM80 is not set
# CONFIG_SENSORS_LM83 is not set
# CONFIG_SENSORS_LM85 is not set
# CONFIG_SENSORS_LM87 is not set
# CONFIG_SENSORS_LM90 is not set
# CONFIG_SENSORS_MAX1619 is not set
# CONFIG_SENSORS_PC87360 is not set
# CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_VIA686A is not set
# CONFIG_SENSORS_W83781D is not set
...
...
@@ -708,7 +737,37 @@ CONFIG_I2C_ALGOPCF=y
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
CONFIG_VIDEO_DEV=y
#
# Video For Linux
#
#
# Video Adapters
#
# CONFIG_VIDEO_BT848 is not set
# CONFIG_VIDEO_CPIA is not set
# CONFIG_VIDEO_SAA5246A is not set
# CONFIG_VIDEO_SAA5249 is not set
# CONFIG_TUNER_3036 is not set
# CONFIG_VIDEO_STRADIS is not set
# CONFIG_VIDEO_ZORAN is not set
# CONFIG_VIDEO_ZR36120 is not set
# CONFIG_VIDEO_SAA7134 is not set
# CONFIG_VIDEO_MXB is not set
# CONFIG_VIDEO_DPC is not set
# CONFIG_VIDEO_HEXIUM_ORION is not set
# CONFIG_VIDEO_HEXIUM_GEMINI is not set
# CONFIG_VIDEO_CX88 is not set
# CONFIG_VIDEO_OVCAMCHIP is not set
#
# Radio Adapters
#
# CONFIG_RADIO_GEMTEK_PCI is not set
# CONFIG_RADIO_MAXIRADIO is not set
# CONFIG_RADIO_MAESTRO is not set
#
# Digital Video Broadcasting Devices
...
...
@@ -720,6 +779,7 @@ CONFIG_I2C_ALGOPCF=y
#
CONFIG_FB=y
CONFIG_FB_MODE_HELPERS=y
# CONFIG_FB_TILEBLITTING is not set
# CONFIG_FB_CIRRUS is not set
# CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set
...
...
@@ -733,6 +793,7 @@ CONFIG_FB_RADEON_I2C=y
CONFIG_FB_RADEON_DEBUG=y
# CONFIG_FB_ATY128 is not set
# CONFIG_FB_ATY is not set
# CONFIG_FB_SAVAGE is not set
# CONFIG_FB_SIS is not set
# CONFIG_FB_NEOMAGIC is not set
# CONFIG_FB_KYRO is not set
...
...
@@ -763,7 +824,87 @@ CONFIG_LOGO_LINUX_CLUT224=y
#
# Sound
#
# CONFIG_SOUND is not set
CONFIG_SOUND=y
#
# Advanced Linux Sound Architecture
#
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_HWDEP=y
CONFIG_SND_RAWMIDI=y
CONFIG_SND_SEQUENCER=y
# CONFIG_SND_SEQ_DUMMY is not set
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_SEQUENCER_OSS=y
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not set
#
# Generic devices
#
CONFIG_SND_MPU401_UART=y
CONFIG_SND_OPL3_LIB=y
# CONFIG_SND_DUMMY is not set
# CONFIG_SND_VIRMIDI is not set
# CONFIG_SND_MTPAV is not set
# CONFIG_SND_SERIAL_U16550 is not set
# CONFIG_SND_MPU401 is not set
#
# PCI devices
#
CONFIG_SND_AC97_CODEC=y
# CONFIG_SND_ALI5451 is not set
# CONFIG_SND_ATIIXP is not set
# CONFIG_SND_ATIIXP_MODEM is not set
# CONFIG_SND_AU8810 is not set
# CONFIG_SND_AU8820 is not set
# CONFIG_SND_AU8830 is not set
# CONFIG_SND_AZT3328 is not set
# CONFIG_SND_BT87X is not set
# CONFIG_SND_CS46XX is not set
# CONFIG_SND_CS4281 is not set
# CONFIG_SND_EMU10K1 is not set
# CONFIG_SND_KORG1212 is not set
# CONFIG_SND_MIXART is not set
# CONFIG_SND_NM256 is not set
# CONFIG_SND_RME32 is not set
# CONFIG_SND_RME96 is not set
# CONFIG_SND_RME9652 is not set
# CONFIG_SND_HDSP is not set
# CONFIG_SND_TRIDENT is not set
# CONFIG_SND_YMFPCI is not set
# CONFIG_SND_ALS4000 is not set
# CONFIG_SND_CMIPCI is not set
# CONFIG_SND_ENS1370 is not set
# CONFIG_SND_ENS1371 is not set
# CONFIG_SND_ES1938 is not set
# CONFIG_SND_ES1968 is not set
# CONFIG_SND_MAESTRO3 is not set
CONFIG_SND_FM801=y
CONFIG_SND_FM801_TEA575X=y
# CONFIG_SND_ICE1712 is not set
# CONFIG_SND_ICE1724 is not set
# CONFIG_SND_INTEL8X0 is not set
# CONFIG_SND_INTEL8X0M is not set
# CONFIG_SND_SONICVIBES is not set
# CONFIG_SND_VIA82XX is not set
# CONFIG_SND_VX222 is not set
#
# USB devices
#
# CONFIG_SND_USB_AUDIO is not set
# CONFIG_SND_USB_USX2Y is not set
#
# Open Sound System
#
# CONFIG_SOUND_PRIME is not set
#
# USB support
...
...
@@ -779,6 +920,8 @@ CONFIG_USB_BANDWIDTH=y
# CONFIG_USB_DYNAMIC_MINORS is not set
# CONFIG_USB_SUSPEND is not set
# CONFIG_USB_OTG is not set
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
#
# USB Host Controller Drivers
...
...
@@ -788,13 +931,20 @@ CONFIG_USB_EHCI_HCD=y
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_UHCI_HCD=y
# CONFIG_USB_SL811_HCD is not set
#
# USB Device Class drivers
#
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_BLUETOOTH_TTY is not set
# CONFIG_USB_MIDI is not set
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
#
CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_RW_DETECT is not set
...
...
@@ -808,7 +958,7 @@ CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_JUMPSHOT is not set
#
# USB
Human Interface Devices (HID)
# USB
Input Devices
#
CONFIG_USB_HID=y
CONFIG_USB_HIDINPUT=y
...
...
@@ -834,13 +984,17 @@ CONFIG_USB_HIDDEV=y
# USB Multimedia devices
#
# CONFIG_USB_DABUSB is not set
# CONFIG_USB_VICAM is not set
# CONFIG_USB_DSBR is not set
# CONFIG_USB_IBMCAM is not set
# CONFIG_USB_KONICAWC is not set
# CONFIG_USB_OV511 is not set
# CONFIG_USB_SE401 is not set
# CONFIG_USB_SN9C102 is not set
# CONFIG_USB_STV680 is not set
#
# Video4Linux support is needed for USB Multimedia device support
#
#
# USB Network adaptors
# USB Network Adapters
#
# CONFIG_USB_CATC is not set
# CONFIG_USB_KAWETH is not set
...
...
@@ -869,13 +1023,23 @@ CONFIG_USB_HIDDEV=y
# CONFIG_USB_LCD is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_PHIDGETKIT is not set
# CONFIG_USB_PHIDGETSERVO is not set
#
# USB ATM/DSL drivers
#
#
# USB Gadget Support
#
# CONFIG_USB_GADGET is not set
#
# MMC/SD Card support
#
# CONFIG_MMC is not set
#
# File systems
#
...
...
@@ -896,6 +1060,7 @@ CONFIG_FS_MBCACHE=y
# CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set
# CONFIG_QUOTA is not set
CONFIG_DNOTIFY=y
CONFIG_AUTOFS_FS=y
# CONFIG_AUTOFS4_FS is not set
...
...
@@ -927,6 +1092,8 @@ CONFIG_SYSFS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVPTS_FS_XATTR is not set
CONFIG_TMPFS=y
CONFIG_TMPFS_XATTR=y
CONFIG_TMPFS_SECURITY=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
...
...
@@ -1053,9 +1220,11 @@ CONFIG_CRC32=y
#
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y
# CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_INFO is not set
CONFIG_IA64_GRANULE_16MB=y
# CONFIG_IA64_GRANULE_64MB is not set
...
...
@@ -1068,6 +1237,7 @@ CONFIG_SYSVIPC_COMPAT=y
#
# Security options
#
# CONFIG_KEYS is not set
# CONFIG_SECURITY is not set
#
...
...
@@ -1081,7 +1251,7 @@ CONFIG_CRYPTO_MD5=y
# CONFIG_CRYPTO_SHA1 is not set
# CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set
# CONFIG_CRYPTO_W
HIRLPOOL
is not set
# CONFIG_CRYPTO_W
P512
is not set
CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_TWOFISH is not set
...
...
@@ -1092,7 +1262,12 @@ CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_ARC4 is not set
# CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_ANUBIS is not set
# CONFIG_CRYPTO_DEFLATE is not set
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_TEST is not set
#
# Hardware crypto devices
#
arch/ia64/kernel/irq_ia64.c
View file @
6da2b234
...
...
@@ -119,7 +119,7 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs)
* switched atomically.
*/
bsp
=
ia64_getreg
(
_IA64_REG_AR_BSP
);
sp
=
ia64_getreg
(
_IA64_REG_
AR_
SP
);
sp
=
ia64_getreg
(
_IA64_REG_SP
);
if
((
sp
-
bsp
)
<
1024
)
{
static
unsigned
char
count
;
...
...
arch/ia64/kernel/perfmon.c
View file @
6da2b234
...
...
@@ -2160,9 +2160,7 @@ pfm_alloc_fd(struct file **cfile)
DPRINT
((
"new inode ino=%ld @%p
\n
"
,
inode
->
i_ino
,
inode
));
inode
->
i_sb
=
pfmfs_mnt
->
mnt_sb
;
inode
->
i_mode
=
S_IFCHR
|
S_IRUGO
;
inode
->
i_sock
=
0
;
inode
->
i_uid
=
current
->
fsuid
;
inode
->
i_gid
=
current
->
fsgid
;
...
...
arch/ia64/lib/io.c
View file @
6da2b234
...
...
@@ -8,8 +8,7 @@
* Copy data from IO memory space to "real" memory space.
* This needs to be optimized.
*/
void
__ia64_memcpy_fromio
(
void
*
to
,
volatile
void
__iomem
*
from
,
long
count
)
void
memcpy_fromio
(
void
*
to
,
const
volatile
void
__iomem
*
from
,
long
count
)
{
char
*
dst
=
to
;
...
...
@@ -18,30 +17,28 @@ __ia64_memcpy_fromio (void *to, volatile void __iomem *from, long count)
*
dst
++
=
readb
(
from
++
);
}
}
EXPORT_SYMBOL
(
__ia64_
memcpy_fromio
);
EXPORT_SYMBOL
(
memcpy_fromio
);
/*
* Copy data from "real" memory space to IO memory space.
* This needs to be optimized.
*/
void
__ia64_memcpy_toio
(
volatile
void
__iomem
*
to
,
void
*
from
,
long
count
)
void
memcpy_toio
(
volatile
void
__iomem
*
to
,
const
void
*
from
,
long
count
)
{
char
*
src
=
from
;
c
onst
c
har
*
src
=
from
;
while
(
count
)
{
count
--
;
writeb
(
*
src
++
,
to
++
);
}
}
EXPORT_SYMBOL
(
__ia64_
memcpy_toio
);
EXPORT_SYMBOL
(
memcpy_toio
);
/*
* "memset" on IO memory space.
* This needs to be optimized.
*/
void
__ia64_memset_c_io
(
volatile
void
__iomem
*
dst
,
unsigned
long
c
,
long
count
)
void
memset_io
(
volatile
void
__iomem
*
dst
,
int
c
,
long
count
)
{
unsigned
char
ch
=
(
char
)(
c
&
0xff
);
...
...
@@ -51,7 +48,7 @@ __ia64_memset_c_io (volatile void __iomem *dst, unsigned long c, long count)
dst
++
;
}
}
EXPORT_SYMBOL
(
__ia64_memset_c
_io
);
EXPORT_SYMBOL
(
memset
_io
);
#ifdef CONFIG_IA64_GENERIC
...
...
arch/ia64/lib/swiotlb.c
View file @
6da2b234
...
...
@@ -44,41 +44,44 @@
#define IO_TLB_SEGSIZE 128
/*
* log of the size of each IO TLB slab. The number of slabs is command line controllable.
* log of the size of each IO TLB slab. The number of slabs is command line
* controllable.
*/
#define IO_TLB_SHIFT 11
int
swiotlb_force
;
/*
* Used to do a quick range check in swiotlb_unmap_single and swiotlb_sync_single_*, to see
* if the memory was in fact allocated by this API.
* Used to do a quick range check in swiotlb_unmap_single and
* swiotlb_sync_single_*, to see if the memory was in fact allocated by this
* API.
*/
static
char
*
io_tlb_start
,
*
io_tlb_end
;
/*
* The number of IO TLB blocks (in groups of 64) betweeen io_tlb_start and
io_tlb_end.
* This is command line adjustable via setup_io_tlb_npages.
* The number of IO TLB blocks (in groups of 64) betweeen io_tlb_start and
*
io_tlb_end.
This is command line adjustable via setup_io_tlb_npages.
* Default to 64MB.
*/
static
unsigned
long
io_tlb_nslabs
=
32768
;
/*
/*
* When the IOMMU overflows we return a fallback buffer. This sets the size.
*/
static
unsigned
long
io_tlb_overflow
=
32
*
1024
;
void
*
io_tlb_overflow_buffer
;
void
*
io_tlb_overflow_buffer
;
/*
* This is a free list describing the number of free entries available from each index
* This is a free list describing the number of free entries available from
* each index
*/
static
unsigned
int
*
io_tlb_list
;
static
unsigned
int
io_tlb_index
;
/*
* We need to save away the original address corresponding to a mapped entry
for the sync
* operations.
* We need to save away the original address corresponding to a mapped entry
*
for the sync
operations.
*/
static
unsigned
char
**
io_tlb_orig_addr
;
...
...
@@ -88,10 +91,11 @@ static unsigned char **io_tlb_orig_addr;
static
spinlock_t
io_tlb_lock
=
SPIN_LOCK_UNLOCKED
;
static
int
__init
setup_io_tlb_npages
(
char
*
str
)
setup_io_tlb_npages
(
char
*
str
)
{
if
(
isdigit
(
*
str
))
{
io_tlb_nslabs
=
simple_strtoul
(
str
,
&
str
,
0
)
<<
(
PAGE_SHIFT
-
IO_TLB_SHIFT
);
if
(
isdigit
(
*
str
))
{
io_tlb_nslabs
=
simple_strtoul
(
str
,
&
str
,
0
)
<<
(
PAGE_SHIFT
-
IO_TLB_SHIFT
);
/* avoid tail segment of size < IO_TLB_SEGSIZE */
io_tlb_nslabs
=
ALIGN
(
io_tlb_nslabs
,
IO_TLB_SEGSIZE
);
}
...
...
@@ -105,18 +109,19 @@ __setup("swiotlb=", setup_io_tlb_npages);
/* make io_tlb_overflow tunable too? */
/*
* Statically reserve bounce buffer space and initialize bounce buffer data
structures for
* the software IO TLB used to implement the PCI DMA API.
* Statically reserve bounce buffer space and initialize bounce buffer data
*
structures for
the software IO TLB used to implement the PCI DMA API.
*/
void
swiotlb_init
(
void
)
swiotlb_init
(
void
)
{
unsigned
long
i
;
/*
* Get IO TLB memory from the low pages
*/
io_tlb_start
=
alloc_bootmem_low_pages
(
io_tlb_nslabs
*
(
1
<<
IO_TLB_SHIFT
));
io_tlb_start
=
alloc_bootmem_low_pages
(
io_tlb_nslabs
*
(
1
<<
IO_TLB_SHIFT
));
if
(
!
io_tlb_start
)
panic
(
"Cannot allocate SWIOTLB buffer"
);
io_tlb_end
=
io_tlb_start
+
io_tlb_nslabs
*
(
1
<<
IO_TLB_SHIFT
);
...
...
@@ -131,28 +136,30 @@ swiotlb_init (void)
io_tlb_list
[
i
]
=
IO_TLB_SEGSIZE
-
OFFSET
(
i
,
IO_TLB_SEGSIZE
);
io_tlb_index
=
0
;
io_tlb_orig_addr
=
alloc_bootmem
(
io_tlb_nslabs
*
sizeof
(
char
*
));
/*
* Get the overflow emergency buffer
/*
* Get the overflow emergency buffer
*/
io_tlb_overflow_buffer
=
alloc_bootmem_low
(
io_tlb_overflow
);
io_tlb_overflow_buffer
=
alloc_bootmem_low
(
io_tlb_overflow
);
printk
(
KERN_INFO
"Placing software IO TLB between 0x%lx - 0x%lx
\n
"
,
virt_to_phys
(
io_tlb_start
),
virt_to_phys
(
io_tlb_end
));
}
static
inline
int
address_needs_mapping
(
struct
device
*
hwdev
,
dma_addr_t
addr
)
{
dma_addr_t
mask
=
0xffffffff
;
if
(
hwdev
&&
hwdev
->
dma_mask
)
mask
=
*
hwdev
->
dma_mask
;
return
(
addr
&
~
mask
)
!=
0
;
}
static
inline
int
address_needs_mapping
(
struct
device
*
hwdev
,
dma_addr_t
addr
)
{
dma_addr_t
mask
=
0xffffffff
;
/* If the device has a mask, use it, otherwise default to 32 bits */
if
(
hwdev
&&
hwdev
->
dma_mask
)
mask
=
*
hwdev
->
dma_mask
;
return
(
addr
&
~
mask
)
!=
0
;
}
/*
* Allocates bounce buffer and returns its kernel virtual address.
*/
static
void
*
map_single
(
struct
device
*
hwdev
,
char
*
buffer
,
size_t
size
,
int
dir
)
map_single
(
struct
device
*
hwdev
,
char
*
buffer
,
size_t
size
,
int
dir
)
{
unsigned
long
flags
;
char
*
dma_addr
;
...
...
@@ -160,11 +167,11 @@ map_single (struct device *hwdev, char *buffer, size_t size, int dir)
int
i
;
/*
* For mappings greater than a page
size, we limit the stride (and hence alignment)
* to a page size.
* For mappings greater than a page
, we limit the stride (and
*
hence alignment)
to a page size.
*/
nslots
=
ALIGN
(
size
,
1
<<
IO_TLB_SHIFT
)
>>
IO_TLB_SHIFT
;
if
(
size
>
(
1
<<
PAGE_SHIFT
)
)
if
(
size
>
PAGE_SIZE
)
stride
=
(
1
<<
(
PAGE_SHIFT
-
IO_TLB_SHIFT
));
else
stride
=
1
;
...
...
@@ -173,8 +180,8 @@ map_single (struct device *hwdev, char *buffer, size_t size, int dir)
BUG
();
/*
* Find suitable number of IO TLB entries size that will fit this
request and
* allocate a buffer from that IO TLB pool.
* Find suitable number of IO TLB entries size that will fit this
*
request and
allocate a buffer from that IO TLB pool.
*/
spin_lock_irqsave
(
&
io_tlb_lock
,
flags
);
{
...
...
@@ -185,22 +192,23 @@ map_single (struct device *hwdev, char *buffer, size_t size, int dir)
do
{
/*
* If we find a slot that indicates we have 'nslots' number of
* contiguous buffers, we allocate the buffers from that slot and
* mark the entries as '0' indicating unavailable.
* If we find a slot that indicates we have 'nslots'
* number of contiguous buffers, we allocate the
* buffers from that slot and mark the entries as '0'
* indicating unavailable.
*/
if
(
io_tlb_list
[
index
]
>=
nslots
)
{
int
count
=
0
;
for
(
i
=
index
;
i
<
(
int
)
(
index
+
nslots
);
i
++
)
io_tlb_list
[
i
]
=
0
;
for
(
i
=
index
-
1
;
(
OFFSET
(
i
,
IO_TLB_SEGSIZE
)
!=
IO_TLB_SEGSIZE
-
1
)
&&
io_tlb_list
[
i
];
i
--
)
for
(
i
=
index
-
1
;
(
OFFSET
(
i
,
IO_TLB_SEGSIZE
)
!=
IO_TLB_SEGSIZE
-
1
)
&&
io_tlb_list
[
i
];
i
--
)
io_tlb_list
[
i
]
=
++
count
;
dma_addr
=
io_tlb_start
+
(
index
<<
IO_TLB_SHIFT
);
/*
* Update the indices to avoid searching in the next round.
* Update the indices to avoid searching in
* the next round.
*/
io_tlb_index
=
((
index
+
nslots
)
<
io_tlb_nslabs
?
(
index
+
nslots
)
:
0
);
...
...
@@ -219,8 +227,9 @@ map_single (struct device *hwdev, char *buffer, size_t size, int dir)
spin_unlock_irqrestore
(
&
io_tlb_lock
,
flags
);
/*
* Save away the mapping from the original address to the DMA address. This is
* needed when we sync the memory. Then we sync the buffer if needed.
* Save away the mapping from the original address to the DMA address.
* This is needed when we sync the memory. Then we sync the buffer if
* needed.
*/
io_tlb_orig_addr
[
index
]
=
buffer
;
if
(
dir
==
DMA_TO_DEVICE
||
dir
==
DMA_BIDIRECTIONAL
)
...
...
@@ -233,52 +242,51 @@ map_single (struct device *hwdev, char *buffer, size_t size, int dir)
* dma_addr is the kernel virtual address of the bounce buffer to unmap.
*/
static
void
unmap_single
(
struct
device
*
hwdev
,
char
*
dma_addr
,
size_t
size
,
int
dir
)
unmap_single
(
struct
device
*
hwdev
,
char
*
dma_addr
,
size_t
size
,
int
dir
)
{
unsigned
long
flags
;
int
i
,
nslots
=
ALIGN
(
size
,
1
<<
IO_TLB_SHIFT
)
>>
IO_TLB_SHIFT
;
int
i
,
count
,
nslots
=
ALIGN
(
size
,
1
<<
IO_TLB_SHIFT
)
>>
IO_TLB_SHIFT
;
int
index
=
(
dma_addr
-
io_tlb_start
)
>>
IO_TLB_SHIFT
;
char
*
buffer
=
io_tlb_orig_addr
[
index
];
/*
* First, sync the memory before unmapping the entry
*/
if
(
(
dir
==
DMA_FROM_DEVICE
)
||
(
dir
==
DMA_BIDIRECTIONAL
))
if
(
buffer
&&
((
dir
==
DMA_FROM_DEVICE
)
||
(
dir
==
DMA_BIDIRECTIONAL
)
))
/*
* bounce... copy the data back into the original buffer * and
delete the
* bounce buffer.
* bounce... copy the data back into the original buffer * and
*
delete the
bounce buffer.
*/
memcpy
(
buffer
,
dma_addr
,
size
);
/*
* Return the buffer to the free list by setting the corresponding
entries to
*
indicate the number of contigous entries available. While returning the
*
entries to the free list, we merge the entries with slots below and above the
* pool being returned.
* Return the buffer to the free list by setting the corresponding
*
entries to indicate the number of contigous entries available.
*
While returning the entries to the free list, we merge the entries
*
with slots below and above the
pool being returned.
*/
spin_lock_irqsave
(
&
io_tlb_lock
,
flags
);
{
int
count
=
((
index
+
nslots
)
<
ALIGN
(
index
+
1
,
IO_TLB_SEGSIZE
)
?
io_tlb_list
[
index
+
nslots
]
:
0
);
count
=
((
index
+
nslots
)
<
ALIGN
(
index
+
1
,
IO_TLB_SEGSIZE
)
?
io_tlb_list
[
index
+
nslots
]
:
0
);
/*
* Step 1: return the slots to the free list, merging the
slots with
* superceeding slots
* Step 1: return the slots to the free list, merging the
* s
lots with s
uperceeding slots
*/
for
(
i
=
index
+
nslots
-
1
;
i
>=
index
;
i
--
)
io_tlb_list
[
i
]
=
++
count
;
/*
* Step 2: merge the returned slots with the preceding slots,
if
* available (non zero)
* Step 2: merge the returned slots with the preceding slots,
*
if
available (non zero)
*/
for
(
i
=
index
-
1
;
(
OFFSET
(
i
,
IO_TLB_SEGSIZE
)
!=
IO_TLB_SEGSIZE
-
1
)
&&
io_tlb_list
[
i
];
i
--
)
for
(
i
=
index
-
1
;
(
OFFSET
(
i
,
IO_TLB_SEGSIZE
)
!=
IO_TLB_SEGSIZE
-
1
)
&&
io_tlb_list
[
i
];
i
--
)
io_tlb_list
[
i
]
=
++
count
;
}
spin_unlock_irqrestore
(
&
io_tlb_lock
,
flags
);
}
static
void
sync_single
(
struct
device
*
hwdev
,
char
*
dma_addr
,
size_t
size
,
int
dir
)
sync_single
(
struct
device
*
hwdev
,
char
*
dma_addr
,
size_t
size
,
int
dir
)
{
int
index
=
(
dma_addr
-
io_tlb_start
)
>>
IO_TLB_SHIFT
;
char
*
buffer
=
io_tlb_orig_addr
[
index
];
...
...
@@ -296,17 +304,36 @@ sync_single (struct device *hwdev, char *dma_addr, size_t size, int dir)
}
void
*
swiotlb_alloc_coherent
(
struct
device
*
hwdev
,
size_t
size
,
dma_addr_t
*
dma_handle
,
int
flags
)
swiotlb_alloc_coherent
(
struct
device
*
hwdev
,
size_t
size
,
dma_addr_t
*
dma_handle
,
int
flags
)
{
unsigned
long
dev_addr
;
void
*
ret
;
int
order
=
get_order
(
size
);
/* XXX fix me: the DMA API should pass us an explicit DMA mask instead: */
/*
* XXX fix me: the DMA API should pass us an explicit DMA mask
* instead, or use ZONE_DMA32 (ia64 overloads ZONE_DMA to be a ~32
* bit range instead of a 16MB one).
*/
flags
|=
GFP_DMA
;
ret
=
(
void
*
)
__get_free_pages
(
flags
,
get_order
(
size
));
ret
=
(
void
*
)
__get_free_pages
(
flags
,
order
);
if
(
ret
&&
address_needs_mapping
(
hwdev
,
virt_to_phys
(
ret
)))
{
/*
* The allocated memory isn't reachable by the device.
* Fall back on swiotlb_map_single().
*/
free_pages
((
unsigned
long
)
ret
,
order
);
ret
=
NULL
;
}
if
(
!
ret
)
{
/* DMA_FROM_DEVICE is to avoid the memcpy in map_single */
/*
* We are either out of memory or the device can't DMA
* to GFP_DMA memory; fall back on
* swiotlb_map_single(), which will grab memory from
* the lowest available address range.
*/
dma_addr_t
handle
;
handle
=
swiotlb_map_single
(
NULL
,
NULL
,
size
,
DMA_FROM_DEVICE
);
if
(
dma_mapping_error
(
handle
))
...
...
@@ -317,14 +344,21 @@ swiotlb_alloc_coherent (struct device *hwdev, size_t size, dma_addr_t *dma_handl
memset
(
ret
,
0
,
size
);
dev_addr
=
virt_to_phys
(
ret
);
if
(
address_needs_mapping
(
hwdev
,
dev_addr
))
panic
(
"swiotlb_alloc_consistent: allocated memory is out of range for device"
);
/* Confirm address can be DMA'd by device */
if
(
address_needs_mapping
(
hwdev
,
dev_addr
))
{
printk
(
"hwdev DMA mask = 0x%016lx, dev_addr = 0x%016lx
\n
"
,
*
hwdev
->
dma_mask
,
dev_addr
);
panic
(
"swiotlb_alloc_coherent: allocated memory is out of "
"range for device"
);
}
*
dma_handle
=
dev_addr
;
return
ret
;
}
void
swiotlb_free_coherent
(
struct
device
*
hwdev
,
size_t
size
,
void
*
vaddr
,
dma_addr_t
dma_handle
)
swiotlb_free_coherent
(
struct
device
*
hwdev
,
size_t
size
,
void
*
vaddr
,
dma_addr_t
dma_handle
)
{
if
(
!
(
vaddr
>=
(
void
*
)
io_tlb_start
&&
vaddr
<
(
void
*
)
io_tlb_end
))
...
...
@@ -334,66 +368,63 @@ swiotlb_free_coherent (struct device *hwdev, size_t size, void *vaddr, dma_addr_
swiotlb_unmap_single
(
hwdev
,
dma_handle
,
size
,
DMA_TO_DEVICE
);
}
static
void
swiotlb_full
(
struct
device
*
dev
,
size_t
size
,
int
dir
,
int
do_panic
)
static
void
swiotlb_full
(
struct
device
*
dev
,
size_t
size
,
int
dir
,
int
do_panic
)
{
/*
/*
* Ran out of IOMMU space for this operation. This is very bad.
* Unfortunately the drivers cannot handle this operation properly.
* unless they check for pci_dma_mapping_error (most don't)
* When the mapping is small enough return a static buffer to limit
* the damage, or panic when the transfer is too big.
*/
printk
(
KERN_ERR
"PCI-DMA: Out of SW-IOMMU space for %lu bytes at device %s
\n
"
,
size
,
dev
?
dev
->
bus_id
:
"?"
);
* the damage, or panic when the transfer is too big.
*/
printk
(
KERN_ERR
"PCI-DMA: Out of SW-IOMMU space for %lu bytes at "
"device %s
\n
"
,
size
,
dev
?
dev
->
bus_id
:
"?"
);
if
(
size
>
io_tlb_overflow
&&
do_panic
)
{
if
(
dir
==
PCI_DMA_FROMDEVICE
||
dir
==
PCI_DMA_BIDIRECTIONAL
)
panic
(
"PCI-DMA: Memory would be corrupted
\n
"
);
if
(
dir
==
PCI_DMA_TODEVICE
||
dir
==
PCI_DMA_BIDIRECTIONAL
)
panic
(
"PCI-DMA: Random memory would be DMAed
\n
"
);
}
}
if
(
dir
==
PCI_DMA_TODEVICE
||
dir
==
PCI_DMA_BIDIRECTIONAL
)
panic
(
"PCI-DMA: Random memory would be DMAed
\n
"
);
}
}
/*
* Map a single buffer of the indicated size for DMA in streaming mode. The
PCI address
* to use is returned.
* Map a single buffer of the indicated size for DMA in streaming mode. The
*
PCI address
to use is returned.
*
* Once the device is given the dma address, the device owns this memory until
either
* swiotlb_unmap_single or swiotlb_dma_sync_single is performed.
* Once the device is given the dma address, the device owns this memory until
*
either
swiotlb_unmap_single or swiotlb_dma_sync_single is performed.
*/
dma_addr_t
swiotlb_map_single
(
struct
device
*
hwdev
,
void
*
ptr
,
size_t
size
,
int
dir
)
swiotlb_map_single
(
struct
device
*
hwdev
,
void
*
ptr
,
size_t
size
,
int
dir
)
{
unsigned
long
dev_addr
=
virt_to_phys
(
ptr
);
void
*
map
;
void
*
map
;
if
(
dir
==
DMA_NONE
)
BUG
();
/*
* Check if the PCI device can DMA to ptr... if so, just return ptr
* If the pointer passed in happens to be in the device's DMA window,
* we can safely return the device addr and not worry about bounce
* buffering it.
*/
if
(
!
address_needs_mapping
(
hwdev
,
dev_addr
)
&&
!
swiotlb_force
)
/*
* Device is bit capable of DMA'ing to the buffer... just return the PCI
* address of ptr
*/
if
(
!
address_needs_mapping
(
hwdev
,
dev_addr
)
&&
!
swiotlb_force
)
return
dev_addr
;
/*
*
get a bounce buffer:
*
Oh well, have to allocate and map a bounce buffer.
*/
map
=
map_single
(
hwdev
,
ptr
,
size
,
dir
);
if
(
!
map
)
{
swiotlb_full
(
hwdev
,
size
,
dir
,
1
);
map
=
io_tlb_overflow_buffer
;
if
(
!
map
)
{
swiotlb_full
(
hwdev
,
size
,
dir
,
1
);
map
=
io_tlb_overflow_buffer
;
}
dev_addr
=
virt_to_phys
(
map
);
/*
* Ensure that the address returned is DMA'ble
:
* Ensure that the address returned is DMA'ble
*/
if
(
address_needs_mapping
(
hwdev
,
dev_addr
))
panic
(
"map_single: bounce buffer is not DMA'ble"
);
...
...
@@ -407,7 +438,7 @@ swiotlb_map_single (struct device *hwdev, void *ptr, size_t size, int dir)
* flush them when they get mapped into an executable vm-area.
*/
static
void
mark_clean
(
void
*
addr
,
size_t
size
)
mark_clean
(
void
*
addr
,
size_t
size
)
{
unsigned
long
pg_addr
,
end
;
...
...
@@ -421,15 +452,16 @@ mark_clean (void *addr, size_t size)
}
/*
* Unmap a single streaming mode DMA translation. The dma_addr and size must
match what
*
was provided for in a previous swiotlb_map_single call. All other usages are
* undefined.
* Unmap a single streaming mode DMA translation. The dma_addr and size must
*
match what was provided for in a previous swiotlb_map_single call. All
*
other usages are
undefined.
*
* After this call, reads by the cpu to the buffer are guaranteed to see
whatever the
* device wrote there.
* After this call, reads by the cpu to the buffer are guaranteed to see
*
whatever the
device wrote there.
*/
void
swiotlb_unmap_single
(
struct
device
*
hwdev
,
dma_addr_t
dev_addr
,
size_t
size
,
int
dir
)
swiotlb_unmap_single
(
struct
device
*
hwdev
,
dma_addr_t
dev_addr
,
size_t
size
,
int
dir
)
{
char
*
dma_addr
=
phys_to_virt
(
dev_addr
);
...
...
@@ -442,16 +474,18 @@ swiotlb_unmap_single (struct device *hwdev, dma_addr_t dev_addr, size_t size, in
}
/*
* Make physical memory consistent for a single streaming mode DMA translation
after a
* transfer.
* Make physical memory consistent for a single streaming mode DMA translation
*
after a
transfer.
*
* If you perform a swiotlb_map_single() but wish to interrogate the buffer using the cpu,
* yet do not wish to teardown the PCI dma mapping, you must call this function before
* doing so. At the next point you give the PCI dma address back to the card, you must
* first perform a swiotlb_dma_sync_for_device, and then the device again owns the buffer
* If you perform a swiotlb_map_single() but wish to interrogate the buffer
* using the cpu, yet do not wish to teardown the PCI dma mapping, you must
* call this function before doing so. At the next point you give the PCI dma
* address back to the card, you must first perform a
* swiotlb_dma_sync_for_device, and then the device again owns the buffer
*/
void
swiotlb_sync_single_for_cpu
(
struct
device
*
hwdev
,
dma_addr_t
dev_addr
,
size_t
size
,
int
dir
)
swiotlb_sync_single_for_cpu
(
struct
device
*
hwdev
,
dma_addr_t
dev_addr
,
size_t
size
,
int
dir
)
{
char
*
dma_addr
=
phys_to_virt
(
dev_addr
);
...
...
@@ -464,7 +498,8 @@ swiotlb_sync_single_for_cpu (struct device *hwdev, dma_addr_t dev_addr, size_t s
}
void
swiotlb_sync_single_for_device
(
struct
device
*
hwdev
,
dma_addr_t
dev_addr
,
size_t
size
,
int
dir
)
swiotlb_sync_single_for_device
(
struct
device
*
hwdev
,
dma_addr_t
dev_addr
,
size_t
size
,
int
dir
)
{
char
*
dma_addr
=
phys_to_virt
(
dev_addr
);
...
...
@@ -477,10 +512,11 @@ swiotlb_sync_single_for_device (struct device *hwdev, dma_addr_t dev_addr, size_
}
/*
* Map a set of buffers described by scatterlist in streaming mode for DMA. This is the
* scatter-gather version of the above swiotlb_map_single interface. Here the scatter
* gather list elements are each tagged with the appropriate dma address and length. They
* are obtained via sg_dma_{address,length}(SG).
* Map a set of buffers described by scatterlist in streaming mode for DMA.
* This is the scatter-gather version of the above swiotlb_map_single
* interface. Here the scatter gather list elements are each tagged with the
* appropriate dma address and length. They are obtained via
* sg_dma_{address,length}(SG).
*
* NOTE: An implementation may be able to use a smaller number of
* DMA address/length pairs than there are SG table elements.
...
...
@@ -488,10 +524,12 @@ swiotlb_sync_single_for_device (struct device *hwdev, dma_addr_t dev_addr, size_
* The routine returns the number of addr/length pairs actually
* used, at most nents.
*
* Device ownership issues as mentioned above for swiotlb_map_single are the same here.
* Device ownership issues as mentioned above for swiotlb_map_single are the
* same here.
*/
int
swiotlb_map_sg
(
struct
device
*
hwdev
,
struct
scatterlist
*
sg
,
int
nelems
,
int
dir
)
swiotlb_map_sg
(
struct
device
*
hwdev
,
struct
scatterlist
*
sg
,
int
nelems
,
int
dir
)
{
void
*
addr
;
unsigned
long
dev_addr
;
...
...
@@ -506,9 +544,9 @@ swiotlb_map_sg (struct device *hwdev, struct scatterlist *sg, int nelems, int di
if
(
swiotlb_force
||
address_needs_mapping
(
hwdev
,
dev_addr
))
{
sg
->
dma_address
=
(
dma_addr_t
)
virt_to_phys
(
map_single
(
hwdev
,
addr
,
sg
->
length
,
dir
));
if
(
!
sg
->
dma_address
)
{
/* Don't panic here, we expect
pci_
map_sg users
/* Don't panic here, we expect map_sg users
to do proper error handling. */
swiotlb_full
(
hwdev
,
sg
->
length
,
dir
,
0
);
swiotlb_full
(
hwdev
,
sg
->
length
,
dir
,
0
);
swiotlb_unmap_sg
(
hwdev
,
sg
-
i
,
i
,
dir
);
sg
[
0
].
dma_length
=
0
;
return
0
;
...
...
@@ -521,11 +559,12 @@ swiotlb_map_sg (struct device *hwdev, struct scatterlist *sg, int nelems, int di
}
/*
* Unmap a set of streaming mode DMA translations. Again, cpu read rules
concerning calls
* here are the same as for swiotlb_unmap_single() above.
* Unmap a set of streaming mode DMA translations. Again, cpu read rules
*
concerning calls
here are the same as for swiotlb_unmap_single() above.
*/
void
swiotlb_unmap_sg
(
struct
device
*
hwdev
,
struct
scatterlist
*
sg
,
int
nelems
,
int
dir
)
swiotlb_unmap_sg
(
struct
device
*
hwdev
,
struct
scatterlist
*
sg
,
int
nelems
,
int
dir
)
{
int
i
;
...
...
@@ -540,14 +579,15 @@ swiotlb_unmap_sg (struct device *hwdev, struct scatterlist *sg, int nelems, int
}
/*
* Make physical memory consistent for a set of streaming mode DMA translations
after a
* transfer.
* Make physical memory consistent for a set of streaming mode DMA translations
*
after a
transfer.
*
* The same as swiotlb_sync_single_* but for a scatter-gather list, same rules
and
* usage.
* The same as swiotlb_sync_single_* but for a scatter-gather list, same rules
*
and
usage.
*/
void
swiotlb_sync_sg_for_cpu
(
struct
device
*
hwdev
,
struct
scatterlist
*
sg
,
int
nelems
,
int
dir
)
swiotlb_sync_sg_for_cpu
(
struct
device
*
hwdev
,
struct
scatterlist
*
sg
,
int
nelems
,
int
dir
)
{
int
i
;
...
...
@@ -556,11 +596,13 @@ swiotlb_sync_sg_for_cpu (struct device *hwdev, struct scatterlist *sg, int nelem
for
(
i
=
0
;
i
<
nelems
;
i
++
,
sg
++
)
if
(
sg
->
dma_address
!=
SG_ENT_PHYS_ADDRESS
(
sg
))
sync_single
(
hwdev
,
(
void
*
)
sg
->
dma_address
,
sg
->
dma_length
,
dir
);
sync_single
(
hwdev
,
(
void
*
)
sg
->
dma_address
,
sg
->
dma_length
,
dir
);
}
void
swiotlb_sync_sg_for_device
(
struct
device
*
hwdev
,
struct
scatterlist
*
sg
,
int
nelems
,
int
dir
)
swiotlb_sync_sg_for_device
(
struct
device
*
hwdev
,
struct
scatterlist
*
sg
,
int
nelems
,
int
dir
)
{
int
i
;
...
...
@@ -569,24 +611,26 @@ swiotlb_sync_sg_for_device (struct device *hwdev, struct scatterlist *sg, int ne
for
(
i
=
0
;
i
<
nelems
;
i
++
,
sg
++
)
if
(
sg
->
dma_address
!=
SG_ENT_PHYS_ADDRESS
(
sg
))
sync_single
(
hwdev
,
(
void
*
)
sg
->
dma_address
,
sg
->
dma_length
,
dir
);
sync_single
(
hwdev
,
(
void
*
)
sg
->
dma_address
,
sg
->
dma_length
,
dir
);
}
int
swiotlb_dma_mapping_error
(
dma_addr_t
dma_addr
)
swiotlb_dma_mapping_error
(
dma_addr_t
dma_addr
)
{
return
(
dma_addr
==
virt_to_phys
(
io_tlb_overflow_buffer
));
}
/*
* Return whether the given PCI device DMA address mask can be supported properly. For
* example, if your device can only drive the low 24-bits during PCI bus mastering, then
* you would pass 0x00ffffff as the mask to this function.
* Return whether the given PCI device DMA address mask can be supported
* properly. For example, if your device can only drive the low 24-bits
* during PCI bus mastering, then you would pass 0x00ffffff as the mask to
* this function.
*/
int
swiotlb_dma_supported
(
struct
device
*
hwdev
,
u64
mask
)
{
return
1
;
return
(
virt_to_phys
(
io_tlb_end
)
-
1
)
<=
mask
;
}
EXPORT_SYMBOL
(
swiotlb_init
);
...
...
arch/ia64/mm/contig.c
View file @
6da2b234
...
...
@@ -214,8 +214,8 @@ count_dma_pages (u64 start, u64 end, void *arg)
{
unsigned
long
*
count
=
arg
;
if
(
end
<=
MAX_DMA_ADDRESS
)
*
count
+=
(
end
-
start
)
>>
PAGE_SHIFT
;
if
(
start
<
MAX_DMA_ADDRESS
)
*
count
+=
(
min
(
end
,
MAX_DMA_ADDRESS
)
-
start
)
>>
PAGE_SHIFT
;
return
0
;
}
#endif
...
...
include/asm-ia64/io.h
View file @
6da2b234
...
...
@@ -447,14 +447,9 @@ iounmap (volatile void __iomem *addr)
/*
* String version of IO memory access ops:
*/
extern
void
__ia64_memcpy_fromio
(
void
*
,
volatile
void
__iomem
*
,
long
);
extern
void
__ia64_memcpy_toio
(
volatile
void
__iomem
*
,
void
*
,
long
);
extern
void
__ia64_memset_c_io
(
volatile
void
__iomem
*
,
unsigned
long
,
long
);
#define memcpy_fromio(to,from,len) __ia64_memcpy_fromio((to), (from),(len))
#define memcpy_toio(to,from,len) __ia64_memcpy_toio((to),(from),(len))
#define memset_io(addr,c,len) __ia64_memset_c_io((addr), 0x0101010101010101UL*(u8)(c), \
(len))
extern
void
memcpy_fromio
(
void
*
dst
,
const
volatile
void
__iomem
*
src
,
long
n
);
extern
void
memcpy_toio
(
volatile
void
__iomem
*
dst
,
const
void
*
src
,
long
n
);
extern
void
memset_io
(
volatile
void
__iomem
*
s
,
int
c
,
long
n
);
#define dma_cache_inv(_start,_size) do { } while (0)
#define dma_cache_wback(_start,_size) do { } while (0)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment