Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
39cf0518
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
39cf0518
编写于
8月 20, 2009
作者:
R
Rafael J. Wysocki
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into for-linus
上级
af15c1ad
6c30c53f
变更
59
隐藏空白更改
内联
并排
Showing
59 changed file
with
725 addition
and
460 deletion
+725
-460
Documentation/filesystems/afs.txt
Documentation/filesystems/afs.txt
+12
-14
Documentation/filesystems/proc.txt
Documentation/filesystems/proc.txt
+5
-10
MAINTAINERS
MAINTAINERS
+2
-1
REPORTING-BUGS
REPORTING-BUGS
+4
-1
arch/microblaze/configs/mmu_defconfig
arch/microblaze/configs/mmu_defconfig
+36
-34
arch/microblaze/configs/nommu_defconfig
arch/microblaze/configs/nommu_defconfig
+55
-36
arch/microblaze/include/asm/hardirq.h
arch/microblaze/include/asm/hardirq.h
+0
-2
arch/microblaze/kernel/intc.c
arch/microblaze/kernel/intc.c
+2
-0
arch/microblaze/kernel/irq.c
arch/microblaze/kernel/irq.c
+0
-9
arch/microblaze/kernel/syscall_table.S
arch/microblaze/kernel/syscall_table.S
+1
-1
arch/microblaze/kernel/timer.c
arch/microblaze/kernel/timer.c
+2
-0
arch/microblaze/mm/init.c
arch/microblaze/mm/init.c
+3
-3
arch/sparc/kernel/smp_64.c
arch/sparc/kernel/smp_64.c
+2
-2
arch/x86/include/asm/uv/uv_bau.h
arch/x86/include/asm/uv/uv_bau.h
+1
-1
arch/x86/kernel/apic/x2apic_uv_x.c
arch/x86/kernel/apic/x2apic_uv_x.c
+2
-2
arch/x86/kernel/cpu/mcheck/mce.c
arch/x86/kernel/cpu/mcheck/mce.c
+16
-3
arch/x86/kernel/cpu/mcheck/therm_throt.c
arch/x86/kernel/cpu/mcheck/therm_throt.c
+5
-2
arch/x86/kernel/setup_percpu.c
arch/x86/kernel/setup_percpu.c
+7
-7
arch/x86/kernel/tlb_uv.c
arch/x86/kernel/tlb_uv.c
+1
-0
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_crtc.c
+12
-28
drivers/gpu/drm/drm_edid.c
drivers/gpu/drm/drm_edid.c
+34
-38
drivers/gpu/drm/radeon/r100.c
drivers/gpu/drm/radeon/r100.c
+66
-20
drivers/gpu/drm/radeon/r300.c
drivers/gpu/drm/radeon/r300.c
+16
-22
drivers/gpu/drm/radeon/r500_reg.h
drivers/gpu/drm/radeon/r500_reg.h
+12
-4
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon.h
+46
-8
drivers/gpu/drm/radeon/radeon_asic.h
drivers/gpu/drm/radeon/radeon_asic.h
+19
-7
drivers/gpu/drm/radeon/radeon_combios.c
drivers/gpu/drm/radeon/radeon_combios.c
+19
-29
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_device.c
+3
-10
drivers/gpu/drm/radeon/radeon_fb.c
drivers/gpu/drm/radeon/radeon_fb.c
+2
-0
drivers/gpu/drm/radeon/radeon_gem.c
drivers/gpu/drm/radeon/radeon_gem.c
+21
-1
drivers/gpu/drm/radeon/radeon_irq_kms.c
drivers/gpu/drm/radeon/radeon_irq_kms.c
+0
-54
drivers/gpu/drm/radeon/radeon_kms.c
drivers/gpu/drm/radeon/radeon_kms.c
+28
-5
drivers/gpu/drm/radeon/radeon_legacy_crtc.c
drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+3
-4
drivers/gpu/drm/radeon/radeon_legacy_encoders.c
drivers/gpu/drm/radeon/radeon_legacy_encoders.c
+1
-0
drivers/gpu/drm/radeon/radeon_object.c
drivers/gpu/drm/radeon/radeon_object.c
+19
-0
drivers/gpu/drm/radeon/radeon_reg.h
drivers/gpu/drm/radeon/radeon_reg.h
+7
-4
drivers/gpu/drm/radeon/rs600.c
drivers/gpu/drm/radeon/rs600.c
+82
-0
drivers/gpu/drm/radeon/rs690.c
drivers/gpu/drm/radeon/rs690.c
+65
-0
drivers/gpu/drm/radeon/rv515.c
drivers/gpu/drm/radeon/rv515.c
+0
-19
drivers/spi/spi_s3c24xx.c
drivers/spi/spi_s3c24xx.c
+13
-10
fs/libfs.c
fs/libfs.c
+1
-1
fs/nilfs2/super.c
fs/nilfs2/super.c
+2
-0
fs/nilfs2/the_nilfs.h
fs/nilfs2/the_nilfs.h
+1
-1
fs/proc/base.c
fs/proc/base.c
+3
-16
include/drm/radeon_drm.h
include/drm/radeon_drm.h
+1
-1
include/linux/mm_types.h
include/linux/mm_types.h
+0
-2
include/linux/sched.h
include/linux/sched.h
+1
-0
init/main.c
init/main.c
+1
-1
kernel/fork.c
kernel/fork.c
+0
-1
kernel/perf_counter.c
kernel/perf_counter.c
+15
-0
mm/nommu.c
mm/nommu.c
+4
-0
mm/oom_kill.c
mm/oom_kill.c
+39
-25
mm/page_alloc.c
mm/page_alloc.c
+3
-1
mm/percpu.c
mm/percpu.c
+19
-16
security/Kconfig
security/Kconfig
+2
-2
tools/perf/Documentation/Makefile
tools/perf/Documentation/Makefile
+1
-1
tools/perf/Documentation/examples.txt
tools/perf/Documentation/examples.txt
+0
-0
tools/perf/builtin-annotate.c
tools/perf/builtin-annotate.c
+7
-0
tools/perf/builtin-record.c
tools/perf/builtin-record.c
+1
-1
未找到文件。
Documentation/filesystems/afs.txt
浏览文件 @
39cf0518
...
...
@@ -23,15 +23,13 @@ it does support include:
(*) Security (currently only AFS kaserver and KerberosIV tickets).
(*) File reading.
(*) File reading
and writing
.
(*) Automounting.
It does not yet support the following AFS features:
(*) Write support.
(*) Local caching (via fscache).
(*) Local caching.
It does not yet support the following AFS features:
(*) pioctl() system call.
...
...
@@ -56,7 +54,7 @@ They permit the debugging messages to be turned on dynamically by manipulating
the masks in the following files:
/sys/module/af_rxrpc/parameters/debug
/sys/module/afs/parameters/debug
/sys/module/
k
afs/parameters/debug
=====
...
...
@@ -66,9 +64,9 @@ USAGE
When inserting the driver modules the root cell must be specified along with a
list of volume location server IP addresses:
insmod af_rxrpc.o
insmod rxkad.o
insmod kafs.o
rootcell=cambridge.redhat.com:172.16.18.73:172.16.18.91
modprobe af_rxrpc
modprobe rxkad
modprobe kafs
rootcell=cambridge.redhat.com:172.16.18.73:172.16.18.91
The first module is the AF_RXRPC network protocol driver. This provides the
RxRPC remote operation protocol and may also be accessed from userspace. See:
...
...
@@ -81,7 +79,7 @@ is the actual filesystem driver for the AFS filesystem.
Once the module has been loaded, more modules can be added by the following
procedure:
echo add grand.central.org 18.
7.14.88:128.2.191.224
>/proc/fs/afs/cells
echo add grand.central.org 18.
9.48.14:128.2.203.61:130.237.48.87
>/proc/fs/afs/cells
Where the parameters to the "add" command are the name of a cell and a list of
volume location servers within that cell, with the latter separated by colons.
...
...
@@ -101,7 +99,7 @@ The name of the volume can be suffixes with ".backup" or ".readonly" to
specify connection to only volumes of those types.
The name of the cell is optional, and if not given during a mount, then the
named volume will be looked up in the cell specified during
insmod
.
named volume will be looked up in the cell specified during
modprobe
.
Additional cells can be added through /proc (see later section).
...
...
@@ -163,14 +161,14 @@ THE CELL DATABASE
The filesystem maintains an internal database of all the cells it knows and the
IP addresses of the volume location servers for those cells. The cell to which
the system belongs is added to the database when
insmod
is performed by the
the system belongs is added to the database when
modprobe
is performed by the
"rootcell=" argument or, if compiled in, using a "kafs.rootcell=" argument on
the kernel command line.
Further cells can be added by commands similar to the following:
echo add CELLNAME VLADDR[:VLADDR][:VLADDR]... >/proc/fs/afs/cells
echo add grand.central.org 18.
7.14.88:128.2.191.224
>/proc/fs/afs/cells
echo add grand.central.org 18.
9.48.14:128.2.203.61:130.237.48.87
>/proc/fs/afs/cells
No other cell database operations are available at this time.
...
...
@@ -233,7 +231,7 @@ insmod /tmp/kafs.o rootcell=cambridge.redhat.com:172.16.18.91
mount -t afs \%root.afs. /afs
mount -t afs \%cambridge.redhat.com:root.cell. /afs/cambridge.redhat.com/
echo add grand.central.org 18.
7.14.88:128.2.191.224
> /proc/fs/afs/cells
echo add grand.central.org 18.
9.48.14:128.2.203.61:130.237.48.87
> /proc/fs/afs/cells
mount -t afs "#grand.central.org:root.cell." /afs/grand.central.org/
mount -t afs "#grand.central.org:root.archive." /afs/grand.central.org/archive
mount -t afs "#grand.central.org:root.contrib." /afs/grand.central.org/contrib
...
...
Documentation/filesystems/proc.txt
浏览文件 @
39cf0518
...
...
@@ -1167,13 +1167,11 @@ CHAPTER 3: PER-PROCESS PARAMETERS
3.1 /proc/<pid>/oom_adj - Adjust the oom-killer score
------------------------------------------------------
This file can be used to adjust the score used to select which processes should
be killed in an out-of-memory situation. The oom_adj value is a characteristic
of the task's mm, so all threads that share an mm with pid will have the same
oom_adj value. A high value will increase the likelihood of this process being
killed by the oom-killer. Valid values are in the range -16 to +15 as
explained below and a special value of -17, which disables oom-killing
altogether for threads sharing pid's mm.
This file can be used to adjust the score used to select which processes
should be killed in an out-of-memory situation. Giving it a high score will
increase the likelihood of this process being killed by the oom-killer. Valid
values are in the range -16 to +15, plus the special value -17, which disables
oom-killing altogether for this process.
The process to be killed in an out-of-memory situation is selected among all others
based on its badness score. This value equals the original memory size of the process
...
...
@@ -1187,9 +1185,6 @@ the parent's score if they do not share the same memory. Thus forking servers
are the prime candidates to be killed. Having only one 'hungry' child will make
parent less preferable than the child.
/proc/<pid>/oom_adj cannot be changed for kthreads since they are immune from
oom-killing already.
/proc/<pid>/oom_score shows process' current badness score.
The following heuristics are then applied:
...
...
MAINTAINERS
浏览文件 @
39cf0518
...
...
@@ -3429,6 +3429,7 @@ F: drivers/mfd/
MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
S: Orphan
L: linux-mmc@vger.kernel.org
F: drivers/mmc/
F: include/linux/mmc/
...
...
@@ -3809,7 +3810,7 @@ W: http://open-osd.org
T: git git://git.open-osd.org/open-osd.git
S: Maintained
F: drivers/scsi/osd/
F:
drivers/
include/scsi/osd_*
F: include/scsi/osd_*
F: fs/exofs/
P54 WIRELESS DRIVER
...
...
REPORTING-BUGS
浏览文件 @
39cf0518
...
...
@@ -15,7 +15,10 @@ worry too much about getting the wrong person. If you are unsure send it
to the person responsible for the code relevant to what you were doing.
If it occurs repeatably try and describe how to recreate it. That is
worth even more than the oops itself. The list of maintainers and
mailing lists is in the MAINTAINERS file in this directory.
mailing lists is in the MAINTAINERS file in this directory. If you
know the file name that causes the problem you can use the following
command in this directory to find some of the maintainers of that file:
perl scripts/get_maintainer.pl -f <filename>
If it is a security bug, please copy the Security Contact listed
in the MAINTAINERS file. They can help coordinate bugfix and disclosure.
...
...
arch/microblaze/configs/mmu_defconfig
浏览文件 @
39cf0518
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.3
0
-rc6
#
Fri May 22 10:02:33
2009
# Linux kernel version: 2.6.3
1
-rc6
#
Tue Aug 18 11:00:02
2009
#
CONFIG_MICROBLAZE=y
# CONFIG_SWAP is not set
...
...
@@ -18,7 +18,11 @@ CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
CONFIG_GENERIC_GPIO=y
CONFIG_GENERIC_CSUM=y
# CONFIG_PCI is not set
CONFIG_NO_DMA=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_CONSTRUCTORS=y
#
# General setup
...
...
@@ -59,8 +63,8 @@ CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_RD_GZIP=y
# CONFIG_RD_BZIP2 is not set
# CONFIG_RD_LZMA is not set
CONFIG_INITRAMFS_COMPRESSION_NONE=y
# CONFIG_INITRAMFS_COMPRESSION_GZIP is not set
# CONFIG_INITRAMFS_COMPRESSION_NONE is not set
CONFIG_INITRAMFS_COMPRESSION_GZIP=y
# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set
# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
...
...
@@ -71,7 +75,6 @@ CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_EXTRA_PASS=y
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_HOTPLUG is not set
CONFIG_PRINTK=y
CONFIG_BUG=y
...
...
@@ -84,13 +87,22 @@ CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
# CONFIG_SHMEM is not set
CONFIG_AIO=y
#
# Performance Counters
#
CONFIG_VM_EVENT_COUNTERS=y
# CONFIG_STRIP_ASM_SYMS is not set
CONFIG_COMPAT_BRK=y
CONFIG_SLAB=y
# CONFIG_SLUB is not set
# CONFIG_SLOB is not set
# CONFIG_PROFILING is not set
# CONFIG_MARKERS is not set
#
# GCOV-based kernel profiling
#
# CONFIG_SLOW_WORK is not set
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_SLABINFO=y
...
...
@@ -102,7 +114,7 @@ CONFIG_MODULE_UNLOAD=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_BLOCK=y
# CONFIG_LBD is not set
CONFIG_LBDAF=y
# CONFIG_BLK_DEV_BSG is not set
# CONFIG_BLK_DEV_INTEGRITY is not set
...
...
@@ -194,9 +206,9 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_PHYS_ADDR_T_64BIT is not set
CONFIG_ZONE_DMA_FLAG=0
CONFIG_VIRT_TO_BUS=y
CONFIG_UNEVICTABLE_LRU=y
CONFIG_HAVE_MLOCK=y
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
#
# Exectuable file formats
...
...
@@ -262,6 +274,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_PHONET is not set
# CONFIG_IEEE802154 is not set
# CONFIG_NET_SCHED is not set
# CONFIG_DCB is not set
...
...
@@ -325,7 +338,6 @@ CONFIG_MISC_DEVICES=y
# CONFIG_ATA is not set
# CONFIG_MD is not set
CONFIG_NETDEVICES=y
CONFIG_COMPAT_NET_DEV_OPS=y
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set
...
...
@@ -344,7 +356,7 @@ CONFIG_NET_ETHERNET=y
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
# CONFIG_
B44
is not set
# CONFIG_
KS8842
is not set
CONFIG_NETDEV_1000=y
CONFIG_NETDEV_10000=y
...
...
@@ -410,6 +422,11 @@ CONFIG_LEGACY_PTY_COUNT=256
# CONFIG_TCG_TPM is not set
# CONFIG_I2C is not set
# CONFIG_SPI is not set
#
# PPS support
#
# CONFIG_PPS is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
# CONFIG_GPIOLIB is not set
# CONFIG_W1 is not set
...
...
@@ -418,12 +435,6 @@ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
# CONFIG_THERMAL is not set
# CONFIG_THERMAL_HWMON is not set
# CONFIG_WATCHDOG is not set
CONFIG_SSB_POSSIBLE=y
#
# Sonics Silicon Backplane
#
# CONFIG_SSB is not set
#
# Multifunction device drivers
...
...
@@ -433,22 +444,7 @@ CONFIG_SSB_POSSIBLE=y
# CONFIG_HTC_PASIC3 is not set
# CONFIG_MFD_TMIO is not set
# CONFIG_REGULATOR is not set
#
# Multimedia devices
#
#
# Multimedia core support
#
# CONFIG_VIDEO_DEV is not set
# CONFIG_DVB_CORE is not set
# CONFIG_VIDEO_MEDIA is not set
#
# Multimedia drivers
#
# CONFIG_DAB is not set
# CONFIG_MEDIA_SUPPORT is not set
#
# Graphics support
...
...
@@ -469,9 +465,12 @@ CONFIG_SSB_POSSIBLE=y
# CONFIG_NEW_LEDS is not set
# CONFIG_ACCESSIBILITY is not set
# CONFIG_RTC_CLASS is not set
# CONFIG_DMADEVICES is not set
# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set
#
# TI VLYNQ
#
# CONFIG_STAGING is not set
#
...
...
@@ -485,12 +484,15 @@ CONFIG_EXT2_FS=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
# CONFIG_FS_POSIX_ACL is not set
CONFIG_FILE_LOCKING=y
# CONFIG_XFS_FS is not set
# CONFIG_GFS2_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_BTRFS_FS is not set
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
# CONFIG_DNOTIFY is not set
# CONFIG_INOTIFY is not set
CONFIG_INOTIFY_USER=y
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
...
...
@@ -678,6 +680,7 @@ CONFIG_DEBUG_INFO=y
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
# CONFIG_PAGE_POISONING is not set
# CONFIG_SAMPLES is not set
# CONFIG_KMEMCHECK is not set
CONFIG_EARLY_PRINTK=y
CONFIG_HEART_BEAT=y
CONFIG_DEBUG_BOOTMEM=y
...
...
@@ -793,6 +796,5 @@ CONFIG_ZLIB_INFLATE=y
CONFIG_DECOMPRESS_GZIP=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
CONFIG_HAVE_LMB=y
CONFIG_NLATTR=y
arch/microblaze/configs/nommu_defconfig
浏览文件 @
39cf0518
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.3
0-rc5
#
Mon May 11 09:01:02
2009
# Linux kernel version: 2.6.3
1-rc6
#
Tue Aug 18 10:35:30
2009
#
CONFIG_MICROBLAZE=y
# CONFIG_SWAP is not set
...
...
@@ -17,9 +17,12 @@ CONFIG_GENERIC_TIME=y
# CONFIG_GENERIC_TIME_VSYSCALL is not set
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
CONFIG_GENERIC_GPIO=y
CONFIG_GENERIC_CSUM=y
# CONFIG_PCI is not set
# CONFIG_NO_DMA is not set
CONFIG_NO_DMA=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_CONSTRUCTORS=y
#
# General setup
...
...
@@ -64,7 +67,6 @@ CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_EXTRA_PASS=y
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_HOTPLUG is not set
CONFIG_PRINTK=y
CONFIG_BUG=y
...
...
@@ -76,13 +78,23 @@ CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_AIO=y
#
# Performance Counters
#
CONFIG_VM_EVENT_COUNTERS=y
# CONFIG_STRIP_ASM_SYMS is not set
CONFIG_COMPAT_BRK=y
CONFIG_SLAB=y
# CONFIG_SLUB is not set
# CONFIG_SLOB is not set
# CONFIG_PROFILING is not set
# CONFIG_MARKERS is not set
#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not set
# CONFIG_SLOW_WORK is not set
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_SLABINFO=y
...
...
@@ -95,7 +107,7 @@ CONFIG_MODULE_UNLOAD=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_BLOCK=y
# CONFIG_LBD is not set
CONFIG_LBDAF=y
# CONFIG_BLK_DEV_BSG is not set
# CONFIG_BLK_DEV_INTEGRITY is not set
...
...
@@ -156,8 +168,16 @@ CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyUL0,115200"
# CONFIG_CMDLINE_FORCE is not set
CONFIG_OF=y
CONFIG_OF_DEVICE=y
CONFIG_PROC_DEVICETREE=y
#
# Advanced setup
#
#
# Default settings for advanced configuration options are used
#
CONFIG_KERNEL_START=0x90000000
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y
# CONFIG_DISCONTIGMEM_MANUAL is not set
...
...
@@ -169,7 +189,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_PHYS_ADDR_T_64BIT is not set
CONFIG_ZONE_DMA_FLAG=0
CONFIG_VIRT_TO_BUS=y
CONFIG_
UNEVICTABLE_LRU=y
CONFIG_
DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_NOMMU_INITIAL_TRIM_EXCESS=1
#
...
...
@@ -237,6 +257,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_PHONET is not set
# CONFIG_IEEE802154 is not set
# CONFIG_NET_SCHED is not set
# CONFIG_DCB is not set
...
...
@@ -254,7 +275,11 @@ CONFIG_WIRELESS=y
CONFIG_WIRELESS_OLD_REGULATORY=y
# CONFIG_WIRELESS_EXT is not set
# CONFIG_LIB80211 is not set
# CONFIG_MAC80211 is not set
#
# CFG80211 needs to be enabled for MAC80211
#
CONFIG_MAC80211_DEFAULT_PS_VALUE=0
# CONFIG_WIMAX is not set
# CONFIG_RFKILL is not set
# CONFIG_NET_9P is not set
...
...
@@ -353,6 +378,7 @@ CONFIG_MTD_UCLINUX=y
# UBI - Unsorted block images
#
# CONFIG_MTD_UBI is not set
CONFIG_OF_DEVICE=y
# CONFIG_PARPORT is not set
CONFIG_BLK_DEV=y
# CONFIG_BLK_DEV_COW_COMMON is not set
...
...
@@ -364,6 +390,7 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
# CONFIG_BLK_DEV_XIP is not set
# CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set
# CONFIG_XILINX_SYSACE is not set
CONFIG_MISC_DEVICES=y
# CONFIG_ENCLOSURE_SERVICES is not set
# CONFIG_C2PORT is not set
...
...
@@ -383,7 +410,6 @@ CONFIG_MISC_DEVICES=y
# CONFIG_ATA is not set
# CONFIG_MD is not set
CONFIG_NETDEVICES=y
CONFIG_COMPAT_NET_DEV_OPS=y
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set
...
...
@@ -402,7 +428,7 @@ CONFIG_NET_ETHERNET=y
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
# CONFIG_
B44
is not set
# CONFIG_
KS8842
is not set
CONFIG_NETDEV_1000=y
CONFIG_NETDEV_10000=y
...
...
@@ -463,23 +489,25 @@ CONFIG_HW_RANDOM=y
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
# CONFIG_RTC is not set
# CONFIG_GEN_RTC is not set
# CONFIG_XILINX_HWICAP is not set
# CONFIG_R3964 is not set
# CONFIG_RAW_DRIVER is not set
# CONFIG_TCG_TPM is not set
# CONFIG_I2C is not set
# CONFIG_SPI is not set
#
# PPS support
#
# CONFIG_PPS is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
# CONFIG_GPIOLIB is not set
# CONFIG_W1 is not set
# CONFIG_POWER_SUPPLY is not set
# CONFIG_HWMON is not set
# CONFIG_THERMAL is not set
# CONFIG_THERMAL_HWMON is not set
# CONFIG_WATCHDOG is not set
CONFIG_SSB_POSSIBLE=y
#
# Sonics Silicon Backplane
#
# CONFIG_SSB is not set
#
# Multifunction device drivers
...
...
@@ -489,22 +517,7 @@ CONFIG_SSB_POSSIBLE=y
# CONFIG_HTC_PASIC3 is not set
# CONFIG_MFD_TMIO is not set
# CONFIG_REGULATOR is not set
#
# Multimedia devices
#
#
# Multimedia core support
#
# CONFIG_VIDEO_DEV is not set
# CONFIG_DVB_CORE is not set
# CONFIG_VIDEO_MEDIA is not set
#
# Multimedia drivers
#
CONFIG_DAB=y
# CONFIG_MEDIA_SUPPORT is not set
#
# Graphics support
...
...
@@ -520,9 +533,10 @@ CONFIG_VIDEO_OUTPUT_CONTROL=y
# CONFIG_DISPLAY_SUPPORT is not set
# CONFIG_SOUND is not set
CONFIG_USB_SUPPORT=y
# CONFIG_USB_ARCH_HAS_HCD is not set
CONFIG_USB_ARCH_HAS_HCD=y
# CONFIG_USB_ARCH_HAS_OHCI is not set
# CONFIG_USB_ARCH_HAS_EHCI is not set
# CONFIG_USB is not set
# CONFIG_USB_OTG_WHITELIST is not set
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
...
...
@@ -543,9 +557,12 @@ CONFIG_USB_SUPPORT=y
# CONFIG_NEW_LEDS is not set
# CONFIG_ACCESSIBILITY is not set
# CONFIG_RTC_CLASS is not set
# CONFIG_DMADEVICES is not set
# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set
#
# TI VLYNQ
#
# CONFIG_STAGING is not set
#
...
...
@@ -558,12 +575,15 @@ CONFIG_EXT2_FS=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_FILE_LOCKING=y
# CONFIG_XFS_FS is not set
# CONFIG_GFS2_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_BTRFS_FS is not set
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
# CONFIG_DNOTIFY is not set
# CONFIG_INOTIFY is not set
CONFIG_INOTIFY_USER=y
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
...
...
@@ -813,6 +833,5 @@ CONFIG_GENERIC_FIND_LAST_BIT=y
CONFIG_ZLIB_INFLATE=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
CONFIG_HAVE_LMB=y
CONFIG_NLATTR=y
arch/microblaze/include/asm/hardirq.h
浏览文件 @
39cf0518
...
...
@@ -12,8 +12,6 @@
/* should be defined in each interrupt controller driver */
extern
unsigned
int
get_irq
(
struct
pt_regs
*
regs
);
#define ack_bad_irq ack_bad_irq
void
ack_bad_irq
(
unsigned
int
irq
);
#include <asm-generic/hardirq.h>
#endif
/* _ASM_MICROBLAZE_HARDIRQ_H */
arch/microblaze/kernel/intc.c
浏览文件 @
39cf0518
...
...
@@ -12,6 +12,7 @@
#include <linux/irq.h>
#include <asm/page.h>
#include <linux/io.h>
#include <linux/bug.h>
#include <asm/prom.h>
#include <asm/irq.h>
...
...
@@ -130,6 +131,7 @@ void __init init_IRQ(void)
if
(
intc
)
break
;
}
BUG_ON
(
!
intc
);
intc_baseaddr
=
*
(
int
*
)
of_get_property
(
intc
,
"reg"
,
NULL
);
intc_baseaddr
=
(
unsigned
long
)
ioremap
(
intc_baseaddr
,
PAGE_SIZE
);
...
...
arch/microblaze/kernel/irq.c
浏览文件 @
39cf0518
...
...
@@ -30,15 +30,6 @@ unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
}
EXPORT_SYMBOL_GPL
(
irq_of_parse_and_map
);
/*
* 'what should we do if we get a hw irq event on an illegal vector'.
* each architecture has to answer this themselves.
*/
void
ack_bad_irq
(
unsigned
int
irq
)
{
printk
(
KERN_WARNING
"unexpected IRQ trap at vector %02x
\n
"
,
irq
);
}
static
u32
concurrent_irq
;
void
do_IRQ
(
struct
pt_regs
*
regs
)
...
...
arch/microblaze/kernel/syscall_table.S
浏览文件 @
39cf0518
...
...
@@ -313,7 +313,7 @@ ENTRY(sys_call_table)
.
long
sys_fchmodat
.
long
sys_faccessat
.
long
sys_ni_syscall
/*
pselect6
*/
.
long
sys_
ni_syscall
/*
sys_ppoll
*/
.
long
sys_
ppoll
.
long
sys_unshare
/*
310
*/
.
long
sys_set_robust_list
.
long
sys_get_robust_list
...
...
arch/microblaze/kernel/timer.c
浏览文件 @
39cf0518
...
...
@@ -22,6 +22,7 @@
#include <linux/clocksource.h>
#include <linux/clockchips.h>
#include <linux/io.h>
#include <linux/bug.h>
#include <asm/cpuinfo.h>
#include <asm/setup.h>
#include <asm/prom.h>
...
...
@@ -234,6 +235,7 @@ void __init time_init(void)
if
(
timer
)
break
;
}
BUG_ON
(
!
timer
);
timer_baseaddr
=
*
(
int
*
)
of_get_property
(
timer
,
"reg"
,
NULL
);
timer_baseaddr
=
(
unsigned
long
)
ioremap
(
timer_baseaddr
,
PAGE_SIZE
);
...
...
arch/microblaze/mm/init.c
浏览文件 @
39cf0518
...
...
@@ -130,13 +130,13 @@ void __init setup_memory(void)
* (in case the address isn't page-aligned).
*/
#ifndef CONFIG_MMU
map_size
=
init_bootmem_node
(
NODE_DATA
(
0
),
PFN_UP
(
TOPHYS
((
u32
)
_end
)),
map_size
=
init_bootmem_node
(
NODE_DATA
(
0
),
PFN_UP
(
TOPHYS
((
u32
)
klimit
)),
min_low_pfn
,
max_low_pfn
);
#else
map_size
=
init_bootmem_node
(
&
contig_page_data
,
PFN_UP
(
TOPHYS
((
u32
)
_end
)),
min_low_pfn
,
max_low_pfn
);
PFN_UP
(
TOPHYS
((
u32
)
klimit
)),
min_low_pfn
,
max_low_pfn
);
#endif
lmb_reserve
(
PFN_UP
(
TOPHYS
((
u32
)
_end
))
<<
PAGE_SHIFT
,
map_size
);
lmb_reserve
(
PFN_UP
(
TOPHYS
((
u32
)
klimit
))
<<
PAGE_SHIFT
,
map_size
);
/* free bootmem is whole main memory */
free_bootmem
(
memory_start
,
memory_size
);
...
...
arch/sparc/kernel/smp_64.c
浏览文件 @
39cf0518
...
...
@@ -1499,7 +1499,7 @@ void __init setup_per_cpu_areas(void)
dyn_size
=
pcpur_size
-
static_size
-
PERCPU_MODULE_RESERVE
;
ptrs_size
=
PFN_ALIGN
(
n
um_possible_cpus
()
*
sizeof
(
pcpur_ptrs
[
0
]));
ptrs_size
=
PFN_ALIGN
(
n
r_cpu_ids
*
sizeof
(
pcpur_ptrs
[
0
]));
pcpur_ptrs
=
alloc_bootmem
(
ptrs_size
);
for_each_possible_cpu
(
cpu
)
{
...
...
@@ -1514,7 +1514,7 @@ void __init setup_per_cpu_areas(void)
/* allocate address and map */
vm
.
flags
=
VM_ALLOC
;
vm
.
size
=
n
um_possible_cpus
()
*
PCPU_CHUNK_SIZE
;
vm
.
size
=
n
r_cpu_ids
*
PCPU_CHUNK_SIZE
;
vm_area_register_early
(
&
vm
,
PCPU_CHUNK_SIZE
);
for_each_possible_cpu
(
cpu
)
{
...
...
arch/x86/include/asm/uv/uv_bau.h
浏览文件 @
39cf0518
...
...
@@ -133,7 +133,7 @@ struct bau_msg_payload {
* see table 4.2.3.0.1 in broacast_assist spec.
*/
struct
bau_msg_header
{
unsigned
int
dest_subnodeid
:
6
;
/* must be
zero
*/
unsigned
int
dest_subnodeid
:
6
;
/* must be
0x10, for the LB
*/
/* bits 5:0 */
unsigned
int
base_dest_nodeid
:
15
;
/* nasid>>1 (pnode) of */
/* bits 20:6 */
/* first bit in node_map */
...
...
arch/x86/kernel/apic/x2apic_uv_x.c
浏览文件 @
39cf0518
...
...
@@ -46,7 +46,7 @@ static int early_get_nodeid(void)
return
node_id
.
s
.
node_id
;
}
static
int
uv_acpi_madt_oem_check
(
char
*
oem_id
,
char
*
oem_table_id
)
static
int
__init
uv_acpi_madt_oem_check
(
char
*
oem_id
,
char
*
oem_table_id
)
{
if
(
!
strcmp
(
oem_id
,
"SGI"
))
{
if
(
!
strcmp
(
oem_table_id
,
"UVL"
))
...
...
@@ -253,7 +253,7 @@ static void uv_send_IPI_self(int vector)
apic_write
(
APIC_SELF_IPI
,
vector
);
}
struct
apic
apic_x2apic_uv_x
=
{
struct
apic
__refdata
apic_x2apic_uv_x
=
{
.
name
=
"UV large system"
,
.
probe
=
NULL
,
...
...
arch/x86/kernel/cpu/mcheck/mce.c
浏览文件 @
39cf0518
...
...
@@ -1226,8 +1226,13 @@ static void mce_init(void)
}
/* Add per CPU specific workarounds here */
static
void
mce_cpu_quirks
(
struct
cpuinfo_x86
*
c
)
static
int
mce_cpu_quirks
(
struct
cpuinfo_x86
*
c
)
{
if
(
c
->
x86_vendor
==
X86_VENDOR_UNKNOWN
)
{
pr_info
(
"MCE: unknown CPU type - not enabling MCE support.
\n
"
);
return
-
EOPNOTSUPP
;
}
/* This should be disabled by the BIOS, but isn't always */
if
(
c
->
x86_vendor
==
X86_VENDOR_AMD
)
{
if
(
c
->
x86
==
15
&&
banks
>
4
)
{
...
...
@@ -1273,11 +1278,20 @@ static void mce_cpu_quirks(struct cpuinfo_x86 *c)
if
((
c
->
x86
>
6
||
(
c
->
x86
==
6
&&
c
->
x86_model
>=
0xe
))
&&
monarch_timeout
<
0
)
monarch_timeout
=
USEC_PER_SEC
;
/*
* There are also broken BIOSes on some Pentium M and
* earlier systems:
*/
if
(
c
->
x86
==
6
&&
c
->
x86_model
<=
13
&&
mce_bootlog
<
0
)
mce_bootlog
=
0
;
}
if
(
monarch_timeout
<
0
)
monarch_timeout
=
0
;
if
(
mce_bootlog
!=
0
)
mce_panic_timeout
=
30
;
return
0
;
}
static
void
__cpuinit
mce_ancient_init
(
struct
cpuinfo_x86
*
c
)
...
...
@@ -1338,11 +1352,10 @@ void __cpuinit mcheck_init(struct cpuinfo_x86 *c)
if
(
!
mce_available
(
c
))
return
;
if
(
mce_cap_init
()
<
0
)
{
if
(
mce_cap_init
()
<
0
||
mce_cpu_quirks
(
c
)
<
0
)
{
mce_disabled
=
1
;
return
;
}
mce_cpu_quirks
(
c
);
machine_check_vector
=
do_machine_check
;
...
...
arch/x86/kernel/cpu/mcheck/therm_throt.c
浏览文件 @
39cf0518
...
...
@@ -116,11 +116,14 @@ static int therm_throt_process(int curr)
cpu
,
__get_cpu_var
(
thermal_throttle_count
));
add_taint
(
TAINT_MACHINE_CHECK
);
}
else
if
(
was_throttled
)
{
return
1
;
}
if
(
was_throttled
)
{
printk
(
KERN_INFO
"CPU%d: Temperature/speed normal
\n
"
,
cpu
);
return
1
;
}
return
1
;
return
0
;
}
#ifdef CONFIG_SYSFS
...
...
arch/x86/kernel/setup_percpu.c
浏览文件 @
39cf0518
...
...
@@ -165,7 +165,7 @@ static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen)
if
(
!
chosen
)
{
size_t
vm_size
=
VMALLOC_END
-
VMALLOC_START
;
size_t
tot_size
=
n
um_possible_cpus
()
*
PMD_SIZE
;
size_t
tot_size
=
n
r_cpu_ids
*
PMD_SIZE
;
/* on non-NUMA, embedding is better */
if
(
!
pcpu_need_numa
())
...
...
@@ -199,7 +199,7 @@ static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen)
dyn_size
=
pcpul_size
-
static_size
-
PERCPU_FIRST_CHUNK_RESERVE
;
/* allocate pointer array and alloc large pages */
map_size
=
PFN_ALIGN
(
n
um_possible_cpus
()
*
sizeof
(
pcpul_map
[
0
]));
map_size
=
PFN_ALIGN
(
n
r_cpu_ids
*
sizeof
(
pcpul_map
[
0
]));
pcpul_map
=
alloc_bootmem
(
map_size
);
for_each_possible_cpu
(
cpu
)
{
...
...
@@ -228,7 +228,7 @@ static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen)
/* allocate address and map */
pcpul_vm
.
flags
=
VM_ALLOC
;
pcpul_vm
.
size
=
n
um_possible_cpus
()
*
PMD_SIZE
;
pcpul_vm
.
size
=
n
r_cpu_ids
*
PMD_SIZE
;
vm_area_register_early
(
&
pcpul_vm
,
PMD_SIZE
);
for_each_possible_cpu
(
cpu
)
{
...
...
@@ -250,8 +250,8 @@ static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen)
PMD_SIZE
,
pcpul_vm
.
addr
,
NULL
);
/* sort pcpul_map array for pcpu_lpage_remapped() */
for
(
i
=
0
;
i
<
n
um_possible_cpus
()
-
1
;
i
++
)
for
(
j
=
i
+
1
;
j
<
n
um_possible_cpus
()
;
j
++
)
for
(
i
=
0
;
i
<
n
r_cpu_ids
-
1
;
i
++
)
for
(
j
=
i
+
1
;
j
<
n
r_cpu_ids
;
j
++
)
if
(
pcpul_map
[
i
].
ptr
>
pcpul_map
[
j
].
ptr
)
{
struct
pcpul_ent
tmp
=
pcpul_map
[
i
];
pcpul_map
[
i
]
=
pcpul_map
[
j
];
...
...
@@ -288,7 +288,7 @@ void *pcpu_lpage_remapped(void *kaddr)
{
void
*
pmd_addr
=
(
void
*
)((
unsigned
long
)
kaddr
&
PMD_MASK
);
unsigned
long
offset
=
(
unsigned
long
)
kaddr
&
~
PMD_MASK
;
int
left
=
0
,
right
=
n
um_possible_cpus
()
-
1
;
int
left
=
0
,
right
=
n
r_cpu_ids
-
1
;
int
pos
;
/* pcpul in use at all? */
...
...
@@ -377,7 +377,7 @@ static ssize_t __init setup_pcpu_4k(size_t static_size)
pcpu4k_nr_static_pages
=
PFN_UP
(
static_size
);
/* unaligned allocations can't be freed, round up to page size */
pages_size
=
PFN_ALIGN
(
pcpu4k_nr_static_pages
*
n
um_possible_cpus
()
pages_size
=
PFN_ALIGN
(
pcpu4k_nr_static_pages
*
n
r_cpu_ids
*
sizeof
(
pcpu4k_pages
[
0
]));
pcpu4k_pages
=
alloc_bootmem
(
pages_size
);
...
...
arch/x86/kernel/tlb_uv.c
浏览文件 @
39cf0518
...
...
@@ -744,6 +744,7 @@ uv_activation_descriptor_init(int node, int pnode)
* note that base_dest_nodeid is actually a nasid.
*/
ad2
->
header
.
base_dest_nodeid
=
uv_partition_base_pnode
<<
1
;
ad2
->
header
.
dest_subnodeid
=
0x10
;
/* the LB */
ad2
->
header
.
command
=
UV_NET_ENDPOINT_INTD
;
ad2
->
header
.
int_both
=
1
;
/*
...
...
drivers/gpu/drm/drm_crtc.c
浏览文件 @
39cf0518
...
...
@@ -257,31 +257,6 @@ void *drm_mode_object_find(struct drm_device *dev, uint32_t id, uint32_t type)
}
EXPORT_SYMBOL
(
drm_mode_object_find
);
/**
* drm_crtc_from_fb - find the CRTC structure associated with an fb
* @dev: DRM device
* @fb: framebuffer in question
*
* LOCKING:
* Caller must hold mode_config lock.
*
* Find CRTC in the mode_config structure that matches @fb.
*
* RETURNS:
* Pointer to the CRTC or NULL if it wasn't found.
*/
struct
drm_crtc
*
drm_crtc_from_fb
(
struct
drm_device
*
dev
,
struct
drm_framebuffer
*
fb
)
{
struct
drm_crtc
*
crtc
;
list_for_each_entry
(
crtc
,
&
dev
->
mode_config
.
crtc_list
,
head
)
{
if
(
crtc
->
fb
==
fb
)
return
crtc
;
}
return
NULL
;
}
/**
* drm_framebuffer_init - initialize a framebuffer
* @dev: DRM device
...
...
@@ -328,11 +303,20 @@ void drm_framebuffer_cleanup(struct drm_framebuffer *fb)
{
struct
drm_device
*
dev
=
fb
->
dev
;
struct
drm_crtc
*
crtc
;
struct
drm_mode_set
set
;
int
ret
;
/* remove from any CRTC */
list_for_each_entry
(
crtc
,
&
dev
->
mode_config
.
crtc_list
,
head
)
{
if
(
crtc
->
fb
==
fb
)
crtc
->
fb
=
NULL
;
if
(
crtc
->
fb
==
fb
)
{
/* should turn off the crtc */
memset
(
&
set
,
0
,
sizeof
(
struct
drm_mode_set
));
set
.
crtc
=
crtc
;
set
.
fb
=
NULL
;
ret
=
crtc
->
funcs
->
set_config
(
&
set
);
if
(
ret
)
DRM_ERROR
(
"failed to reset crtc %p when fb was deleted
\n
"
,
crtc
);
}
}
drm_mode_object_put
(
dev
,
&
fb
->
base
);
...
...
@@ -1511,7 +1495,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
set
.
mode
=
mode
;
set
.
connectors
=
connector_set
;
set
.
num_connectors
=
crtc_req
->
count_connectors
;
set
.
fb
=
fb
;
set
.
fb
=
fb
;
ret
=
crtc
->
funcs
->
set_config
(
&
set
);
out:
...
...
drivers/gpu/drm/drm_edid.c
浏览文件 @
39cf0518
...
...
@@ -502,12 +502,40 @@ static int add_detailed_info(struct drm_connector *connector,
struct
detailed_non_pixel
*
data
=
&
timing
->
data
.
other_data
;
struct
drm_display_mode
*
newmode
;
/* EDID up to and including 1.2 may put monitor info here */
if
(
edid
->
version
==
1
&&
edid
->
revision
<
3
)
continue
;
/* Detailed mode timing */
if
(
timing
->
pixel_clock
)
{
/* X server check is version 1.1 or higher */
if
(
edid
->
version
==
1
&&
edid
->
revision
>=
1
&&
!
timing
->
pixel_clock
)
{
/* Other timing or info */
switch
(
data
->
type
)
{
case
EDID_DETAIL_MONITOR_SERIAL
:
break
;
case
EDID_DETAIL_MONITOR_STRING
:
break
;
case
EDID_DETAIL_MONITOR_RANGE
:
/* Get monitor range data */
break
;
case
EDID_DETAIL_MONITOR_NAME
:
break
;
case
EDID_DETAIL_MONITOR_CPDATA
:
break
;
case
EDID_DETAIL_STD_MODES
:
/* Five modes per detailed section */
for
(
j
=
0
;
j
<
5
;
i
++
)
{
struct
std_timing
*
std
;
struct
drm_display_mode
*
newmode
;
std
=
&
data
->
data
.
timings
[
j
];
newmode
=
drm_mode_std
(
dev
,
std
);
if
(
newmode
)
{
drm_mode_probed_add
(
connector
,
newmode
);
modes
++
;
}
}
break
;
default:
break
;
}
}
else
{
newmode
=
drm_mode_detailed
(
dev
,
edid
,
timing
,
quirks
);
if
(
!
newmode
)
continue
;
...
...
@@ -518,38 +546,6 @@ static int add_detailed_info(struct drm_connector *connector,
drm_mode_probed_add
(
connector
,
newmode
);
modes
++
;
continue
;
}
/* Other timing or info */
switch
(
data
->
type
)
{
case
EDID_DETAIL_MONITOR_SERIAL
:
break
;
case
EDID_DETAIL_MONITOR_STRING
:
break
;
case
EDID_DETAIL_MONITOR_RANGE
:
/* Get monitor range data */
break
;
case
EDID_DETAIL_MONITOR_NAME
:
break
;
case
EDID_DETAIL_MONITOR_CPDATA
:
break
;
case
EDID_DETAIL_STD_MODES
:
/* Five modes per detailed section */
for
(
j
=
0
;
j
<
5
;
i
++
)
{
struct
std_timing
*
std
;
struct
drm_display_mode
*
newmode
;
std
=
&
data
->
data
.
timings
[
j
];
newmode
=
drm_mode_std
(
dev
,
std
);
if
(
newmode
)
{
drm_mode_probed_add
(
connector
,
newmode
);
modes
++
;
}
}
break
;
default:
break
;
}
}
...
...
drivers/gpu/drm/radeon/r100.c
浏览文件 @
39cf0518
...
...
@@ -253,6 +253,72 @@ void r100_mc_fini(struct radeon_device *rdev)
}
/*
* Interrupts
*/
int
r100_irq_set
(
struct
radeon_device
*
rdev
)
{
uint32_t
tmp
=
0
;
if
(
rdev
->
irq
.
sw_int
)
{
tmp
|=
RADEON_SW_INT_ENABLE
;
}
if
(
rdev
->
irq
.
crtc_vblank_int
[
0
])
{
tmp
|=
RADEON_CRTC_VBLANK_MASK
;
}
if
(
rdev
->
irq
.
crtc_vblank_int
[
1
])
{
tmp
|=
RADEON_CRTC2_VBLANK_MASK
;
}
WREG32
(
RADEON_GEN_INT_CNTL
,
tmp
);
return
0
;
}
static
inline
uint32_t
r100_irq_ack
(
struct
radeon_device
*
rdev
)
{
uint32_t
irqs
=
RREG32
(
RADEON_GEN_INT_STATUS
);
uint32_t
irq_mask
=
RADEON_SW_INT_TEST
|
RADEON_CRTC_VBLANK_STAT
|
RADEON_CRTC2_VBLANK_STAT
;
if
(
irqs
)
{
WREG32
(
RADEON_GEN_INT_STATUS
,
irqs
);
}
return
irqs
&
irq_mask
;
}
int
r100_irq_process
(
struct
radeon_device
*
rdev
)
{
uint32_t
status
;
status
=
r100_irq_ack
(
rdev
);
if
(
!
status
)
{
return
IRQ_NONE
;
}
while
(
status
)
{
/* SW interrupt */
if
(
status
&
RADEON_SW_INT_TEST
)
{
radeon_fence_process
(
rdev
);
}
/* Vertical blank interrupts */
if
(
status
&
RADEON_CRTC_VBLANK_STAT
)
{
drm_handle_vblank
(
rdev
->
ddev
,
0
);
}
if
(
status
&
RADEON_CRTC2_VBLANK_STAT
)
{
drm_handle_vblank
(
rdev
->
ddev
,
1
);
}
status
=
r100_irq_ack
(
rdev
);
}
return
IRQ_HANDLED
;
}
u32
r100_get_vblank_counter
(
struct
radeon_device
*
rdev
,
int
crtc
)
{
if
(
crtc
==
0
)
return
RREG32
(
RADEON_CRTC_CRNT_FRAME
);
else
return
RREG32
(
RADEON_CRTC2_CRNT_FRAME
);
}
/*
* Fence emission
*/
...
...
@@ -1556,26 +1622,6 @@ void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
r100_pll_errata_after_data
(
rdev
);
}
uint32_t
r100_mm_rreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
)
{
if
(
reg
<
0x10000
)
return
readl
(((
void
__iomem
*
)
rdev
->
rmmio
)
+
reg
);
else
{
writel
(
reg
,
((
void
__iomem
*
)
rdev
->
rmmio
)
+
RADEON_MM_INDEX
);
return
readl
(((
void
__iomem
*
)
rdev
->
rmmio
)
+
RADEON_MM_DATA
);
}
}
void
r100_mm_wreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
,
uint32_t
v
)
{
if
(
reg
<
0x10000
)
writel
(
v
,
((
void
__iomem
*
)
rdev
->
rmmio
)
+
reg
);
else
{
writel
(
reg
,
((
void
__iomem
*
)
rdev
->
rmmio
)
+
RADEON_MM_INDEX
);
writel
(
v
,
((
void
__iomem
*
)
rdev
->
rmmio
)
+
RADEON_MM_DATA
);
}
}
int
r100_init
(
struct
radeon_device
*
rdev
)
{
return
0
;
...
...
drivers/gpu/drm/radeon/r300.c
浏览文件 @
39cf0518
...
...
@@ -83,8 +83,8 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev)
WREG32_PCIE
(
RADEON_PCIE_TX_GART_CNTL
,
tmp
|
RADEON_PCIE_TX_GART_INVALIDATE_TLB
);
(
void
)
RREG32_PCIE
(
RADEON_PCIE_TX_GART_CNTL
);
WREG32_PCIE
(
RADEON_PCIE_TX_GART_CNTL
,
tmp
);
mb
();
}
mb
();
}
int
rv370_pcie_gart_enable
(
struct
radeon_device
*
rdev
)
...
...
@@ -592,27 +592,6 @@ void r300_vram_info(struct radeon_device *rdev)
}
/*
* Indirect registers accessor
*/
uint32_t
rv370_pcie_rreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
)
{
uint32_t
r
;
WREG8
(
RADEON_PCIE_INDEX
,
((
reg
)
&
0xff
));
(
void
)
RREG32
(
RADEON_PCIE_INDEX
);
r
=
RREG32
(
RADEON_PCIE_DATA
);
return
r
;
}
void
rv370_pcie_wreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
,
uint32_t
v
)
{
WREG8
(
RADEON_PCIE_INDEX
,
((
reg
)
&
0xff
));
(
void
)
RREG32
(
RADEON_PCIE_INDEX
);
WREG32
(
RADEON_PCIE_DATA
,
(
v
));
(
void
)
RREG32
(
RADEON_PCIE_DATA
);
}
/*
* PCIE Lanes
*/
...
...
@@ -1403,6 +1382,21 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
tmp
=
(
ib_chunk
->
kdata
[
idx
]
>>
22
)
&
0xF
;
track
->
textures
[
i
].
txdepth
=
tmp
;
break
;
case
R300_ZB_ZPASS_ADDR
:
r
=
r100_cs_packet_next_reloc
(
p
,
&
reloc
);
if
(
r
)
{
DRM_ERROR
(
"No reloc for ib[%d]=0x%04X
\n
"
,
idx
,
reg
);
r100_cs_dump_packet
(
p
,
pkt
);
return
r
;
}
ib
[
idx
]
=
ib_chunk
->
kdata
[
idx
]
+
((
u32
)
reloc
->
lobj
.
gpu_offset
);
break
;
case
0x4be8
:
/* valid register only on RV530 */
if
(
p
->
rdev
->
family
==
CHIP_RV530
)
break
;
/* fallthrough do not move */
default:
printk
(
KERN_ERR
"Forbidden register 0x%04X in cs at %d
\n
"
,
reg
,
idx
);
...
...
drivers/gpu/drm/radeon/r500_reg.h
浏览文件 @
39cf0518
...
...
@@ -350,6 +350,7 @@
#define AVIVO_D1CRTC_BLANK_CONTROL 0x6084
#define AVIVO_D1CRTC_INTERLACE_CONTROL 0x6088
#define AVIVO_D1CRTC_INTERLACE_STATUS 0x608c
#define AVIVO_D1CRTC_FRAME_COUNT 0x60a4
#define AVIVO_D1CRTC_STEREO_CONTROL 0x60c4
/* master controls */
...
...
@@ -438,14 +439,15 @@
# define AVIVO_DC_LB_DISP1_END_ADR_SHIFT 4
# define AVIVO_DC_LB_DISP1_END_ADR_MASK 0x7ff
#define R500_DxMODE_INT_MASK 0x6540
#define R500_D1MODE_INT_MASK (1<<0)
#define R500_D2MODE_INT_MASK (1<<8)
#define AVIVO_D1MODE_DATA_FORMAT 0x6528
# define AVIVO_D1MODE_INTERLEAVE_EN (1 << 0)
#define AVIVO_D1MODE_DESKTOP_HEIGHT 0x652C
#define AVIVO_D1MODE_VBLANK_STATUS 0x6534
# define AVIVO_VBLANK_ACK (1 << 4)
#define AVIVO_D1MODE_VLINE_START_END 0x6538
#define AVIVO_DxMODE_INT_MASK 0x6540
# define AVIVO_D1MODE_INT_MASK (1 << 0)
# define AVIVO_D2MODE_INT_MASK (1 << 8)
#define AVIVO_D1MODE_VIEWPORT_START 0x6580
#define AVIVO_D1MODE_VIEWPORT_SIZE 0x6584
#define AVIVO_D1MODE_EXT_OVERSCAN_LEFT_RIGHT 0x6588
...
...
@@ -475,6 +477,7 @@
#define AVIVO_D2CRTC_BLANK_CONTROL 0x6884
#define AVIVO_D2CRTC_INTERLACE_CONTROL 0x6888
#define AVIVO_D2CRTC_INTERLACE_STATUS 0x688c
#define AVIVO_D2CRTC_FRAME_COUNT 0x68a4
#define AVIVO_D2CRTC_STEREO_CONTROL 0x68c4
#define AVIVO_D2GRPH_ENABLE 0x6900
...
...
@@ -497,6 +500,7 @@
#define AVIVO_D2CUR_SIZE 0x6c10
#define AVIVO_D2CUR_POSITION 0x6c14
#define AVIVO_D2MODE_VBLANK_STATUS 0x6d34
#define AVIVO_D2MODE_VLINE_START_END 0x6d38
#define AVIVO_D2MODE_VIEWPORT_START 0x6d80
#define AVIVO_D2MODE_VIEWPORT_SIZE 0x6d84
...
...
@@ -748,4 +752,8 @@
# define AVIVO_I2C_EN (1 << 0)
# define AVIVO_I2C_RESET (1 << 8)
#define AVIVO_DISP_INTERRUPT_STATUS 0x7edc
# define AVIVO_D1_VBLANK_INTERRUPT (1 << 4)
# define AVIVO_D2_VBLANK_INTERRUPT (1 << 5)
#endif
drivers/gpu/drm/radeon/radeon.h
浏览文件 @
39cf0518
...
...
@@ -242,6 +242,7 @@ int radeon_object_pin(struct radeon_object *robj, uint32_t domain,
uint64_t
*
gpu_addr
);
void
radeon_object_unpin
(
struct
radeon_object
*
robj
);
int
radeon_object_wait
(
struct
radeon_object
*
robj
);
int
radeon_object_busy_domain
(
struct
radeon_object
*
robj
,
uint32_t
*
cur_placement
);
int
radeon_object_evict_vram
(
struct
radeon_device
*
rdev
);
int
radeon_object_mmap
(
struct
radeon_object
*
robj
,
uint64_t
*
offset
);
void
radeon_object_force_delete
(
struct
radeon_device
*
rdev
);
...
...
@@ -574,6 +575,7 @@ struct radeon_asic {
void
(
*
ring_start
)(
struct
radeon_device
*
rdev
);
int
(
*
irq_set
)(
struct
radeon_device
*
rdev
);
int
(
*
irq_process
)(
struct
radeon_device
*
rdev
);
u32
(
*
get_vblank_counter
)(
struct
radeon_device
*
rdev
,
int
crtc
);
void
(
*
fence_ring_emit
)(
struct
radeon_device
*
rdev
,
struct
radeon_fence
*
fence
);
int
(
*
cs_parse
)(
struct
radeon_cs_parser
*
p
);
int
(
*
copy_blit
)(
struct
radeon_device
*
rdev
,
...
...
@@ -666,14 +668,11 @@ struct radeon_device {
resource_size_t
rmmio_base
;
resource_size_t
rmmio_size
;
void
*
rmmio
;
radeon_rreg_t
mm_rreg
;
radeon_wreg_t
mm_wreg
;
radeon_rreg_t
mc_rreg
;
radeon_wreg_t
mc_wreg
;
radeon_rreg_t
pll_rreg
;
radeon_wreg_t
pll_wreg
;
radeon_rreg_t
pcie_rreg
;
radeon_wreg_t
pcie_wreg
;
uint32_t
pcie_reg_mask
;
radeon_rreg_t
pciep_rreg
;
radeon_wreg_t
pciep_wreg
;
struct
radeon_clock
clock
;
...
...
@@ -705,22 +704,42 @@ int radeon_device_init(struct radeon_device *rdev,
void
radeon_device_fini
(
struct
radeon_device
*
rdev
);
int
radeon_gpu_wait_for_idle
(
struct
radeon_device
*
rdev
);
static
inline
uint32_t
r100_mm_rreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
)
{
if
(
reg
<
0x10000
)
return
readl
(((
void
__iomem
*
)
rdev
->
rmmio
)
+
reg
);
else
{
writel
(
reg
,
((
void
__iomem
*
)
rdev
->
rmmio
)
+
RADEON_MM_INDEX
);
return
readl
(((
void
__iomem
*
)
rdev
->
rmmio
)
+
RADEON_MM_DATA
);
}
}
static
inline
void
r100_mm_wreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
,
uint32_t
v
)
{
if
(
reg
<
0x10000
)
writel
(
v
,
((
void
__iomem
*
)
rdev
->
rmmio
)
+
reg
);
else
{
writel
(
reg
,
((
void
__iomem
*
)
rdev
->
rmmio
)
+
RADEON_MM_INDEX
);
writel
(
v
,
((
void
__iomem
*
)
rdev
->
rmmio
)
+
RADEON_MM_DATA
);
}
}
/*
* Registers read & write functions.
*/
#define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg))
#define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg))
#define RREG32(reg) r
dev->
mm_rreg(rdev, (reg))
#define WREG32(reg, v) r
dev->
mm_wreg(rdev, (reg), (v))
#define RREG32(reg) r
100_
mm_rreg(rdev, (reg))
#define WREG32(reg, v) r
100_
mm_wreg(rdev, (reg), (v))
#define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)
#define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)
#define RREG32_PLL(reg) rdev->pll_rreg(rdev, (reg))
#define WREG32_PLL(reg, v) rdev->pll_wreg(rdev, (reg), (v))
#define RREG32_MC(reg) rdev->mc_rreg(rdev, (reg))
#define WREG32_MC(reg, v) rdev->mc_wreg(rdev, (reg), (v))
#define RREG32_PCIE(reg) r
dev->
pcie_rreg(rdev, (reg))
#define WREG32_PCIE(reg, v) r
dev->
pcie_wreg(rdev, (reg), (v))
#define RREG32_PCIE(reg) r
v370_
pcie_rreg(rdev, (reg))
#define WREG32_PCIE(reg, v) r
v370_
pcie_wreg(rdev, (reg), (v))
#define WREG32_P(reg, val, mask) \
do { \
uint32_t tmp_ = RREG32(reg); \
...
...
@@ -736,6 +755,24 @@ int radeon_gpu_wait_for_idle(struct radeon_device *rdev);
WREG32_PLL(reg, tmp_); \
} while (0)
/*
* Indirect registers accessor
*/
static
inline
uint32_t
rv370_pcie_rreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
)
{
uint32_t
r
;
WREG32
(
RADEON_PCIE_INDEX
,
((
reg
)
&
rdev
->
pcie_reg_mask
));
r
=
RREG32
(
RADEON_PCIE_DATA
);
return
r
;
}
static
inline
void
rv370_pcie_wreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
,
uint32_t
v
)
{
WREG32
(
RADEON_PCIE_INDEX
,
((
reg
)
&
rdev
->
pcie_reg_mask
));
WREG32
(
RADEON_PCIE_DATA
,
(
v
));
}
void
r100_pll_errata_after_index
(
struct
radeon_device
*
rdev
);
...
...
@@ -862,6 +899,7 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
#define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev))
#define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev))
#define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev))
#define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->get_vblank_counter((rdev), (crtc))
#define radeon_fence_ring_emit(rdev, fence) (rdev)->asic->fence_ring_emit((rdev), (fence))
#define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy_blit((rdev), (s), (d), (np), (f))
#define radeon_copy_dma(rdev, s, d, np, f) (rdev)->asic->copy_dma((rdev), (s), (d), (np), (f))
...
...
drivers/gpu/drm/radeon/radeon_asic.h
浏览文件 @
39cf0518
...
...
@@ -49,6 +49,7 @@ void r100_vram_info(struct radeon_device *rdev);
int
r100_gpu_reset
(
struct
radeon_device
*
rdev
);
int
r100_mc_init
(
struct
radeon_device
*
rdev
);
void
r100_mc_fini
(
struct
radeon_device
*
rdev
);
u32
r100_get_vblank_counter
(
struct
radeon_device
*
rdev
,
int
crtc
);
int
r100_wb_init
(
struct
radeon_device
*
rdev
);
void
r100_wb_fini
(
struct
radeon_device
*
rdev
);
int
r100_gart_enable
(
struct
radeon_device
*
rdev
);
...
...
@@ -96,6 +97,7 @@ static struct radeon_asic r100_asic = {
.
ring_start
=
&
r100_ring_start
,
.
irq_set
=
&
r100_irq_set
,
.
irq_process
=
&
r100_irq_process
,
.
get_vblank_counter
=
&
r100_get_vblank_counter
,
.
fence_ring_emit
=
&
r100_fence_ring_emit
,
.
cs_parse
=
&
r100_cs_parse
,
.
copy_blit
=
&
r100_copy_blit
,
...
...
@@ -156,6 +158,7 @@ static struct radeon_asic r300_asic = {
.
ring_start
=
&
r300_ring_start
,
.
irq_set
=
&
r100_irq_set
,
.
irq_process
=
&
r100_irq_process
,
.
get_vblank_counter
=
&
r100_get_vblank_counter
,
.
fence_ring_emit
=
&
r300_fence_ring_emit
,
.
cs_parse
=
&
r300_cs_parse
,
.
copy_blit
=
&
r100_copy_blit
,
...
...
@@ -196,6 +199,7 @@ static struct radeon_asic r420_asic = {
.
ring_start
=
&
r300_ring_start
,
.
irq_set
=
&
r100_irq_set
,
.
irq_process
=
&
r100_irq_process
,
.
get_vblank_counter
=
&
r100_get_vblank_counter
,
.
fence_ring_emit
=
&
r300_fence_ring_emit
,
.
cs_parse
=
&
r300_cs_parse
,
.
copy_blit
=
&
r100_copy_blit
,
...
...
@@ -243,6 +247,7 @@ static struct radeon_asic rs400_asic = {
.
ring_start
=
&
r300_ring_start
,
.
irq_set
=
&
r100_irq_set
,
.
irq_process
=
&
r100_irq_process
,
.
get_vblank_counter
=
&
r100_get_vblank_counter
,
.
fence_ring_emit
=
&
r300_fence_ring_emit
,
.
cs_parse
=
&
r300_cs_parse
,
.
copy_blit
=
&
r100_copy_blit
,
...
...
@@ -266,6 +271,8 @@ void rs600_vram_info(struct radeon_device *rdev);
int
rs600_mc_init
(
struct
radeon_device
*
rdev
);
void
rs600_mc_fini
(
struct
radeon_device
*
rdev
);
int
rs600_irq_set
(
struct
radeon_device
*
rdev
);
int
rs600_irq_process
(
struct
radeon_device
*
rdev
);
u32
rs600_get_vblank_counter
(
struct
radeon_device
*
rdev
,
int
crtc
);
int
rs600_gart_enable
(
struct
radeon_device
*
rdev
);
void
rs600_gart_disable
(
struct
radeon_device
*
rdev
);
void
rs600_gart_tlb_flush
(
struct
radeon_device
*
rdev
);
...
...
@@ -291,7 +298,8 @@ static struct radeon_asic rs600_asic = {
.
cp_disable
=
&
r100_cp_disable
,
.
ring_start
=
&
r300_ring_start
,
.
irq_set
=
&
rs600_irq_set
,
.
irq_process
=
&
r100_irq_process
,
.
irq_process
=
&
rs600_irq_process
,
.
get_vblank_counter
=
&
rs600_get_vblank_counter
,
.
fence_ring_emit
=
&
r300_fence_ring_emit
,
.
cs_parse
=
&
r300_cs_parse
,
.
copy_blit
=
&
r100_copy_blit
,
...
...
@@ -308,6 +316,7 @@ static struct radeon_asic rs600_asic = {
/*
* rs690,rs740
*/
int
rs690_init
(
struct
radeon_device
*
rdev
);
void
rs690_errata
(
struct
radeon_device
*
rdev
);
void
rs690_vram_info
(
struct
radeon_device
*
rdev
);
int
rs690_mc_init
(
struct
radeon_device
*
rdev
);
...
...
@@ -316,7 +325,7 @@ uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg);
void
rs690_mc_wreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
,
uint32_t
v
);
void
rs690_bandwidth_update
(
struct
radeon_device
*
rdev
);
static
struct
radeon_asic
rs690_asic
=
{
.
init
=
&
r
30
0_init
,
.
init
=
&
r
s69
0_init
,
.
errata
=
&
rs690_errata
,
.
vram_info
=
&
rs690_vram_info
,
.
gpu_reset
=
&
r300_gpu_reset
,
...
...
@@ -333,7 +342,8 @@ static struct radeon_asic rs690_asic = {
.
cp_disable
=
&
r100_cp_disable
,
.
ring_start
=
&
r300_ring_start
,
.
irq_set
=
&
rs600_irq_set
,
.
irq_process
=
&
r100_irq_process
,
.
irq_process
=
&
rs600_irq_process
,
.
get_vblank_counter
=
&
rs600_get_vblank_counter
,
.
fence_ring_emit
=
&
r300_fence_ring_emit
,
.
cs_parse
=
&
r300_cs_parse
,
.
copy_blit
=
&
r100_copy_blit
,
...
...
@@ -381,8 +391,9 @@ static struct radeon_asic rv515_asic = {
.
cp_fini
=
&
r100_cp_fini
,
.
cp_disable
=
&
r100_cp_disable
,
.
ring_start
=
&
rv515_ring_start
,
.
irq_set
=
&
r100_irq_set
,
.
irq_process
=
&
r100_irq_process
,
.
irq_set
=
&
rs600_irq_set
,
.
irq_process
=
&
rs600_irq_process
,
.
get_vblank_counter
=
&
rs600_get_vblank_counter
,
.
fence_ring_emit
=
&
r300_fence_ring_emit
,
.
cs_parse
=
&
r300_cs_parse
,
.
copy_blit
=
&
r100_copy_blit
,
...
...
@@ -423,8 +434,9 @@ static struct radeon_asic r520_asic = {
.
cp_fini
=
&
r100_cp_fini
,
.
cp_disable
=
&
r100_cp_disable
,
.
ring_start
=
&
rv515_ring_start
,
.
irq_set
=
&
r100_irq_set
,
.
irq_process
=
&
r100_irq_process
,
.
irq_set
=
&
rs600_irq_set
,
.
irq_process
=
&
rs600_irq_process
,
.
get_vblank_counter
=
&
rs600_get_vblank_counter
,
.
fence_ring_emit
=
&
r300_fence_ring_emit
,
.
cs_parse
=
&
r300_cs_parse
,
.
copy_blit
=
&
r100_copy_blit
,
...
...
drivers/gpu/drm/radeon/radeon_combios.c
浏览文件 @
39cf0518
...
...
@@ -685,23 +685,15 @@ static const uint32_t default_tvdac_adj[CHIP_LAST] = {
0x00780000
,
/* rs480 */
};
static
struct
radeon_encoder_tv_dac
*
radeon_legacy_get_tv_dac_info_from_table
(
struct
radeon_device
*
rdev
)
static
void
radeon_legacy_get_tv_dac_info_from_table
(
struct
radeon_device
*
rdev
,
struct
radeon_encoder_tv_dac
*
tv_dac
)
{
struct
radeon_encoder_tv_dac
*
tv_dac
=
NULL
;
tv_dac
=
kzalloc
(
sizeof
(
struct
radeon_encoder_tv_dac
),
GFP_KERNEL
);
if
(
!
tv_dac
)
return
NULL
;
tv_dac
->
ps2_tvdac_adj
=
default_tvdac_adj
[
rdev
->
family
];
if
((
rdev
->
flags
&
RADEON_IS_MOBILITY
)
&&
(
rdev
->
family
==
CHIP_RV250
))
tv_dac
->
ps2_tvdac_adj
=
0x00880000
;
tv_dac
->
pal_tvdac_adj
=
tv_dac
->
ps2_tvdac_adj
;
tv_dac
->
ntsc_tvdac_adj
=
tv_dac
->
ps2_tvdac_adj
;
return
tv_dac
;
return
;
}
struct
radeon_encoder_tv_dac
*
radeon_combios_get_tv_dac_info
(
struct
...
...
@@ -713,19 +705,18 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct
uint16_t
dac_info
;
uint8_t
rev
,
bg
,
dac
;
struct
radeon_encoder_tv_dac
*
tv_dac
=
NULL
;
int
found
=
0
;
tv_dac
=
kzalloc
(
sizeof
(
struct
radeon_encoder_tv_dac
),
GFP_KERNEL
);
if
(
!
tv_dac
)
return
NULL
;
if
(
rdev
->
bios
==
NULL
)
return
radeon_legacy_get_tv_dac_info_from_table
(
rdev
)
;
goto
out
;
/* first check TV table */
dac_info
=
combios_get_table_offset
(
dev
,
COMBIOS_TV_INFO_TABLE
);
if
(
dac_info
)
{
tv_dac
=
kzalloc
(
sizeof
(
struct
radeon_encoder_tv_dac
),
GFP_KERNEL
);
if
(
!
tv_dac
)
return
NULL
;
rev
=
RBIOS8
(
dac_info
+
0x3
);
if
(
rev
>
4
)
{
bg
=
RBIOS8
(
dac_info
+
0xc
)
&
0xf
;
...
...
@@ -739,6 +730,7 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct
bg
=
RBIOS8
(
dac_info
+
0x10
)
&
0xf
;
dac
=
RBIOS8
(
dac_info
+
0x11
)
&
0xf
;
tv_dac
->
ntsc_tvdac_adj
=
(
bg
<<
16
)
|
(
dac
<<
20
);
found
=
1
;
}
else
if
(
rev
>
1
)
{
bg
=
RBIOS8
(
dac_info
+
0xc
)
&
0xf
;
dac
=
(
RBIOS8
(
dac_info
+
0xc
)
>>
4
)
&
0xf
;
...
...
@@ -751,22 +743,15 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct
bg
=
RBIOS8
(
dac_info
+
0xe
)
&
0xf
;
dac
=
(
RBIOS8
(
dac_info
+
0xe
)
>>
4
)
&
0xf
;
tv_dac
->
ntsc_tvdac_adj
=
(
bg
<<
16
)
|
(
dac
<<
20
);
found
=
1
;
}
tv_dac
->
tv_std
=
radeon_combios_get_tv_info
(
encoder
);
}
else
{
}
if
(
!
found
)
{
/* then check CRT table */
dac_info
=
combios_get_table_offset
(
dev
,
COMBIOS_CRT_INFO_TABLE
);
if
(
dac_info
)
{
tv_dac
=
kzalloc
(
sizeof
(
struct
radeon_encoder_tv_dac
),
GFP_KERNEL
);
if
(
!
tv_dac
)
return
NULL
;
rev
=
RBIOS8
(
dac_info
)
&
0x3
;
if
(
rev
<
2
)
{
bg
=
RBIOS8
(
dac_info
+
0x3
)
&
0xf
;
...
...
@@ -775,6 +760,7 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct
(
bg
<<
16
)
|
(
dac
<<
20
);
tv_dac
->
pal_tvdac_adj
=
tv_dac
->
ps2_tvdac_adj
;
tv_dac
->
ntsc_tvdac_adj
=
tv_dac
->
ps2_tvdac_adj
;
found
=
1
;
}
else
{
bg
=
RBIOS8
(
dac_info
+
0x4
)
&
0xf
;
dac
=
RBIOS8
(
dac_info
+
0x5
)
&
0xf
;
...
...
@@ -782,13 +768,17 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct
(
bg
<<
16
)
|
(
dac
<<
20
);
tv_dac
->
pal_tvdac_adj
=
tv_dac
->
ps2_tvdac_adj
;
tv_dac
->
ntsc_tvdac_adj
=
tv_dac
->
ps2_tvdac_adj
;
found
=
1
;
}
}
else
{
DRM_INFO
(
"No TV DAC info found in BIOS
\n
"
);
return
radeon_legacy_get_tv_dac_info_from_table
(
rdev
);
}
}
out:
if
(
!
found
)
/* fallback to defaults */
radeon_legacy_get_tv_dac_info_from_table
(
rdev
,
tv_dac
);
return
tv_dac
;
}
...
...
drivers/gpu/drm/radeon/radeon_device.c
浏览文件 @
39cf0518
...
...
@@ -225,25 +225,18 @@ void radeon_invalid_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
void
radeon_register_accessor_init
(
struct
radeon_device
*
rdev
)
{
rdev
->
mm_rreg
=
&
r100_mm_rreg
;
rdev
->
mm_wreg
=
&
r100_mm_wreg
;
rdev
->
mc_rreg
=
&
radeon_invalid_rreg
;
rdev
->
mc_wreg
=
&
radeon_invalid_wreg
;
rdev
->
pll_rreg
=
&
radeon_invalid_rreg
;
rdev
->
pll_wreg
=
&
radeon_invalid_wreg
;
rdev
->
pcie_rreg
=
&
radeon_invalid_rreg
;
rdev
->
pcie_wreg
=
&
radeon_invalid_wreg
;
rdev
->
pciep_rreg
=
&
radeon_invalid_rreg
;
rdev
->
pciep_wreg
=
&
radeon_invalid_wreg
;
/* Don't change order as we are overridding accessor. */
if
(
rdev
->
family
<
CHIP_RV515
)
{
rdev
->
pcie_rreg
=
&
rv370_pcie_rreg
;
rdev
->
pcie_wreg
=
&
rv370_pcie_wreg
;
}
if
(
rdev
->
family
>=
CHIP_RV515
)
{
rdev
->
pcie_rreg
=
&
rv515_pcie_rreg
;
rdev
->
pcie_wreg
=
&
rv515_pcie_wreg
;
rdev
->
pcie_reg_mask
=
0xff
;
}
else
{
rdev
->
pcie_reg_mask
=
0x7ff
;
}
/* FIXME: not sure here */
if
(
rdev
->
family
<=
CHIP_R580
)
{
...
...
drivers/gpu/drm/radeon/radeon_fb.c
浏览文件 @
39cf0518
...
...
@@ -574,6 +574,8 @@ int radeonfb_create(struct radeon_device *rdev,
goto
out_unref
;
}
memset_io
(
fbptr
,
0
,
aligned_size
);
strcpy
(
info
->
fix
.
id
,
"radeondrmfb"
);
info
->
fix
.
type
=
FB_TYPE_PACKED_PIXELS
;
info
->
fix
.
visual
=
FB_VISUAL_TRUECOLOR
;
...
...
drivers/gpu/drm/radeon/radeon_gem.c
浏览文件 @
39cf0518
...
...
@@ -262,7 +262,27 @@ int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data,
int
radeon_gem_busy_ioctl
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
filp
)
{
/* FIXME: implement */
struct
drm_radeon_gem_busy
*
args
=
data
;
struct
drm_gem_object
*
gobj
;
struct
radeon_object
*
robj
;
int
r
;
uint32_t
cur_placement
;
gobj
=
drm_gem_object_lookup
(
dev
,
filp
,
args
->
handle
);
if
(
gobj
==
NULL
)
{
return
-
EINVAL
;
}
robj
=
gobj
->
driver_private
;
r
=
radeon_object_busy_domain
(
robj
,
&
cur_placement
);
if
(
cur_placement
==
TTM_PL_VRAM
)
args
->
domain
=
RADEON_GEM_DOMAIN_VRAM
;
if
(
cur_placement
==
TTM_PL_FLAG_TT
)
args
->
domain
=
RADEON_GEM_DOMAIN_GTT
;
if
(
cur_placement
==
TTM_PL_FLAG_SYSTEM
)
args
->
domain
=
RADEON_GEM_DOMAIN_CPU
;
mutex_lock
(
&
dev
->
struct_mutex
);
drm_gem_object_unreference
(
gobj
);
mutex_unlock
(
&
dev
->
struct_mutex
);
return
0
;
}
...
...
drivers/gpu/drm/radeon/radeon_irq_kms.c
浏览文件 @
39cf0518
...
...
@@ -32,60 +32,6 @@
#include "radeon.h"
#include "atom.h"
static
inline
uint32_t
r100_irq_ack
(
struct
radeon_device
*
rdev
)
{
uint32_t
irqs
=
RREG32
(
RADEON_GEN_INT_STATUS
);
uint32_t
irq_mask
=
RADEON_SW_INT_TEST
;
if
(
irqs
)
{
WREG32
(
RADEON_GEN_INT_STATUS
,
irqs
);
}
return
irqs
&
irq_mask
;
}
int
r100_irq_set
(
struct
radeon_device
*
rdev
)
{
uint32_t
tmp
=
0
;
if
(
rdev
->
irq
.
sw_int
)
{
tmp
|=
RADEON_SW_INT_ENABLE
;
}
/* Todo go through CRTC and enable vblank int or not */
WREG32
(
RADEON_GEN_INT_CNTL
,
tmp
);
return
0
;
}
int
r100_irq_process
(
struct
radeon_device
*
rdev
)
{
uint32_t
status
;
status
=
r100_irq_ack
(
rdev
);
if
(
!
status
)
{
return
IRQ_NONE
;
}
while
(
status
)
{
/* SW interrupt */
if
(
status
&
RADEON_SW_INT_TEST
)
{
radeon_fence_process
(
rdev
);
}
status
=
r100_irq_ack
(
rdev
);
}
return
IRQ_HANDLED
;
}
int
rs600_irq_set
(
struct
radeon_device
*
rdev
)
{
uint32_t
tmp
=
0
;
if
(
rdev
->
irq
.
sw_int
)
{
tmp
|=
RADEON_SW_INT_ENABLE
;
}
WREG32
(
RADEON_GEN_INT_CNTL
,
tmp
);
/* Todo go through CRTC and enable vblank int or not */
WREG32
(
R500_DxMODE_INT_MASK
,
0
);
return
0
;
}
irqreturn_t
radeon_driver_irq_handler_kms
(
DRM_IRQ_ARGS
)
{
struct
drm_device
*
dev
=
(
struct
drm_device
*
)
arg
;
...
...
drivers/gpu/drm/radeon/radeon_kms.c
浏览文件 @
39cf0518
...
...
@@ -141,19 +141,42 @@ void radeon_driver_preclose_kms(struct drm_device *dev,
*/
u32
radeon_get_vblank_counter_kms
(
struct
drm_device
*
dev
,
int
crtc
)
{
/* FIXME: implement */
return
0
;
struct
radeon_device
*
rdev
=
dev
->
dev_private
;
if
(
crtc
<
0
||
crtc
>
1
)
{
DRM_ERROR
(
"Invalid crtc %d
\n
"
,
crtc
);
return
-
EINVAL
;
}
return
radeon_get_vblank_counter
(
rdev
,
crtc
);
}
int
radeon_enable_vblank_kms
(
struct
drm_device
*
dev
,
int
crtc
)
{
/* FIXME: implement */
return
0
;
struct
radeon_device
*
rdev
=
dev
->
dev_private
;
if
(
crtc
<
0
||
crtc
>
1
)
{
DRM_ERROR
(
"Invalid crtc %d
\n
"
,
crtc
);
return
-
EINVAL
;
}
rdev
->
irq
.
crtc_vblank_int
[
crtc
]
=
true
;
return
radeon_irq_set
(
rdev
);
}
void
radeon_disable_vblank_kms
(
struct
drm_device
*
dev
,
int
crtc
)
{
/* FIXME: implement */
struct
radeon_device
*
rdev
=
dev
->
dev_private
;
if
(
crtc
<
0
||
crtc
>
1
)
{
DRM_ERROR
(
"Invalid crtc %d
\n
"
,
crtc
);
return
;
}
rdev
->
irq
.
crtc_vblank_int
[
crtc
]
=
false
;
radeon_irq_set
(
rdev
);
}
...
...
drivers/gpu/drm/radeon/radeon_legacy_crtc.c
浏览文件 @
39cf0518
...
...
@@ -310,10 +310,13 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
RADEON_CRTC_DISP_REQ_EN_B
));
WREG32_P
(
RADEON_CRTC_EXT_CNTL
,
0
,
~
mask
);
}
drm_vblank_post_modeset
(
dev
,
radeon_crtc
->
crtc_id
);
radeon_crtc_load_lut
(
crtc
);
break
;
case
DRM_MODE_DPMS_STANDBY
:
case
DRM_MODE_DPMS_SUSPEND
:
case
DRM_MODE_DPMS_OFF
:
drm_vblank_pre_modeset
(
dev
,
radeon_crtc
->
crtc_id
);
if
(
radeon_crtc
->
crtc_id
)
WREG32_P
(
RADEON_CRTC2_GEN_CNTL
,
mask
,
~
mask
);
else
{
...
...
@@ -323,10 +326,6 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
}
break
;
}
if
(
mode
!=
DRM_MODE_DPMS_OFF
)
{
radeon_crtc_load_lut
(
crtc
);
}
}
/* properly set crtc bpp when using atombios */
...
...
drivers/gpu/drm/radeon/radeon_legacy_encoders.c
浏览文件 @
39cf0518
...
...
@@ -1066,6 +1066,7 @@ radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t
switch
(
radeon_encoder
->
encoder_id
)
{
case
ENCODER_OBJECT_ID_INTERNAL_LVDS
:
encoder
->
possible_crtcs
=
0x1
;
drm_encoder_init
(
dev
,
encoder
,
&
radeon_legacy_lvds_enc_funcs
,
DRM_MODE_ENCODER_LVDS
);
drm_encoder_helper_add
(
encoder
,
&
radeon_legacy_lvds_helper_funcs
);
if
(
rdev
->
is_atom_bios
)
...
...
drivers/gpu/drm/radeon/radeon_object.c
浏览文件 @
39cf0518
...
...
@@ -316,6 +316,25 @@ int radeon_object_wait(struct radeon_object *robj)
return
r
;
}
int
radeon_object_busy_domain
(
struct
radeon_object
*
robj
,
uint32_t
*
cur_placement
)
{
int
r
=
0
;
r
=
radeon_object_reserve
(
robj
,
true
);
if
(
unlikely
(
r
!=
0
))
{
DRM_ERROR
(
"radeon: failed to reserve object for waiting.
\n
"
);
return
r
;
}
spin_lock
(
&
robj
->
tobj
.
lock
);
*
cur_placement
=
robj
->
tobj
.
mem
.
mem_type
;
if
(
robj
->
tobj
.
sync_obj
)
{
r
=
ttm_bo_wait
(
&
robj
->
tobj
,
true
,
true
,
true
);
}
spin_unlock
(
&
robj
->
tobj
.
lock
);
radeon_object_unreserve
(
robj
);
return
r
;
}
int
radeon_object_evict_vram
(
struct
radeon_device
*
rdev
)
{
if
(
rdev
->
flags
&
RADEON_IS_IGP
)
{
...
...
drivers/gpu/drm/radeon/radeon_reg.h
浏览文件 @
39cf0518
...
...
@@ -982,12 +982,15 @@
# define RS400_TMDS2_PLLRST (1 << 1)
#define RADEON_GEN_INT_CNTL 0x0040
# define RADEON_CRTC_VBLANK_MASK (1 << 0)
# define RADEON_CRTC2_VBLANK_MASK (1 << 9)
# define RADEON_SW_INT_ENABLE (1 << 25)
#define RADEON_GEN_INT_STATUS 0x0044
# define RADEON_VSYNC_INT_AK (1 << 2)
# define RADEON_VSYNC_INT (1 << 2)
# define RADEON_VSYNC2_INT_AK (1 << 6)
# define RADEON_VSYNC2_INT (1 << 6)
# define AVIVO_DISPLAY_INT_STATUS (1 << 0)
# define RADEON_CRTC_VBLANK_STAT (1 << 0)
# define RADEON_CRTC_VBLANK_STAT_ACK (1 << 0)
# define RADEON_CRTC2_VBLANK_STAT (1 << 9)
# define RADEON_CRTC2_VBLANK_STAT_ACK (1 << 9)
# define RADEON_SW_INT_FIRE (1 << 26)
# define RADEON_SW_INT_TEST (1 << 25)
# define RADEON_SW_INT_TEST_ACK (1 << 25)
...
...
drivers/gpu/drm/radeon/rs600.c
浏览文件 @
39cf0518
...
...
@@ -239,6 +239,88 @@ void rs600_mc_fini(struct radeon_device *rdev)
}
/*
* Interrupts
*/
int
rs600_irq_set
(
struct
radeon_device
*
rdev
)
{
uint32_t
tmp
=
0
;
uint32_t
mode_int
=
0
;
if
(
rdev
->
irq
.
sw_int
)
{
tmp
|=
RADEON_SW_INT_ENABLE
;
}
if
(
rdev
->
irq
.
crtc_vblank_int
[
0
])
{
tmp
|=
AVIVO_DISPLAY_INT_STATUS
;
mode_int
|=
AVIVO_D1MODE_INT_MASK
;
}
if
(
rdev
->
irq
.
crtc_vblank_int
[
1
])
{
tmp
|=
AVIVO_DISPLAY_INT_STATUS
;
mode_int
|=
AVIVO_D2MODE_INT_MASK
;
}
WREG32
(
RADEON_GEN_INT_CNTL
,
tmp
);
WREG32
(
AVIVO_DxMODE_INT_MASK
,
mode_int
);
return
0
;
}
static
inline
uint32_t
rs600_irq_ack
(
struct
radeon_device
*
rdev
,
u32
*
r500_disp_int
)
{
uint32_t
irqs
=
RREG32
(
RADEON_GEN_INT_STATUS
);
uint32_t
irq_mask
=
RADEON_SW_INT_TEST
;
if
(
irqs
&
AVIVO_DISPLAY_INT_STATUS
)
{
*
r500_disp_int
=
RREG32
(
AVIVO_DISP_INTERRUPT_STATUS
);
if
(
*
r500_disp_int
&
AVIVO_D1_VBLANK_INTERRUPT
)
{
WREG32
(
AVIVO_D1MODE_VBLANK_STATUS
,
AVIVO_VBLANK_ACK
);
}
if
(
*
r500_disp_int
&
AVIVO_D2_VBLANK_INTERRUPT
)
{
WREG32
(
AVIVO_D2MODE_VBLANK_STATUS
,
AVIVO_VBLANK_ACK
);
}
}
else
{
*
r500_disp_int
=
0
;
}
if
(
irqs
)
{
WREG32
(
RADEON_GEN_INT_STATUS
,
irqs
);
}
return
irqs
&
irq_mask
;
}
int
rs600_irq_process
(
struct
radeon_device
*
rdev
)
{
uint32_t
status
;
uint32_t
r500_disp_int
;
status
=
rs600_irq_ack
(
rdev
,
&
r500_disp_int
);
if
(
!
status
&&
!
r500_disp_int
)
{
return
IRQ_NONE
;
}
while
(
status
||
r500_disp_int
)
{
/* SW interrupt */
if
(
status
&
RADEON_SW_INT_TEST
)
{
radeon_fence_process
(
rdev
);
}
/* Vertical blank interrupts */
if
(
r500_disp_int
&
AVIVO_D1_VBLANK_INTERRUPT
)
{
drm_handle_vblank
(
rdev
->
ddev
,
0
);
}
if
(
r500_disp_int
&
AVIVO_D2_VBLANK_INTERRUPT
)
{
drm_handle_vblank
(
rdev
->
ddev
,
1
);
}
status
=
rs600_irq_ack
(
rdev
,
&
r500_disp_int
);
}
return
IRQ_HANDLED
;
}
u32
rs600_get_vblank_counter
(
struct
radeon_device
*
rdev
,
int
crtc
)
{
if
(
crtc
==
0
)
return
RREG32
(
AVIVO_D1CRTC_FRAME_COUNT
);
else
return
RREG32
(
AVIVO_D2CRTC_FRAME_COUNT
);
}
/*
* Global GPU functions
*/
...
...
drivers/gpu/drm/radeon/rs690.c
浏览文件 @
39cf0518
...
...
@@ -652,3 +652,68 @@ void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
WREG32
(
RS690_MC_DATA
,
v
);
WREG32
(
RS690_MC_INDEX
,
RS690_MC_INDEX_WR_ACK
);
}
static
const
unsigned
rs690_reg_safe_bm
[
219
]
=
{
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0x17FF1FFF
,
0xFFFFFFFC
,
0xFFFFFFFF
,
0xFF30FFBF
,
0xFFFFFFF8
,
0xC3E6FFFF
,
0xFFFFF6DF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFF03F
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFEFCE
,
0xF00EBFFF
,
0x007C0000
,
0xF0000078
,
0xFF000009
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFF7FF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFC78
,
0xFFFFFFFF
,
0xFFFFFFFE
,
0xFFFFFFFF
,
0x38FF8F50
,
0xFFF88082
,
0xF000000C
,
0xFAE009FF
,
0x0000FFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0x00000000
,
0x00000000
,
0x0000C100
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
0xFFFF0000
,
0xFFFFFFFF
,
0xFF80FFFF
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
0x0003FC01
,
0xFFFFFFF8
,
0xFE800B19
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
0xFFFFFFFF
,
};
int
rs690_init
(
struct
radeon_device
*
rdev
)
{
rdev
->
config
.
r300
.
reg_safe_bm
=
rs690_reg_safe_bm
;
rdev
->
config
.
r300
.
reg_safe_bm_size
=
ARRAY_SIZE
(
rs690_reg_safe_bm
);
return
0
;
}
drivers/gpu/drm/radeon/rv515.c
浏览文件 @
39cf0518
...
...
@@ -400,25 +400,6 @@ void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
WREG32
(
MC_IND_INDEX
,
0
);
}
uint32_t
rv515_pcie_rreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
)
{
uint32_t
r
;
WREG32
(
PCIE_INDEX
,
((
reg
)
&
0x7ff
));
(
void
)
RREG32
(
PCIE_INDEX
);
r
=
RREG32
(
PCIE_DATA
);
return
r
;
}
void
rv515_pcie_wreg
(
struct
radeon_device
*
rdev
,
uint32_t
reg
,
uint32_t
v
)
{
WREG32
(
PCIE_INDEX
,
((
reg
)
&
0x7ff
));
(
void
)
RREG32
(
PCIE_INDEX
);
WREG32
(
PCIE_DATA
,
(
v
));
(
void
)
RREG32
(
PCIE_DATA
);
}
/*
* Debugfs info
*/
...
...
drivers/spi/spi_s3c24xx.c
浏览文件 @
39cf0518
...
...
@@ -111,29 +111,32 @@ static int s3c24xx_spi_setupxfer(struct spi_device *spi,
unsigned
int
bpw
;
unsigned
int
hz
;
unsigned
int
div
;
unsigned
long
clk
;
bpw
=
t
?
t
->
bits_per_word
:
spi
->
bits_per_word
;
hz
=
t
?
t
->
speed_hz
:
spi
->
max_speed_hz
;
if
(
!
bpw
)
bpw
=
8
;
if
(
!
hz
)
hz
=
spi
->
max_speed_hz
;
if
(
bpw
!=
8
)
{
dev_err
(
&
spi
->
dev
,
"invalid bits-per-word (%d)
\n
"
,
bpw
);
return
-
EINVAL
;
}
div
=
clk_get_rate
(
hw
->
clk
)
/
hz
;
/* is clk = pclk / (2 * (pre+1)), or is it
* clk = (pclk * 2) / ( pre + 1) */
div
/=
2
;
if
(
div
>
0
)
div
-=
1
;
clk
=
clk_get_rate
(
hw
->
clk
);
div
=
DIV_ROUND_UP
(
clk
,
hz
*
2
)
-
1
;
if
(
div
>
255
)
div
=
255
;
dev_dbg
(
&
spi
->
dev
,
"setting pre-scaler to %d (hz %d)
\n
"
,
div
,
hz
);
dev_dbg
(
&
spi
->
dev
,
"setting pre-scaler to %d (wanted %d, got %ld)
\n
"
,
div
,
hz
,
clk
/
(
2
*
(
div
+
1
)));
writeb
(
div
,
hw
->
regs
+
S3C2410_SPPRE
);
spin_lock
(
&
hw
->
bitbang
.
lock
);
...
...
fs/libfs.c
浏览文件 @
39cf0518
...
...
@@ -217,7 +217,7 @@ int get_sb_pseudo(struct file_system_type *fs_type, char *name,
return
PTR_ERR
(
s
);
s
->
s_flags
=
MS_NOUSER
;
s
->
s_maxbytes
=
~
0ULL
;
s
->
s_maxbytes
=
MAX_LFS_FILESIZE
;
s
->
s_blocksize
=
PAGE_SIZE
;
s
->
s_blocksize_bits
=
PAGE_SHIFT
;
s
->
s_magic
=
magic
;
...
...
fs/nilfs2/super.c
浏览文件 @
39cf0518
...
...
@@ -416,8 +416,10 @@ int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno)
if
(
unlikely
(
err
))
goto
failed
;
down_read
(
&
nilfs
->
ns_segctor_sem
);
err
=
nilfs_cpfile_get_checkpoint
(
nilfs
->
ns_cpfile
,
cno
,
0
,
&
raw_cp
,
&
bh_cp
);
up_read
(
&
nilfs
->
ns_segctor_sem
);
if
(
unlikely
(
err
))
{
if
(
err
==
-
ENOENT
||
err
==
-
EINVAL
)
{
printk
(
KERN_ERR
...
...
fs/nilfs2/the_nilfs.h
浏览文件 @
39cf0518
...
...
@@ -253,7 +253,7 @@ nilfs_detach_writer(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
static
inline
void
nilfs_put_sbinfo
(
struct
nilfs_sb_info
*
sbi
)
{
if
(
!
atomic_dec_and_test
(
&
sbi
->
s_count
))
if
(
atomic_dec_and_test
(
&
sbi
->
s_count
))
kfree
(
sbi
);
}
...
...
fs/proc/base.c
浏览文件 @
39cf0518
...
...
@@ -1003,12 +1003,7 @@ static ssize_t oom_adjust_read(struct file *file, char __user *buf,
if
(
!
task
)
return
-
ESRCH
;
task_lock
(
task
);
if
(
task
->
mm
)
oom_adjust
=
task
->
mm
->
oom_adj
;
else
oom_adjust
=
OOM_DISABLE
;
task_unlock
(
task
);
oom_adjust
=
task
->
oomkilladj
;
put_task_struct
(
task
);
len
=
snprintf
(
buffer
,
sizeof
(
buffer
),
"%i
\n
"
,
oom_adjust
);
...
...
@@ -1037,19 +1032,11 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf,
task
=
get_proc_task
(
file
->
f_path
.
dentry
->
d_inode
);
if
(
!
task
)
return
-
ESRCH
;
task_lock
(
task
);
if
(
!
task
->
mm
)
{
task_unlock
(
task
);
put_task_struct
(
task
);
return
-
EINVAL
;
}
if
(
oom_adjust
<
task
->
mm
->
oom_adj
&&
!
capable
(
CAP_SYS_RESOURCE
))
{
task_unlock
(
task
);
if
(
oom_adjust
<
task
->
oomkilladj
&&
!
capable
(
CAP_SYS_RESOURCE
))
{
put_task_struct
(
task
);
return
-
EACCES
;
}
task
->
mm
->
oom_adj
=
oom_adjust
;
task_unlock
(
task
);
task
->
oomkilladj
=
oom_adjust
;
put_task_struct
(
task
);
if
(
end
-
buffer
==
0
)
return
-
EIO
;
...
...
include/drm/radeon_drm.h
浏览文件 @
39cf0518
...
...
@@ -838,7 +838,7 @@ struct drm_radeon_gem_wait_idle {
struct
drm_radeon_gem_busy
{
uint32_t
handle
;
uint32_t
busy
;
uint32_t
domain
;
};
struct
drm_radeon_gem_pread
{
...
...
include/linux/mm_types.h
浏览文件 @
39cf0518
...
...
@@ -240,8 +240,6 @@ struct mm_struct {
unsigned
long
saved_auxv
[
AT_VECTOR_SIZE
];
/* for /proc/PID/auxv */
s8
oom_adj
;
/* OOM kill score adjustment (bit shift) */
cpumask_t
cpu_vm_mask
;
/* Architecture-specific MM context */
...
...
include/linux/sched.h
浏览文件 @
39cf0518
...
...
@@ -1198,6 +1198,7 @@ struct task_struct {
* a short time
*/
unsigned
char
fpu_counter
;
s8
oomkilladj
;
/* OOM kill score adjustment (bit shift). */
#ifdef CONFIG_BLK_DEV_IO_TRACE
unsigned
int
btrace_seq
;
#endif
...
...
init/main.c
浏览文件 @
39cf0518
...
...
@@ -584,8 +584,8 @@ asmlinkage void __init start_kernel(void)
setup_arch
(
&
command_line
);
mm_init_owner
(
&
init_mm
,
&
init_task
);
setup_command_line
(
command_line
);
setup_per_cpu_areas
();
setup_nr_cpu_ids
();
setup_per_cpu_areas
();
smp_prepare_boot_cpu
();
/* arch-specific boot-cpu hooks */
build_all_zonelists
();
...
...
kernel/fork.c
浏览文件 @
39cf0518
...
...
@@ -426,7 +426,6 @@ static struct mm_struct * mm_init(struct mm_struct * mm, struct task_struct *p)
init_rwsem
(
&
mm
->
mmap_sem
);
INIT_LIST_HEAD
(
&
mm
->
mmlist
);
mm
->
flags
=
(
current
->
mm
)
?
current
->
mm
->
flags
:
default_dump_filter
;
mm
->
oom_adj
=
(
current
->
mm
)
?
current
->
mm
->
oom_adj
:
0
;
mm
->
core_state
=
NULL
;
mm
->
nr_ptes
=
0
;
set_mm_counter
(
mm
,
file_rss
,
0
);
...
...
kernel/perf_counter.c
浏览文件 @
39cf0518
...
...
@@ -1503,10 +1503,21 @@ static void perf_counter_enable_on_exec(struct task_struct *task)
*/
static
void
__perf_counter_read
(
void
*
info
)
{
struct
perf_cpu_context
*
cpuctx
=
&
__get_cpu_var
(
perf_cpu_context
);
struct
perf_counter
*
counter
=
info
;
struct
perf_counter_context
*
ctx
=
counter
->
ctx
;
unsigned
long
flags
;
/*
* If this is a task context, we need to check whether it is
* the current task context of this cpu. If not it has been
* scheduled out before the smp call arrived. In that case
* counter->count would have been updated to a recent sample
* when the counter was scheduled out.
*/
if
(
ctx
->
task
&&
cpuctx
->
task_ctx
!=
ctx
)
return
;
local_irq_save
(
flags
);
if
(
ctx
->
is_active
)
update_context_time
(
ctx
);
...
...
@@ -2008,6 +2019,10 @@ int perf_counter_task_disable(void)
return
0
;
}
#ifndef PERF_COUNTER_INDEX_OFFSET
# define PERF_COUNTER_INDEX_OFFSET 0
#endif
static
int
perf_counter_index
(
struct
perf_counter
*
counter
)
{
if
(
counter
->
state
!=
PERF_COUNTER_STATE_ACTIVE
)
...
...
mm/nommu.c
浏览文件 @
39cf0518
...
...
@@ -919,6 +919,10 @@ static int validate_mmap_request(struct file *file,
if
(
!
file
->
f_op
->
read
)
capabilities
&=
~
BDI_CAP_MAP_COPY
;
/* The file shall have been opened with read permission. */
if
(
!
(
file
->
f_mode
&
FMODE_READ
))
return
-
EACCES
;
if
(
flags
&
MAP_SHARED
)
{
/* do checks for writing, appending and locking */
if
((
prot
&
PROT_WRITE
)
&&
...
...
mm/oom_kill.c
浏览文件 @
39cf0518
...
...
@@ -58,7 +58,6 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
unsigned
long
points
,
cpu_time
,
run_time
;
struct
mm_struct
*
mm
;
struct
task_struct
*
child
;
int
oom_adj
;
task_lock
(
p
);
mm
=
p
->
mm
;
...
...
@@ -66,11 +65,6 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
task_unlock
(
p
);
return
0
;
}
oom_adj
=
mm
->
oom_adj
;
if
(
oom_adj
==
OOM_DISABLE
)
{
task_unlock
(
p
);
return
0
;
}
/*
* The memory size of the process is the basis for the badness.
...
...
@@ -154,15 +148,15 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
points
/=
8
;
/*
* Adjust the score by oom
_
adj.
* Adjust the score by oom
kill
adj.
*/
if
(
oom_
adj
)
{
if
(
oom_
adj
>
0
)
{
if
(
p
->
oomkill
adj
)
{
if
(
p
->
oomkill
adj
>
0
)
{
if
(
!
points
)
points
=
1
;
points
<<=
oom_
adj
;
points
<<=
p
->
oomkill
adj
;
}
else
points
>>=
-
(
oom_
adj
);
points
>>=
-
(
p
->
oomkill
adj
);
}
#ifdef DEBUG
...
...
@@ -257,8 +251,11 @@ static struct task_struct *select_bad_process(unsigned long *ppoints,
*
ppoints
=
ULONG_MAX
;
}
if
(
p
->
oomkilladj
==
OOM_DISABLE
)
continue
;
points
=
badness
(
p
,
uptime
.
tv_sec
);
if
(
points
>
*
ppoints
)
{
if
(
points
>
*
ppoints
||
!
chosen
)
{
chosen
=
p
;
*
ppoints
=
points
;
}
...
...
@@ -307,7 +304,8 @@ static void dump_tasks(const struct mem_cgroup *mem)
}
printk
(
KERN_INFO
"[%5d] %5d %5d %8lu %8lu %3d %3d %s
\n
"
,
p
->
pid
,
__task_cred
(
p
)
->
uid
,
p
->
tgid
,
mm
->
total_vm
,
get_mm_rss
(
mm
),
(
int
)
task_cpu
(
p
),
mm
->
oom_adj
,
p
->
comm
);
get_mm_rss
(
mm
),
(
int
)
task_cpu
(
p
),
p
->
oomkilladj
,
p
->
comm
);
task_unlock
(
p
);
}
while_each_thread
(
g
,
p
);
}
...
...
@@ -325,8 +323,11 @@ static void __oom_kill_task(struct task_struct *p, int verbose)
return
;
}
if
(
!
p
->
mm
)
if
(
!
p
->
mm
)
{
WARN_ON
(
1
);
printk
(
KERN_WARNING
"tried to kill an mm-less task!
\n
"
);
return
;
}
if
(
verbose
)
printk
(
KERN_ERR
"Killed process %d (%s)
\n
"
,
...
...
@@ -348,13 +349,28 @@ static int oom_kill_task(struct task_struct *p)
struct
mm_struct
*
mm
;
struct
task_struct
*
g
,
*
q
;
task_lock
(
p
);
mm
=
p
->
mm
;
if
(
!
mm
||
mm
->
oom_adj
==
OOM_DISABLE
)
{
task_unlock
(
p
);
/* WARNING: mm may not be dereferenced since we did not obtain its
* value from get_task_mm(p). This is OK since all we need to do is
* compare mm to q->mm below.
*
* Furthermore, even if mm contains a non-NULL value, p->mm may
* change to NULL at any time since we do not hold task_lock(p).
* However, this is of no concern to us.
*/
if
(
mm
==
NULL
)
return
1
;
}
task_unlock
(
p
);
/*
* Don't kill the process if any threads are set to OOM_DISABLE
*/
do_each_thread
(
g
,
q
)
{
if
(
q
->
mm
==
mm
&&
q
->
oomkilladj
==
OOM_DISABLE
)
return
1
;
}
while_each_thread
(
g
,
q
);
__oom_kill_task
(
p
,
1
);
/*
...
...
@@ -377,11 +393,10 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
struct
task_struct
*
c
;
if
(
printk_ratelimit
())
{
task_lock
(
current
);
printk
(
KERN_WARNING
"%s invoked oom-killer: "
"gfp_mask=0x%x, order=%d, oom
_
adj=%d
\n
"
,
current
->
comm
,
gfp_mask
,
order
,
current
->
mm
?
current
->
mm
->
oom_adj
:
OOM_DISABLE
);
"gfp_mask=0x%x, order=%d, oom
kill
adj=%d
\n
"
,
current
->
comm
,
gfp_mask
,
order
,
current
->
oomkilladj
);
task_lock
(
current
);
cpuset_print_task_mems_allowed
(
current
);
task_unlock
(
current
);
dump_stack
();
...
...
@@ -394,9 +409,8 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
/*
* If the task is already exiting, don't alarm the sysadmin or kill
* its children or threads, just set TIF_MEMDIE so it can die quickly
* if its mm is still attached.
*/
if
(
p
->
mm
&&
(
p
->
flags
&
PF_EXITING
)
)
{
if
(
p
->
flags
&
PF_EXITING
)
{
__oom_kill_task
(
p
,
0
);
return
0
;
}
...
...
mm/page_alloc.c
浏览文件 @
39cf0518
...
...
@@ -2544,7 +2544,6 @@ static void build_zonelists(pg_data_t *pgdat)
prev_node
=
local_node
;
nodes_clear
(
used_mask
);
memset
(
node_load
,
0
,
sizeof
(
node_load
));
memset
(
node_order
,
0
,
sizeof
(
node_order
));
j
=
0
;
...
...
@@ -2653,6 +2652,9 @@ static int __build_all_zonelists(void *dummy)
{
int
nid
;
#ifdef CONFIG_NUMA
memset
(
node_load
,
0
,
sizeof
(
node_load
));
#endif
for_each_online_node
(
nid
)
{
pg_data_t
*
pgdat
=
NODE_DATA
(
nid
);
...
...
mm/percpu.c
浏览文件 @
39cf0518
...
...
@@ -8,12 +8,12 @@
*
* This is percpu allocator which can handle both static and dynamic
* areas. Percpu areas are allocated in chunks in vmalloc area. Each
* chunk is consisted of n
um_possible_cpus() units and the first chunk
*
is used for static percpu variables in the kernel image (special
*
boot time alloc/init handling necessary as these areas need to be
* b
rought up before allocation services are running). Unit grows as
*
necessary and all units grow or shrink in unison. When a chunk is
*
filled up,
another chunk is allocated. ie. in vmalloc area
* chunk is consisted of n
r_cpu_ids units and the first chunk is used
*
for static percpu variables in the kernel image (special boot time
*
alloc/init handling necessary as these areas need to be brought up
* b
efore allocation services are running). Unit grows as necessary
*
and all units grow or shrink in unison. When a chunk is filled up,
* another chunk is allocated. ie. in vmalloc area
*
* c0 c1 c2
* ------------------- ------------------- ------------
...
...
@@ -558,7 +558,7 @@ static void pcpu_free_area(struct pcpu_chunk *chunk, int freeme)
static
void
pcpu_unmap
(
struct
pcpu_chunk
*
chunk
,
int
page_start
,
int
page_end
,
bool
flush_tlb
)
{
unsigned
int
last
=
n
um_possible_cpus
()
-
1
;
unsigned
int
last
=
n
r_cpu_ids
-
1
;
unsigned
int
cpu
;
/* unmap must not be done on immutable chunk */
...
...
@@ -643,7 +643,7 @@ static void pcpu_depopulate_chunk(struct pcpu_chunk *chunk, int off, int size,
*/
static
int
pcpu_map
(
struct
pcpu_chunk
*
chunk
,
int
page_start
,
int
page_end
)
{
unsigned
int
last
=
n
um_possible_cpus
()
-
1
;
unsigned
int
last
=
n
r_cpu_ids
-
1
;
unsigned
int
cpu
;
int
err
;
...
...
@@ -749,7 +749,7 @@ static struct pcpu_chunk *alloc_pcpu_chunk(void)
chunk
->
map
[
chunk
->
map_used
++
]
=
pcpu_unit_size
;
chunk
->
page
=
chunk
->
page_ar
;
chunk
->
vm
=
get_vm_area
(
pcpu_chunk_size
,
GFP_KERNEL
);
chunk
->
vm
=
get_vm_area
(
pcpu_chunk_size
,
VM_ALLOC
);
if
(
!
chunk
->
vm
)
{
free_pcpu_chunk
(
chunk
);
return
NULL
;
...
...
@@ -1067,9 +1067,9 @@ size_t __init pcpu_setup_first_chunk(pcpu_get_page_fn_t get_page_fn,
PFN_UP
(
size_sum
));
pcpu_unit_size
=
pcpu_unit_pages
<<
PAGE_SHIFT
;
pcpu_chunk_size
=
n
um_possible_cpus
()
*
pcpu_unit_size
;
pcpu_chunk_size
=
n
r_cpu_ids
*
pcpu_unit_size
;
pcpu_chunk_struct_size
=
sizeof
(
struct
pcpu_chunk
)
+
n
um_possible_cpus
()
*
pcpu_unit_pages
*
sizeof
(
struct
page
*
);
+
n
r_cpu_ids
*
pcpu_unit_pages
*
sizeof
(
struct
page
*
);
if
(
dyn_size
<
0
)
dyn_size
=
pcpu_unit_size
-
static_size
-
reserved_size
;
...
...
@@ -1248,7 +1248,7 @@ ssize_t __init pcpu_embed_first_chunk(size_t static_size, size_t reserved_size,
}
else
pcpue_unit_size
=
max_t
(
size_t
,
pcpue_size
,
PCPU_MIN_UNIT_SIZE
);
chunk_size
=
pcpue_unit_size
*
n
um_possible_cpus
()
;
chunk_size
=
pcpue_unit_size
*
n
r_cpu_ids
;
pcpue_ptr
=
__alloc_bootmem_nopanic
(
chunk_size
,
PAGE_SIZE
,
__pa
(
MAX_DMA_ADDRESS
));
...
...
@@ -1259,12 +1259,15 @@ ssize_t __init pcpu_embed_first_chunk(size_t static_size, size_t reserved_size,
}
/* return the leftover and copy */
for
_each_possible_cpu
(
cpu
)
{
for
(
cpu
=
0
;
cpu
<
nr_cpu_ids
;
cpu
++
)
{
void
*
ptr
=
pcpue_ptr
+
cpu
*
pcpue_unit_size
;
free_bootmem
(
__pa
(
ptr
+
pcpue_size
),
pcpue_unit_size
-
pcpue_size
);
memcpy
(
ptr
,
__per_cpu_load
,
static_size
);
if
(
cpu_possible
(
cpu
))
{
free_bootmem
(
__pa
(
ptr
+
pcpue_size
),
pcpue_unit_size
-
pcpue_size
);
memcpy
(
ptr
,
__per_cpu_load
,
static_size
);
}
else
free_bootmem
(
__pa
(
ptr
),
pcpue_unit_size
);
}
/* we're ready, commit */
...
...
security/Kconfig
浏览文件 @
39cf0518
...
...
@@ -114,9 +114,9 @@ config SECURITY_ROOTPLUG
If you are unsure how to answer this question, answer N.
config LSM_MMAP_MIN_ADDR
int "Low address space for LSM to from user allocation"
int "Low address space for LSM to
protect
from user allocation"
depends on SECURITY && SECURITY_SELINUX
default 6553
5
default 6553
6
help
This is the portion of low virtual memory which should be protected
from userspace allocation. Keeping a user from writing to low pages
...
...
tools/perf/Documentation/Makefile
浏览文件 @
39cf0518
...
...
@@ -35,7 +35,7 @@ man7dir=$(mandir)/man7
# DESTDIR=
ASCIIDOC
=
asciidoc
ASCIIDOC_EXTRA
=
ASCIIDOC_EXTRA
=
--unsafe
MANPAGE_XSL
=
manpage-normal.xsl
XMLTO_EXTRA
=
INSTALL
?=
install
...
...
tools/perf/Documentation/
perf-
examples.txt
→
tools/perf/Documentation/examples.txt
浏览文件 @
39cf0518
文件已移动
tools/perf/builtin-annotate.c
浏览文件 @
39cf0518
...
...
@@ -980,6 +980,13 @@ process_fork_event(event_t *event, unsigned long offset, unsigned long head)
(
void
*
)(
long
)(
event
->
header
.
size
),
event
->
fork
.
pid
,
event
->
fork
.
ppid
);
/*
* A thread clone will have the same PID for both
* parent and child.
*/
if
(
thread
==
parent
)
return
0
;
if
(
!
thread
||
!
parent
||
thread__fork
(
thread
,
parent
))
{
dprintf
(
"problem processing PERF_EVENT_FORK, skipping event.
\n
"
);
return
-
1
;
...
...
tools/perf/builtin-record.c
浏览文件 @
39cf0518
...
...
@@ -219,7 +219,7 @@ static pid_t pid_synthesize_comm_event(pid_t pid, int full)
snprintf
(
filename
,
sizeof
(
filename
),
"/proc/%d/status"
,
pid
);
fp
=
fopen
(
filename
,
"r"
);
if
(
f
d
==
NULL
)
{
if
(
f
p
==
NULL
)
{
/*
* We raced with a task exiting - just return:
*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录