mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 02:19:51 +00:00
Merge branch 'master' into for-linus
This commit is contained in:
commit
b4093d6235
320 changed files with 10081 additions and 1958 deletions
2
CREDITS
2
CREDITS
|
@ -1856,7 +1856,7 @@ E: rfkoenig@immd4.informatik.uni-erlangen.de
|
|||
D: The Linux Support Team Erlangen
|
||||
|
||||
N: Andreas Koensgen
|
||||
E: ajk@iehk.rwth-aachen.de
|
||||
E: ajk@comnets.uni-bremen.de
|
||||
D: 6pack driver for AX.25
|
||||
|
||||
N: Harald Koerfgen
|
||||
|
|
|
@ -83,11 +83,12 @@ not detect it missed following items in original chain.
|
|||
obj = kmem_cache_alloc(...);
|
||||
lock_chain(); // typically a spin_lock()
|
||||
obj->key = key;
|
||||
atomic_inc(&obj->refcnt);
|
||||
/*
|
||||
* we need to make sure obj->key is updated before obj->next
|
||||
* or obj->refcnt
|
||||
*/
|
||||
smp_wmb();
|
||||
atomic_set(&obj->refcnt, 1);
|
||||
hlist_add_head_rcu(&obj->obj_node, list);
|
||||
unlock_chain(); // typically a spin_unlock()
|
||||
|
||||
|
@ -159,6 +160,10 @@ out:
|
|||
obj = kmem_cache_alloc(cachep);
|
||||
lock_chain(); // typically a spin_lock()
|
||||
obj->key = key;
|
||||
/*
|
||||
* changes to obj->key must be visible before refcnt one
|
||||
*/
|
||||
smp_wmb();
|
||||
atomic_set(&obj->refcnt, 1);
|
||||
/*
|
||||
* insert obj in RCU way (readers might be traversing chain)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* cn_test.c
|
||||
*
|
||||
* 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -194,5 +194,5 @@ module_init(cn_test_init);
|
|||
module_exit(cn_test_fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
|
||||
MODULE_DESCRIPTION("Connector's test module");
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* ucon.c
|
||||
*
|
||||
* Copyright (c) 2004+ Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
* Copyright (c) 2004+ Evgeniy Polyakov <zbr@ioremap.net>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
This is the 6pack-mini-HOWTO, written by
|
||||
|
||||
Andreas Könsgen DG3KQ
|
||||
Internet: ajk@iehk.rwth-aachen.de
|
||||
Internet: ajk@comnets.uni-bremen.de
|
||||
AMPR-net: dg3kq@db0pra.ampr.org
|
||||
AX.25: dg3kq@db0ach.#nrw.deu.eu
|
||||
|
||||
|
|
|
@ -101,6 +101,8 @@ card*/pcm*/xrun_debug
|
|||
bit 0 = Enable XRUN/jiffies debug messages
|
||||
bit 1 = Show stack trace at XRUN / jiffies check
|
||||
bit 2 = Enable additional jiffies check
|
||||
bit 3 = Log hwptr update at each period interrupt
|
||||
bit 4 = Log hwptr update at each snd_pcm_update_hw_ptr()
|
||||
|
||||
When the bit 0 is set, the driver will show the messages to
|
||||
kernel log when an xrun is detected. The debug message is
|
||||
|
@ -117,6 +119,9 @@ card*/pcm*/xrun_debug
|
|||
buggy) hardware that doesn't give smooth pointer updates.
|
||||
This feature is enabled via the bit 2.
|
||||
|
||||
Bits 3 and 4 are for logging the hwptr records. Note that
|
||||
these will give flood of kernel messages.
|
||||
|
||||
card*/pcm*/sub*/info
|
||||
The general information of this PCM sub-stream.
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
19 -> EM2860/SAA711X Reference Design (em2860)
|
||||
20 -> AMD ATI TV Wonder HD 600 (em2880) [0438:b002]
|
||||
21 -> eMPIA Technology, Inc. GrabBeeX+ Video Encoder (em2800) [eb1a:2801]
|
||||
22 -> Unknown EM2750/EM2751 webcam grabber (em2750) [eb1a:2750,eb1a:2751]
|
||||
22 -> EM2710/EM2750/EM2751 webcam grabber (em2750) [eb1a:2750,eb1a:2751]
|
||||
23 -> Huaqi DLCW-130 (em2750)
|
||||
24 -> D-Link DUB-T210 TV Tuner (em2820/em2840) [2001:f112]
|
||||
25 -> Gadmei UTV310 (em2820/em2840)
|
||||
|
|
|
@ -44,7 +44,9 @@ zc3xx 0458:7007 Genius VideoCam V2
|
|||
zc3xx 0458:700c Genius VideoCam V3
|
||||
zc3xx 0458:700f Genius VideoCam Web V2
|
||||
sonixj 0458:7025 Genius Eye 311Q
|
||||
sn9c20x 0458:7029 Genius Look 320s
|
||||
sonixj 0458:702e Genius Slim 310 NB
|
||||
sn9c20x 045e:00f4 LifeCam VX-6000 (SN9C20x + OV9650)
|
||||
sonixj 045e:00f5 MicroSoft VX3000
|
||||
sonixj 045e:00f7 MicroSoft VX1000
|
||||
ov519 045e:028c Micro$oft xbox cam
|
||||
|
@ -282,6 +284,28 @@ sonixj 0c45:613a Microdia Sonix PC Camera
|
|||
sonixj 0c45:613b Surfer SN-206
|
||||
sonixj 0c45:613c Sonix Pccam168
|
||||
sonixj 0c45:6143 Sonix Pccam168
|
||||
sn9c20x 0c45:6240 PC Camera (SN9C201 + MT9M001)
|
||||
sn9c20x 0c45:6242 PC Camera (SN9C201 + MT9M111)
|
||||
sn9c20x 0c45:6248 PC Camera (SN9C201 + OV9655)
|
||||
sn9c20x 0c45:624e PC Camera (SN9C201 + SOI968)
|
||||
sn9c20x 0c45:624f PC Camera (SN9C201 + OV9650)
|
||||
sn9c20x 0c45:6251 PC Camera (SN9C201 + OV9650)
|
||||
sn9c20x 0c45:6253 PC Camera (SN9C201 + OV9650)
|
||||
sn9c20x 0c45:6260 PC Camera (SN9C201 + OV7670)
|
||||
sn9c20x 0c45:6270 PC Camera (SN9C201 + MT9V011/MT9V111/MT9V112)
|
||||
sn9c20x 0c45:627b PC Camera (SN9C201 + OV7660)
|
||||
sn9c20x 0c45:627c PC Camera (SN9C201 + HV7131R)
|
||||
sn9c20x 0c45:627f PC Camera (SN9C201 + OV9650)
|
||||
sn9c20x 0c45:6280 PC Camera (SN9C202 + MT9M001)
|
||||
sn9c20x 0c45:6282 PC Camera (SN9C202 + MT9M111)
|
||||
sn9c20x 0c45:6288 PC Camera (SN9C202 + OV9655)
|
||||
sn9c20x 0c45:628e PC Camera (SN9C202 + SOI968)
|
||||
sn9c20x 0c45:628f PC Camera (SN9C202 + OV9650)
|
||||
sn9c20x 0c45:62a0 PC Camera (SN9C202 + OV7670)
|
||||
sn9c20x 0c45:62b0 PC Camera (SN9C202 + MT9V011/MT9V111/MT9V112)
|
||||
sn9c20x 0c45:62b3 PC Camera (SN9C202 + OV9655)
|
||||
sn9c20x 0c45:62bb PC Camera (SN9C202 + OV7660)
|
||||
sn9c20x 0c45:62bc PC Camera (SN9C202 + HV7131R)
|
||||
sunplus 0d64:0303 Sunplus FashionCam DXG
|
||||
etoms 102c:6151 Qcam Sangha CIF
|
||||
etoms 102c:6251 Qcam xxxxxx VGA
|
||||
|
@ -290,6 +314,7 @@ spca561 10fd:7e50 FlyCam Usb 100
|
|||
zc3xx 10fd:8050 Typhoon Webshot II USB 300k
|
||||
ov534 1415:2000 Sony HD Eye for PS3 (SLEH 00201)
|
||||
pac207 145f:013a Trust WB-1300N
|
||||
sn9c20x 145f:013d Trust WB-3600R
|
||||
vc032x 15b8:6001 HP 2.0 Megapixel
|
||||
vc032x 15b8:6002 HP 2.0 Megapixel rz406aa
|
||||
spca501 1776:501c Arowana 300K CMOS Camera
|
||||
|
@ -300,4 +325,11 @@ spca500 2899:012c Toptro Industrial
|
|||
spca508 8086:0110 Intel Easy PC Camera
|
||||
spca500 8086:0630 Intel Pocket PC Camera
|
||||
spca506 99fa:8988 Grandtec V.cap
|
||||
sn9c20x a168:0610 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
|
||||
sn9c20x a168:0611 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
|
||||
sn9c20x a168:0613 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
|
||||
sn9c20x a168:0618 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
|
||||
sn9c20x a168:0614 Dino-Lite Digital Microscope (SN9C201 + MT9M111)
|
||||
sn9c20x a168:0615 Dino-Lite Digital Microscope (SN9C201 + MT9M111)
|
||||
sn9c20x a168:0617 Dino-Lite Digital Microscope (SN9C201 + MT9M111)
|
||||
spca561 abcd:cdee Petcam
|
||||
|
|
11
MAINTAINERS
11
MAINTAINERS
|
@ -150,7 +150,7 @@ F: drivers/scsi/53c700*
|
|||
|
||||
6PACK NETWORK DRIVER FOR AX.25
|
||||
P: Andreas Koensgen
|
||||
M: ajk@iehk.rwth-aachen.de
|
||||
M: ajk@comnets.uni-bremen.de
|
||||
L: linux-hams@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/hamradio/6pack.c
|
||||
|
@ -1612,6 +1612,13 @@ S: Supported
|
|||
F: fs/configfs/
|
||||
F: include/linux/configfs.h
|
||||
|
||||
CONNECTOR
|
||||
P: Evgeniy Polyakov
|
||||
M: zbr@ioremap.net
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/connector/
|
||||
|
||||
CONTROL GROUPS (CGROUPS)
|
||||
P: Paul Menage
|
||||
M: menage@google.com
|
||||
|
@ -4089,6 +4096,7 @@ L: netfilter@vger.kernel.org
|
|||
L: coreteam@netfilter.org
|
||||
W: http://www.netfilter.org/
|
||||
W: http://www.iptables.org/
|
||||
T: git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6.git
|
||||
S: Supported
|
||||
F: include/linux/netfilter*
|
||||
F: include/linux/netfilter/
|
||||
|
@ -5586,7 +5594,6 @@ S: Odd Fixes
|
|||
F: drivers/net/starfire*
|
||||
|
||||
STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
|
||||
W: http://mosquitonet.Stanford.EDU/strip.html
|
||||
S: Orphan
|
||||
F: drivers/net/wireless/strip.c
|
||||
F: include/linux/if_strip.h
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 31
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Man-Eating Seals of Antiquity
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
#include <asm-generic/tlb.h>
|
||||
|
||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
||||
#define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
|
||||
#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, pte)
|
||||
#define __pmd_free_tlb(tlb, pmd, address) pmd_free((tlb)->mm, pmd)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -102,8 +102,8 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
|
|||
}
|
||||
|
||||
#define tlb_remove_page(tlb,page) free_page_and_swap_cache(page)
|
||||
#define pte_free_tlb(tlb, ptep) pte_free((tlb)->mm, ptep)
|
||||
#define pmd_free_tlb(tlb, pmdp) pmd_free((tlb)->mm, pmdp)
|
||||
#define pte_free_tlb(tlb, ptep, addr) pte_free((tlb)->mm, ptep)
|
||||
#define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp)
|
||||
|
||||
#define tlb_migrate_finish(mm) do { } while (0)
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
|||
quicklist_free_page(QUICK_PT, NULL, pte);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb,pte) \
|
||||
#define __pte_free_tlb(tlb,pte,addr) \
|
||||
do { \
|
||||
pgtable_page_dtor(pte); \
|
||||
tlb_remove_page((tlb), pte); \
|
||||
|
|
|
@ -47,7 +47,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
|||
__free_page(pte);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb,pte) \
|
||||
#define __pte_free_tlb(tlb,pte,address) \
|
||||
do { \
|
||||
pgtable_page_dtor(pte); \
|
||||
tlb_remove_page((tlb), pte); \
|
||||
|
|
|
@ -49,7 +49,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
|||
__free_page(pte);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb,pte) \
|
||||
#define __pte_free_tlb(tlb,pte,address) \
|
||||
do { \
|
||||
pgtable_page_dtor(pte); \
|
||||
tlb_remove_page((tlb),(pte)); \
|
||||
|
@ -62,7 +62,7 @@ do { \
|
|||
*/
|
||||
#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *) 2); })
|
||||
#define pmd_free(mm, x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb,x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb,x,a) do { } while (0)
|
||||
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
|
|
|
@ -225,7 +225,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
|
|||
*/
|
||||
#define pud_alloc_one(mm, address) NULL
|
||||
#define pud_free(mm, x) do { } while (0)
|
||||
#define __pud_free_tlb(tlb, x) do { } while (0)
|
||||
#define __pud_free_tlb(tlb, x, address) do { } while (0)
|
||||
|
||||
/*
|
||||
* The "pud_xxx()" functions here are trivial for a folded two-level
|
||||
|
|
|
@ -48,7 +48,7 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)
|
|||
{
|
||||
quicklist_free(0, NULL, pud);
|
||||
}
|
||||
#define __pud_free_tlb(tlb, pud) pud_free((tlb)->mm, pud)
|
||||
#define __pud_free_tlb(tlb, pud, address) pud_free((tlb)->mm, pud)
|
||||
#endif /* CONFIG_PGTABLE_4 */
|
||||
|
||||
static inline void
|
||||
|
@ -67,7 +67,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
|||
quicklist_free(0, NULL, pmd);
|
||||
}
|
||||
|
||||
#define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
|
||||
#define __pmd_free_tlb(tlb, pmd, address) pmd_free((tlb)->mm, pmd)
|
||||
|
||||
static inline void
|
||||
pmd_populate(struct mm_struct *mm, pmd_t * pmd_entry, pgtable_t pte)
|
||||
|
@ -117,6 +117,6 @@ static inline void check_pgt_cache(void)
|
|||
quicklist_trim(0, NULL, 25, 16);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
||||
#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, pte)
|
||||
|
||||
#endif /* _ASM_IA64_PGALLOC_H */
|
||||
|
|
|
@ -236,22 +236,22 @@ do { \
|
|||
__tlb_remove_tlb_entry(tlb, ptep, addr); \
|
||||
} while (0)
|
||||
|
||||
#define pte_free_tlb(tlb, ptep) \
|
||||
#define pte_free_tlb(tlb, ptep, address) \
|
||||
do { \
|
||||
tlb->need_flush = 1; \
|
||||
__pte_free_tlb(tlb, ptep); \
|
||||
__pte_free_tlb(tlb, ptep, address); \
|
||||
} while (0)
|
||||
|
||||
#define pmd_free_tlb(tlb, ptep) \
|
||||
#define pmd_free_tlb(tlb, ptep, address) \
|
||||
do { \
|
||||
tlb->need_flush = 1; \
|
||||
__pmd_free_tlb(tlb, ptep); \
|
||||
__pmd_free_tlb(tlb, ptep, address); \
|
||||
} while (0)
|
||||
|
||||
#define pud_free_tlb(tlb, pudp) \
|
||||
#define pud_free_tlb(tlb, pudp, address) \
|
||||
do { \
|
||||
tlb->need_flush = 1; \
|
||||
__pud_free_tlb(tlb, pudp); \
|
||||
__pud_free_tlb(tlb, pudp, address); \
|
||||
} while (0)
|
||||
|
||||
#endif /* _ASM_IA64_TLB_H */
|
||||
|
|
|
@ -58,7 +58,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
|||
__free_page(pte);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, (pte))
|
||||
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, (pte))
|
||||
|
||||
/*
|
||||
* allocating and freeing a pmd is trivial: the 1-entry pmd is
|
||||
|
@ -68,7 +68,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
|||
|
||||
#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *)2); })
|
||||
#define pmd_free(mm, x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb, x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb, x, addr) do { } while (0)
|
||||
#define pgd_populate(mm, pmd, pte) BUG()
|
||||
|
||||
#define check_pgt_cache() do { } while (0)
|
||||
|
|
|
@ -54,7 +54,8 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t page)
|
|||
__free_page(page);
|
||||
}
|
||||
|
||||
static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page)
|
||||
static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
|
||||
unsigned long address)
|
||||
{
|
||||
pgtable_page_dtor(page);
|
||||
cache_page(kmap(page));
|
||||
|
@ -73,7 +74,8 @@ static inline int pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
|||
return free_pointer_table(pmd);
|
||||
}
|
||||
|
||||
static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
||||
static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
||||
unsigned long address)
|
||||
{
|
||||
return free_pointer_table(pmd);
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t page)
|
|||
__free_page(page);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb,pte) \
|
||||
#define __pte_free_tlb(tlb,pte,addr) \
|
||||
do { \
|
||||
pgtable_page_dtor(pte); \
|
||||
tlb_remove_page((tlb), pte); \
|
||||
|
@ -80,7 +80,7 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page
|
|||
* inside the pgd, so has no extra memory associated with it.
|
||||
*/
|
||||
#define pmd_free(mm, x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb, x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb, x, addr) do { } while (0)
|
||||
|
||||
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
||||
{
|
||||
|
|
|
@ -6,14 +6,16 @@ endif
|
|||
|
||||
# What CPU vesion are we building for, and crack it open
|
||||
# as major.minor.rev
|
||||
CPU_VER=$(subst ",,$(CONFIG_XILINX_MICROBLAZE0_HW_VER) )
|
||||
CPU_MAJOR=$(shell echo $(CPU_VER) | cut -d '.' -f 1)
|
||||
CPU_MINOR=$(shell echo $(CPU_VER) | cut -d '.' -f 2)
|
||||
CPU_REV=$(shell echo $(CPU_VER) | cut -d '.' -f 3)
|
||||
CPU_VER := $(shell echo $(CONFIG_XILINX_MICROBLAZE0_HW_VER))
|
||||
CPU_MAJOR := $(shell echo $(CPU_VER) | cut -d '.' -f 1)
|
||||
CPU_MINOR := $(shell echo $(CPU_VER) | cut -d '.' -f 2)
|
||||
CPU_REV := $(shell echo $(CPU_VER) | cut -d '.' -f 3)
|
||||
|
||||
export CPU_VER CPU_MAJOR CPU_MINOR CPU_REV
|
||||
|
||||
# Use cpu-related CONFIG_ vars to set compile options.
|
||||
# The various CONFIG_XILINX cpu features options are integers 0/1/2...
|
||||
# rather than bools y/n
|
||||
|
||||
# Work out HW multipler support. This is icky.
|
||||
# 1. Spartan2 has no HW multiplers.
|
||||
|
@ -34,30 +36,29 @@ CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR) += -mxl-pattern-compare
|
|||
|
||||
CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER))
|
||||
|
||||
# The various CONFIG_XILINX cpu features options are integers 0/1/2...
|
||||
# rather than bools y/n
|
||||
|
||||
# r31 holds current when in kernel mode
|
||||
CFLAGS_KERNEL += -ffixed-r31 $(CPUFLAGS-1) $(CPUFLAGS-2)
|
||||
KBUILD_KERNEL += -ffixed-r31 $(CPUFLAGS-1) $(CPUFLAGS-2)
|
||||
|
||||
LDFLAGS :=
|
||||
LDFLAGS_vmlinux :=
|
||||
LDFLAGS_BLOB := --format binary --oformat elf32-microblaze
|
||||
|
||||
LIBGCC := $(shell $(CC) $(CFLAGS_KERNEL) -print-libgcc-file-name)
|
||||
LIBGCC := $(shell $(CC) $(KBUILD_KERNEL) -print-libgcc-file-name)
|
||||
|
||||
head-y := arch/microblaze/kernel/head.o
|
||||
libs-y += arch/microblaze/lib/ $(LIBGCC)
|
||||
core-y += arch/microblaze/kernel/ arch/microblaze/mm/ \
|
||||
arch/microblaze/platform/
|
||||
libs-y += arch/microblaze/lib/
|
||||
libs-y += $(LIBGCC)
|
||||
core-y += arch/microblaze/kernel/
|
||||
core-y += arch/microblaze/mm/
|
||||
core-y += arch/microblaze/platform/
|
||||
|
||||
boot := arch/$(ARCH)/boot
|
||||
boot := arch/microblaze/boot
|
||||
|
||||
# defines filename extension depending memory management type
|
||||
ifeq ($(CONFIG_MMU),)
|
||||
MMUEXT := -nommu
|
||||
MMU := -nommu
|
||||
endif
|
||||
export MMUEXT
|
||||
|
||||
export MMU
|
||||
|
||||
all: linux.bin
|
||||
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
#include <asm/byteorder.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <linux/mm.h> /* Get struct page {...} */
|
||||
|
||||
|
||||
|
|
|
@ -180,7 +180,7 @@ extern inline void pte_free(struct mm_struct *mm, struct page *ptepage)
|
|||
__free_page(ptepage);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, (pte))
|
||||
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, (pte))
|
||||
|
||||
#define pmd_populate(mm, pmd, pte) (pmd_val(*(pmd)) = page_address(pte))
|
||||
|
||||
|
@ -193,7 +193,7 @@ extern inline void pte_free(struct mm_struct *mm, struct page *ptepage)
|
|||
*/
|
||||
#define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); })
|
||||
/*#define pmd_free(mm, x) do { } while (0)*/
|
||||
#define __pmd_free_tlb(tlb, x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb, x, addr) do { } while (0)
|
||||
#define pgd_populate(mm, pmd, pte) BUG()
|
||||
|
||||
extern int do_check_pgt_cache(int, int);
|
||||
|
|
|
@ -185,6 +185,7 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
|
|||
|
||||
/* Definitions for MicroBlaze. */
|
||||
#define _PAGE_GUARDED 0x001 /* G: page is guarded from prefetch */
|
||||
#define _PAGE_FILE 0x001 /* when !present: nonlinear file mapping */
|
||||
#define _PAGE_PRESENT 0x002 /* software: PTE contains a translation */
|
||||
#define _PAGE_NO_CACHE 0x004 /* I: caching is inhibited */
|
||||
#define _PAGE_WRITETHRU 0x008 /* W: caching is write-through */
|
||||
|
@ -320,8 +321,7 @@ static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
|
|||
static inline int pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_EXEC; }
|
||||
static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
|
||||
static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
|
||||
/* FIXME */
|
||||
static inline int pte_file(pte_t pte) { return 0; }
|
||||
static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; }
|
||||
|
||||
static inline void pte_uncache(pte_t pte) { pte_val(pte) |= _PAGE_NO_CACHE; }
|
||||
static inline void pte_cache(pte_t pte) { pte_val(pte) &= ~_PAGE_NO_CACHE; }
|
||||
|
@ -488,7 +488,7 @@ static inline pmd_t *pmd_offset(pgd_t *dir, unsigned long address)
|
|||
/* Encode and decode a nonlinear file mapping entry */
|
||||
#define PTE_FILE_MAX_BITS 29
|
||||
#define pte_to_pgoff(pte) (pte_val(pte) >> 3)
|
||||
#define pgoff_to_pte(off) ((pte_t) { ((off) << 3) })
|
||||
#define pgoff_to_pte(off) ((pte_t) { ((off) << 3) | _PAGE_FILE })
|
||||
|
||||
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
||||
|
||||
|
|
|
@ -16,6 +16,18 @@
|
|||
#define _ASM_MICROBLAZE_PROM_H
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/* Definitions used by the flattened device tree */
|
||||
#define OF_DT_HEADER 0xd00dfeed /* marker */
|
||||
#define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */
|
||||
#define OF_DT_END_NODE 0x2 /* End node */
|
||||
#define OF_DT_PROP 0x3 /* Property: name off, size, content */
|
||||
#define OF_DT_NOP 0x4 /* nop */
|
||||
#define OF_DT_END 0x9
|
||||
|
||||
#define OF_DT_VERSION 0x10
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -29,16 +41,6 @@
|
|||
#define of_prop_cmp(s1, s2) strcmp((s1), (s2))
|
||||
#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
|
||||
|
||||
/* Definitions used by the flattened device tree */
|
||||
#define OF_DT_HEADER 0xd00dfeed /* marker */
|
||||
#define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */
|
||||
#define OF_DT_END_NODE 0x2 /* End node */
|
||||
#define OF_DT_PROP 0x3 /* Property: name off, size, content */
|
||||
#define OF_DT_NOP 0x4 /* nop */
|
||||
#define OF_DT_END 0x9
|
||||
|
||||
#define OF_DT_VERSION 0x10
|
||||
|
||||
/*
|
||||
* This is what gets passed to the kernel by prom_init or kexec
|
||||
*
|
||||
|
@ -309,5 +311,6 @@ extern void __iomem *of_iomap(struct device_node *device, int index);
|
|||
*/
|
||||
#include <linux/of.h>
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_MICROBLAZE_PROM_H */
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#ifndef _ASM_MICROBLAZE_TLB_H
|
||||
#define _ASM_MICROBLAZE_TLB_H
|
||||
|
||||
#define tlb_flush(tlb) do {} while (0)
|
||||
#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm)
|
||||
|
||||
#include <asm-generic/tlb.h>
|
||||
|
||||
|
|
|
@ -189,7 +189,7 @@ extern long strnlen_user(const char *src, long count);
|
|||
|
||||
#define __put_user(x, ptr) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) __gu_val = x; \
|
||||
__typeof__(*(ptr)) volatile __gu_val = (x); \
|
||||
long __gu_err = 0; \
|
||||
switch (sizeof(__gu_val)) { \
|
||||
case 1: \
|
||||
|
|
|
@ -17,4 +17,4 @@ obj-$(CONFIG_HEART_BEAT) += heartbeat.o
|
|||
obj-$(CONFIG_MODULES) += microblaze_ksyms.o module.o
|
||||
obj-$(CONFIG_MMU) += misc.o
|
||||
|
||||
obj-y += entry$(MMUEXT).o
|
||||
obj-y += entry$(MMU).o
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
#define CI(c, p) { ci->c = PVR_##p(pvr); }
|
||||
#define err_printk(x) \
|
||||
early_printk("ERROR: Microblaze " x " - different for PVR and DTS\n");
|
||||
early_printk("ERROR: Microblaze " x "-different for PVR and DTS\n");
|
||||
|
||||
void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu)
|
||||
{
|
||||
|
|
|
@ -18,7 +18,7 @@ static const char family_string[] = CONFIG_XILINX_MICROBLAZE0_FAMILY;
|
|||
static const char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER;
|
||||
|
||||
#define err_printk(x) \
|
||||
early_printk("ERROR: Microblaze " x "- different for kernel and DTS\n");
|
||||
early_printk("ERROR: Microblaze " x "-different for kernel and DTS\n");
|
||||
|
||||
void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu)
|
||||
{
|
||||
|
|
|
@ -26,6 +26,8 @@ const struct cpu_ver_key cpu_ver_lookup[] = {
|
|||
{"7.10.b", 0x09},
|
||||
{"7.10.c", 0x0a},
|
||||
{"7.10.d", 0x0b},
|
||||
{"7.20.a", 0x0c},
|
||||
{"7.20.b", 0x0d},
|
||||
/* FIXME There is no keycode defined in MBV for these versions */
|
||||
{"2.10.a", 0x10},
|
||||
{"3.00.a", 0x20},
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/prom.h> /* for OF_DT_HEADER */
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
#include <asm/setup.h> /* COMMAND_LINE_SIZE */
|
||||
|
@ -54,11 +55,19 @@ ENTRY(_start)
|
|||
andi r1, r1, ~2
|
||||
mts rmsr, r1
|
||||
|
||||
/* save fdt to kernel location */
|
||||
/* r7 stores pointer to fdt blob */
|
||||
beqi r7, no_fdt_arg
|
||||
/* r7 may point to an FDT, or there may be one linked in.
|
||||
if it's in r7, we've got to save it away ASAP.
|
||||
We ensure r7 points to a valid FDT, just in case the bootloader
|
||||
is broken or non-existent */
|
||||
beqi r7, no_fdt_arg /* NULL pointer? don't copy */
|
||||
lw r11, r0, r7 /* Does r7 point to a */
|
||||
rsubi r11, r11, OF_DT_HEADER /* valid FDT? */
|
||||
beqi r11, _prepare_copy_fdt
|
||||
or r7, r0, r0 /* clear R7 when not valid DTB */
|
||||
bnei r11, no_fdt_arg /* No - get out of here */
|
||||
_prepare_copy_fdt:
|
||||
or r11, r0, r0 /* incremment */
|
||||
ori r4, r0, TOPHYS(_fdt_start) /* save bram context */
|
||||
ori r4, r0, TOPHYS(_fdt_start)
|
||||
ori r3, r0, (0x4000 - 4)
|
||||
_copy_fdt:
|
||||
lw r12, r7, r11 /* r12 = r7 + r11 */
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/signal.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
/* Helpful Macros */
|
||||
|
@ -428,19 +429,9 @@ handle_unaligned_ex:
|
|||
mfs r17, rbtr; /* ESR[DS] set - return address in BTR */
|
||||
nop
|
||||
_no_delayslot:
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
/* Check if unaligned address is last on a 4k page */
|
||||
andi r5, r4, 0xffc
|
||||
xori r5, r5, 0xffc
|
||||
bnei r5, _unaligned_ex2
|
||||
_unaligned_ex1:
|
||||
/* jump to high level unaligned handler */
|
||||
RESTORE_STATE;
|
||||
/* Another page must be accessed or physical address not in page table */
|
||||
bri unaligned_data_trap
|
||||
|
||||
_unaligned_ex2:
|
||||
#endif
|
||||
andi r6, r3, 0x3E0; /* Mask and extract the register operand */
|
||||
srl r6, r6; /* r6 >> 5 */
|
||||
|
@ -450,45 +441,6 @@ _no_delayslot:
|
|||
srl r6, r6;
|
||||
/* Store the register operand in a temporary location */
|
||||
sbi r6, r0, TOPHYS(ex_reg_op);
|
||||
#ifdef CONFIG_MMU
|
||||
/* Get physical address */
|
||||
/* If we are faulting a kernel address, we have to use the
|
||||
* kernel page tables.
|
||||
*/
|
||||
ori r5, r0, CONFIG_KERNEL_START
|
||||
cmpu r5, r4, r5
|
||||
bgti r5, _unaligned_ex3
|
||||
ori r5, r0, swapper_pg_dir
|
||||
bri _unaligned_ex4
|
||||
|
||||
/* Get the PGD for the current thread. */
|
||||
_unaligned_ex3: /* user thread */
|
||||
addi r5 ,CURRENT_TASK, TOPHYS(0); /* get current task address */
|
||||
lwi r5, r5, TASK_THREAD + PGDIR
|
||||
_unaligned_ex4:
|
||||
tophys(r5,r5)
|
||||
BSRLI(r6,r4,20) /* Create L1 (pgdir/pmd) address */
|
||||
andi r6, r6, 0xffc
|
||||
/* Assume pgdir aligned on 4K boundary, no need for "andi r5,r5,0xfffff003" */
|
||||
or r5, r5, r6
|
||||
lwi r6, r5, 0 /* Get L1 entry */
|
||||
andi r5, r6, 0xfffff000 /* Extract L2 (pte) base address. */
|
||||
beqi r5, _unaligned_ex1 /* Bail if no table */
|
||||
|
||||
tophys(r5,r5)
|
||||
BSRLI(r6,r4,10) /* Compute PTE address */
|
||||
andi r6, r6, 0xffc
|
||||
andi r5, r5, 0xfffff003
|
||||
or r5, r5, r6
|
||||
lwi r5, r5, 0 /* Get Linux PTE */
|
||||
|
||||
andi r6, r5, _PAGE_PRESENT
|
||||
beqi r6, _unaligned_ex1 /* Bail if no page */
|
||||
|
||||
andi r5, r5, 0xfffff000 /* Extract RPN */
|
||||
andi r4, r4, 0x00000fff /* Extract offset */
|
||||
or r4, r4, r5 /* Create physical address */
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
andi r6, r3, 0x400; /* Extract ESR[S] */
|
||||
bnei r6, ex_sw;
|
||||
|
@ -959,15 +911,15 @@ _unaligned_data_exception:
|
|||
andi r6, r3, 0x800; /* Extract ESR[W] - delay slot */
|
||||
ex_lw_vm:
|
||||
beqid r6, ex_lhw_vm;
|
||||
lbui r5, r4, 0; /* Exception address in r4 - delay slot */
|
||||
load1: lbui r5, r4, 0; /* Exception address in r4 - delay slot */
|
||||
/* Load a word, byte-by-byte from destination address and save it in tmp space*/
|
||||
la r6, r0, ex_tmp_data_loc_0;
|
||||
sbi r5, r6, 0;
|
||||
lbui r5, r4, 1;
|
||||
load2: lbui r5, r4, 1;
|
||||
sbi r5, r6, 1;
|
||||
lbui r5, r4, 2;
|
||||
load3: lbui r5, r4, 2;
|
||||
sbi r5, r6, 2;
|
||||
lbui r5, r4, 3;
|
||||
load4: lbui r5, r4, 3;
|
||||
sbi r5, r6, 3;
|
||||
brid ex_lw_tail_vm;
|
||||
/* Get the destination register value into r3 - delay slot */
|
||||
|
@ -977,7 +929,7 @@ ex_lhw_vm:
|
|||
* save it in tmp space */
|
||||
la r6, r0, ex_tmp_data_loc_0;
|
||||
sbi r5, r6, 0;
|
||||
lbui r5, r4, 1;
|
||||
load5: lbui r5, r4, 1;
|
||||
sbi r5, r6, 1;
|
||||
lhui r3, r6, 0; /* Get the destination register value into r3 */
|
||||
ex_lw_tail_vm:
|
||||
|
@ -996,22 +948,53 @@ ex_sw_tail_vm:
|
|||
swi r3, r5, 0; /* Get the word - delay slot */
|
||||
/* Store the word, byte-by-byte into destination address */
|
||||
lbui r3, r5, 0;
|
||||
sbi r3, r4, 0;
|
||||
store1: sbi r3, r4, 0;
|
||||
lbui r3, r5, 1;
|
||||
sbi r3, r4, 1;
|
||||
store2: sbi r3, r4, 1;
|
||||
lbui r3, r5, 2;
|
||||
sbi r3, r4, 2;
|
||||
store3: sbi r3, r4, 2;
|
||||
lbui r3, r5, 3;
|
||||
brid ret_from_exc;
|
||||
sbi r3, r4, 3; /* Delay slot */
|
||||
store4: sbi r3, r4, 3; /* Delay slot */
|
||||
ex_shw_vm:
|
||||
/* Store the lower half-word, byte-by-byte into destination address */
|
||||
lbui r3, r5, 2;
|
||||
sbi r3, r4, 0;
|
||||
store5: sbi r3, r4, 0;
|
||||
lbui r3, r5, 3;
|
||||
brid ret_from_exc;
|
||||
sbi r3, r4, 1; /* Delay slot */
|
||||
store6: sbi r3, r4, 1; /* Delay slot */
|
||||
ex_sw_end_vm: /* Exception handling of store word, ends. */
|
||||
|
||||
/* We have to prevent cases that get/put_user macros get unaligned pointer
|
||||
* to bad page area. We have to find out which origin instruction caused it
|
||||
* and called fixup for that origin instruction not instruction in unaligned
|
||||
* handler */
|
||||
ex_unaligned_fixup:
|
||||
ori r5, r7, 0 /* setup pointer to pt_regs */
|
||||
lwi r6, r7, PT_PC; /* faulting address is one instruction above */
|
||||
addik r6, r6, -4 /* for finding proper fixup */
|
||||
swi r6, r7, PT_PC; /* a save back it to PT_PC */
|
||||
addik r7, r0, SIGSEGV
|
||||
/* call bad_page_fault for finding aligned fixup, fixup address is saved
|
||||
* in PT_PC which is used as return address from exception */
|
||||
la r15, r0, ret_from_exc-8 /* setup return address */
|
||||
brid bad_page_fault
|
||||
nop
|
||||
|
||||
/* We prevent all load/store because it could failed any attempt to access */
|
||||
.section __ex_table,"a";
|
||||
.word load1,ex_unaligned_fixup;
|
||||
.word load2,ex_unaligned_fixup;
|
||||
.word load3,ex_unaligned_fixup;
|
||||
.word load4,ex_unaligned_fixup;
|
||||
.word load5,ex_unaligned_fixup;
|
||||
.word store1,ex_unaligned_fixup;
|
||||
.word store2,ex_unaligned_fixup;
|
||||
.word store3,ex_unaligned_fixup;
|
||||
.word store4,ex_unaligned_fixup;
|
||||
.word store5,ex_unaligned_fixup;
|
||||
.word store6,ex_unaligned_fixup;
|
||||
.previous;
|
||||
.end _unaligned_data_exception
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
|
|
|
@ -57,7 +57,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
|||
Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
|
||||
Elf32_Sym *sym;
|
||||
unsigned long int *location;
|
||||
unsigned long int locoffs;
|
||||
unsigned long int value;
|
||||
#if __GNUC__ < 4
|
||||
unsigned long int old_value;
|
||||
|
@ -113,10 +112,12 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
|||
break;
|
||||
|
||||
case R_MICROBLAZE_64_PCREL:
|
||||
locoffs = (location[0] & 0xFFFF) << 16 |
|
||||
#if __GNUC__ < 4
|
||||
old_value = (location[0] & 0xFFFF) << 16 |
|
||||
(location[1] & 0xFFFF);
|
||||
value -= (unsigned long int)(location) + 4 +
|
||||
locoffs;
|
||||
value -= old_value;
|
||||
#endif
|
||||
value -= (unsigned long int)(location) + 4;
|
||||
location[0] = (location[0] & 0xFFFF0000) |
|
||||
(value >> 16);
|
||||
location[1] = (location[1] & 0xFFFF0000) |
|
||||
|
@ -125,6 +126,14 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
|||
value);
|
||||
break;
|
||||
|
||||
case R_MICROBLAZE_32_PCREL_LO:
|
||||
pr_debug("R_MICROBLAZE_32_PCREL_LO\n");
|
||||
break;
|
||||
|
||||
case R_MICROBLAZE_64_NONE:
|
||||
pr_debug("R_MICROBLAZE_NONE\n");
|
||||
break;
|
||||
|
||||
case R_MICROBLAZE_NONE:
|
||||
pr_debug("R_MICROBLAZE_NONE\n");
|
||||
break;
|
||||
|
@ -133,7 +142,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
|||
printk(KERN_ERR "module %s: "
|
||||
"Unknown relocation: %u\n",
|
||||
module->name,
|
||||
ELF32_R_TYPE(rela->r_info));
|
||||
ELF32_R_TYPE(rela[i].r_info));
|
||||
return -ENOEXEC;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -138,8 +138,12 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,
|
|||
setup_early_printk(NULL);
|
||||
#endif
|
||||
|
||||
early_printk("Ramdisk addr 0x%08x, FDT 0x%08x\n", ram, fdt);
|
||||
printk(KERN_NOTICE "Found FDT at 0x%08x\n", fdt);
|
||||
early_printk("Ramdisk addr 0x%08x, ", ram);
|
||||
if (fdt)
|
||||
early_printk("FDT at 0x%08x\n", fdt);
|
||||
else
|
||||
early_printk("Compiled-in FDT at 0x%08x\n",
|
||||
(unsigned int)_fdt_start);
|
||||
|
||||
#ifdef CONFIG_MTD_UCLINUX
|
||||
early_printk("Found romfs @ 0x%08x (0x%08x)\n",
|
||||
|
|
|
@ -33,105 +33,6 @@
|
|||
#include <linux/unistd.h>
|
||||
|
||||
#include <asm/syscalls.h>
|
||||
/*
|
||||
* sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
||||
*
|
||||
* This is really horribly ugly. This will be remove with new toolchain.
|
||||
*/
|
||||
asmlinkage long
|
||||
sys_ipc(uint call, int first, int second, int third, void *ptr, long fifth)
|
||||
{
|
||||
int version, ret;
|
||||
|
||||
version = call >> 16; /* hack for backward compatibility */
|
||||
call &= 0xffff;
|
||||
|
||||
ret = -EINVAL;
|
||||
switch (call) {
|
||||
case SEMOP:
|
||||
ret = sys_semop(first, (struct sembuf *)ptr, second);
|
||||
break;
|
||||
case SEMGET:
|
||||
ret = sys_semget(first, second, third);
|
||||
break;
|
||||
case SEMCTL:
|
||||
{
|
||||
union semun fourth;
|
||||
|
||||
if (!ptr)
|
||||
break;
|
||||
ret = (access_ok(VERIFY_READ, ptr, sizeof(long)) ? 0 : -EFAULT)
|
||||
|| (get_user(fourth.__pad, (void **)ptr)) ;
|
||||
if (ret)
|
||||
break;
|
||||
ret = sys_semctl(first, second, third, fourth);
|
||||
break;
|
||||
}
|
||||
case MSGSND:
|
||||
ret = sys_msgsnd(first, (struct msgbuf *) ptr, second, third);
|
||||
break;
|
||||
case MSGRCV:
|
||||
switch (version) {
|
||||
case 0: {
|
||||
struct ipc_kludge tmp;
|
||||
|
||||
if (!ptr)
|
||||
break;
|
||||
ret = (access_ok(VERIFY_READ, ptr, sizeof(tmp))
|
||||
? 0 : -EFAULT) || copy_from_user(&tmp,
|
||||
(struct ipc_kludge *) ptr, sizeof(tmp));
|
||||
if (ret)
|
||||
break;
|
||||
ret = sys_msgrcv(first, tmp.msgp, second, tmp.msgtyp,
|
||||
third);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ret = sys_msgrcv(first, (struct msgbuf *) ptr,
|
||||
second, fifth, third);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MSGGET:
|
||||
ret = sys_msgget((key_t) first, second);
|
||||
break;
|
||||
case MSGCTL:
|
||||
ret = sys_msgctl(first, second, (struct msqid_ds *) ptr);
|
||||
break;
|
||||
case SHMAT:
|
||||
switch (version) {
|
||||
default: {
|
||||
ulong raddr;
|
||||
ret = access_ok(VERIFY_WRITE, (ulong *) third,
|
||||
sizeof(ulong)) ? 0 : -EFAULT;
|
||||
if (ret)
|
||||
break;
|
||||
ret = do_shmat(first, (char *) ptr, second, &raddr);
|
||||
if (ret)
|
||||
break;
|
||||
ret = put_user(raddr, (ulong *) third);
|
||||
break;
|
||||
}
|
||||
case 1: /* iBCS2 emulator entry point */
|
||||
if (!segment_eq(get_fs(), get_ds()))
|
||||
break;
|
||||
ret = do_shmat(first, (char *) ptr, second,
|
||||
(ulong *) third);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SHMDT:
|
||||
ret = sys_shmdt((char *)ptr);
|
||||
break;
|
||||
case SHMGET:
|
||||
ret = sys_shmget(first, second, third);
|
||||
break;
|
||||
case SHMCTL:
|
||||
ret = sys_shmctl(first, second, (struct shmid_ds *) ptr);
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage long microblaze_vfork(struct pt_regs *regs)
|
||||
{
|
||||
|
|
|
@ -121,7 +121,7 @@ ENTRY(sys_call_table)
|
|||
.long sys_wait4
|
||||
.long sys_swapoff /* 115 */
|
||||
.long sys_sysinfo
|
||||
.long sys_ipc
|
||||
.long sys_ni_syscall /* old sys_ipc */
|
||||
.long sys_fsync
|
||||
.long sys_ni_syscall /* sys_sigreturn_wrapper */
|
||||
.long sys_clone /* 120 */
|
||||
|
|
|
@ -69,7 +69,7 @@ static int store_updates_sp(struct pt_regs *regs)
|
|||
* It is called from do_page_fault above and from some of the procedures
|
||||
* in traps.c.
|
||||
*/
|
||||
static void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
|
||||
void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
|
||||
{
|
||||
const struct exception_table_entry *fixup;
|
||||
/* MS: no context */
|
||||
|
@ -122,15 +122,10 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
|
|||
}
|
||||
#endif /* CONFIG_KGDB */
|
||||
|
||||
if (in_atomic() || mm == NULL) {
|
||||
/* FIXME */
|
||||
if (kernel_mode(regs)) {
|
||||
printk(KERN_EMERG
|
||||
"Page fault in kernel mode - Oooou!!! pid %d\n",
|
||||
current->pid);
|
||||
_exception(SIGSEGV, regs, code, address);
|
||||
return;
|
||||
}
|
||||
if (in_atomic() || !mm) {
|
||||
if (kernel_mode(regs))
|
||||
goto bad_area_nosemaphore;
|
||||
|
||||
/* in_atomic() in user mode is really bad,
|
||||
as is current->mm == NULL. */
|
||||
printk(KERN_EMERG "Page fault in user mode with "
|
||||
|
|
|
@ -98,23 +98,12 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
|||
__free_pages(pte, PTE_ORDER);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb,pte) \
|
||||
#define __pte_free_tlb(tlb,pte,address) \
|
||||
do { \
|
||||
pgtable_page_dtor(pte); \
|
||||
tlb_remove_page((tlb), pte); \
|
||||
} while (0)
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
|
||||
/*
|
||||
* allocating and freeing a pmd is trivial: the 1-entry pmd is
|
||||
* inside the pgd, so has no extra memory associated with it.
|
||||
*/
|
||||
#define pmd_free(mm, x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb, x) do { } while (0)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
|
||||
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||
|
@ -132,7 +121,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
|||
free_pages((unsigned long)pmd, PMD_ORDER);
|
||||
}
|
||||
|
||||
#define __pmd_free_tlb(tlb, x) pmd_free((tlb)->mm, x)
|
||||
#define __pmd_free_tlb(tlb, x, addr) pmd_free((tlb)->mm, x)
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -51,6 +51,6 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte)
|
|||
}
|
||||
|
||||
|
||||
#define __pte_free_tlb(tlb, pte) tlb_remove_page((tlb), (pte))
|
||||
#define __pte_free_tlb(tlb, pte, addr) tlb_remove_page((tlb), (pte))
|
||||
|
||||
#endif /* _ASM_PGALLOC_H */
|
||||
|
|
|
@ -21,7 +21,7 @@ do { if (!(tlb)->fullmm) \
|
|||
|
||||
#include <asm-generic/tlb.h>
|
||||
|
||||
#define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
|
||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
||||
#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd)
|
||||
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -16,7 +16,7 @@ extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
|
|||
*/
|
||||
/* #define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); }) */
|
||||
#define pmd_free(mm, x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb,x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb,x,a) do { } while (0)
|
||||
/* #define pgd_populate(mm, pmd, pte) BUG() */
|
||||
|
||||
#ifndef CONFIG_BOOKE
|
||||
|
|
|
@ -118,11 +118,11 @@ static inline void pgtable_free(pgtable_free_t pgf)
|
|||
kmem_cache_free(pgtable_cache[cachenum], p);
|
||||
}
|
||||
|
||||
#define __pmd_free_tlb(tlb, pmd) \
|
||||
#define __pmd_free_tlb(tlb, pmd,addr) \
|
||||
pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \
|
||||
PMD_CACHE_NUM, PMD_TABLE_SIZE-1))
|
||||
#ifndef CONFIG_PPC_64K_PAGES
|
||||
#define __pud_free_tlb(tlb, pud) \
|
||||
#define __pud_free_tlb(tlb, pud, addr) \
|
||||
pgtable_free_tlb(tlb, pgtable_free_cache(pud, \
|
||||
PUD_CACHE_NUM, PUD_TABLE_SIZE-1))
|
||||
#endif /* CONFIG_PPC_64K_PAGES */
|
||||
|
|
|
@ -38,14 +38,14 @@ static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum,
|
|||
extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define __pte_free_tlb(tlb,ptepage) \
|
||||
#define __pte_free_tlb(tlb,ptepage,address) \
|
||||
do { \
|
||||
pgtable_page_dtor(ptepage); \
|
||||
pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \
|
||||
PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1)); \
|
||||
} while (0)
|
||||
#else
|
||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, (pte))
|
||||
#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, (pte))
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -305,7 +305,7 @@ static void hugetlb_free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
|
|||
|
||||
pmd = pmd_offset(pud, start);
|
||||
pud_clear(pud);
|
||||
pmd_free_tlb(tlb, pmd);
|
||||
pmd_free_tlb(tlb, pmd, start);
|
||||
}
|
||||
|
||||
static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
|
||||
|
@ -348,7 +348,7 @@ static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
|
|||
|
||||
pud = pud_offset(pgd, start);
|
||||
pgd_clear(pgd);
|
||||
pud_free_tlb(tlb, pud);
|
||||
pud_free_tlb(tlb, pud, start);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -96,7 +96,8 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
|||
* pte_free_tlb frees a pte table and clears the CRSTE for the
|
||||
* page table from the tlb.
|
||||
*/
|
||||
static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte)
|
||||
static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
|
||||
unsigned long address)
|
||||
{
|
||||
if (!tlb->fullmm) {
|
||||
tlb->array[tlb->nr_ptes++] = pte;
|
||||
|
@ -113,7 +114,8 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte)
|
|||
* as the pgd. pmd_free_tlb checks the asce_limit against 2GB
|
||||
* to avoid the double free of the pmd in this case.
|
||||
*/
|
||||
static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
||||
static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
||||
unsigned long address)
|
||||
{
|
||||
#ifdef __s390x__
|
||||
if (tlb->mm->context.asce_limit <= (1UL << 31))
|
||||
|
@ -134,7 +136,8 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
|||
* as the pgd. pud_free_tlb checks the asce_limit against 4TB
|
||||
* to avoid the double free of the pud in this case.
|
||||
*/
|
||||
static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud)
|
||||
static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
|
||||
unsigned long address)
|
||||
{
|
||||
#ifdef __s390x__
|
||||
if (tlb->mm->context.asce_limit <= (1UL << 42))
|
||||
|
|
|
@ -210,7 +210,7 @@ static noinline __init void detect_machine_type(void)
|
|||
machine_flags |= MACHINE_FLAG_VM;
|
||||
}
|
||||
|
||||
static void early_pgm_check_handler(void)
|
||||
static __init void early_pgm_check_handler(void)
|
||||
{
|
||||
unsigned long addr;
|
||||
const struct exception_table_entry *fixup;
|
||||
|
@ -222,7 +222,7 @@ static void early_pgm_check_handler(void)
|
|||
S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE;
|
||||
}
|
||||
|
||||
void setup_lowcore_early(void)
|
||||
static noinline __init void setup_lowcore_early(void)
|
||||
{
|
||||
psw_t psw;
|
||||
|
||||
|
|
|
@ -687,13 +687,14 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
#ifndef CONFIG_64BIT
|
||||
if (MACHINE_HAS_IEEE)
|
||||
lowcore->extended_save_area_addr = (u32) save_area;
|
||||
#else
|
||||
if (vdso_alloc_per_cpu(smp_processor_id(), lowcore))
|
||||
BUG();
|
||||
#endif
|
||||
set_prefix((u32)(unsigned long) lowcore);
|
||||
local_mcck_enable();
|
||||
local_irq_enable();
|
||||
#ifdef CONFIG_64BIT
|
||||
if (vdso_alloc_per_cpu(smp_processor_id(), &S390_lowcore))
|
||||
BUG();
|
||||
#endif
|
||||
for_each_possible_cpu(cpu)
|
||||
if (cpu != smp_processor_id())
|
||||
smp_create_idle(cpu);
|
||||
|
|
|
@ -88,10 +88,17 @@ __kernel_clock_gettime:
|
|||
llilh %r4,0x0100
|
||||
sar %a4,%r4
|
||||
lghi %r4,0
|
||||
epsw %r5,0
|
||||
sacf 512 /* Magic ectg instruction */
|
||||
.insn ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4
|
||||
sacf 0
|
||||
sar %a4,%r2
|
||||
tml %r5,0x4000
|
||||
jo 11f
|
||||
tml %r5,0x8000
|
||||
jno 10f
|
||||
sacf 256
|
||||
j 11f
|
||||
10: sacf 0
|
||||
11: sar %a4,%r2
|
||||
algr %r1,%r0 /* r1 = cputime as TOD value */
|
||||
mghi %r1,1000 /* convert to nanoseconds */
|
||||
srlg %r1,%r1,12 /* r1 = cputime in nanosec */
|
||||
|
|
|
@ -7,24 +7,36 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <asm/system.h>
|
||||
|
||||
/*
|
||||
* save CPU registers before creating a hibernation image and before
|
||||
* restoring the memory state from it
|
||||
*/
|
||||
void save_processor_state(void)
|
||||
{
|
||||
/* implentation contained in the
|
||||
* swsusp_arch_suspend function
|
||||
/* swsusp_arch_suspend() actually saves all cpu register contents.
|
||||
* Machine checks must be disabled since swsusp_arch_suspend() stores
|
||||
* register contents to their lowcore save areas. That's the same
|
||||
* place where register contents on machine checks would be saved.
|
||||
* To avoid register corruption disable machine checks.
|
||||
* We must also disable machine checks in the new psw mask for
|
||||
* program checks, since swsusp_arch_suspend() may generate program
|
||||
* checks. Disabling machine checks for all other new psw masks is
|
||||
* just paranoia.
|
||||
*/
|
||||
local_mcck_disable();
|
||||
/* Disable lowcore protection */
|
||||
__ctl_clear_bit(0,28);
|
||||
S390_lowcore.external_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||
S390_lowcore.svc_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||
S390_lowcore.io_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||
S390_lowcore.program_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||
}
|
||||
|
||||
/*
|
||||
* restore the contents of CPU registers
|
||||
*/
|
||||
void restore_processor_state(void)
|
||||
{
|
||||
/* implentation contained in the
|
||||
* swsusp_arch_resume function
|
||||
*/
|
||||
S390_lowcore.external_new_psw.mask |= PSW_MASK_MCHECK;
|
||||
S390_lowcore.svc_new_psw.mask |= PSW_MASK_MCHECK;
|
||||
S390_lowcore.io_new_psw.mask |= PSW_MASK_MCHECK;
|
||||
S390_lowcore.program_new_psw.mask |= PSW_MASK_MCHECK;
|
||||
/* Enable lowcore protection */
|
||||
__ctl_set_bit(0,28);
|
||||
local_mcck_enable();
|
||||
}
|
||||
|
|
|
@ -32,19 +32,14 @@ swsusp_arch_suspend:
|
|||
/* Deactivate DAT */
|
||||
stnsm __SF_EMPTY(%r15),0xfb
|
||||
|
||||
/* Switch off lowcore protection */
|
||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
||||
ni __SF_EMPTY+4(%r15),0xef
|
||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
||||
|
||||
/* Store prefix register on stack */
|
||||
stpx __SF_EMPTY(%r15)
|
||||
|
||||
/* Setup base register for lowcore (absolute 0) */
|
||||
llgf %r1,__SF_EMPTY(%r15)
|
||||
/* Save prefix register contents for lowcore */
|
||||
llgf %r4,__SF_EMPTY(%r15)
|
||||
|
||||
/* Get pointer to save area */
|
||||
aghi %r1,0x1000
|
||||
lghi %r1,0x1000
|
||||
|
||||
/* Store registers */
|
||||
mvc 0x318(4,%r1),__SF_EMPTY(%r15) /* move prefix to lowcore */
|
||||
|
@ -79,17 +74,15 @@ swsusp_arch_suspend:
|
|||
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
||||
spx __SF_EMPTY(%r15)
|
||||
|
||||
/* Setup lowcore */
|
||||
brasl %r14,setup_lowcore_early
|
||||
lghi %r2,0
|
||||
lghi %r3,2*PAGE_SIZE
|
||||
lghi %r5,2*PAGE_SIZE
|
||||
1: mvcle %r2,%r4,0
|
||||
jo 1b
|
||||
|
||||
/* Save image */
|
||||
brasl %r14,swsusp_save
|
||||
|
||||
/* Switch on lowcore protection */
|
||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
||||
oi __SF_EMPTY+4(%r15),0x10
|
||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
||||
|
||||
/* Restore prefix register and return */
|
||||
lghi %r1,0x1000
|
||||
spx 0x318(%r1)
|
||||
|
@ -117,11 +110,6 @@ swsusp_arch_resume:
|
|||
/* Deactivate DAT */
|
||||
stnsm __SF_EMPTY(%r15),0xfb
|
||||
|
||||
/* Switch off lowcore protection */
|
||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
||||
ni __SF_EMPTY+4(%r15),0xef
|
||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
||||
|
||||
/* Set prefix page to zero */
|
||||
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
||||
spx __SF_EMPTY(%r15)
|
||||
|
@ -175,7 +163,7 @@ swsusp_arch_resume:
|
|||
/* Load old stack */
|
||||
lg %r15,0x2f8(%r13)
|
||||
|
||||
/* Pointer to save arae */
|
||||
/* Pointer to save area */
|
||||
lghi %r13,0x1000
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -187,11 +175,6 @@ swsusp_arch_resume:
|
|||
/* Restore prefix register */
|
||||
spx 0x318(%r13)
|
||||
|
||||
/* Switch on lowcore protection */
|
||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
||||
oi __SF_EMPTY+4(%r15),0x10
|
||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
||||
|
||||
/* Activate DAT */
|
||||
stosm __SF_EMPTY(%r15),0x04
|
||||
|
||||
|
|
|
@ -73,20 +73,12 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
|||
quicklist_free_page(QUICK_PT, NULL, pte);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb,pte) \
|
||||
#define __pte_free_tlb(tlb,pte,addr) \
|
||||
do { \
|
||||
pgtable_page_dtor(pte); \
|
||||
tlb_remove_page((tlb), (pte)); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* allocating and freeing a pmd is trivial: the 1-entry pmd is
|
||||
* inside the pgd, so has no extra memory associated with it.
|
||||
*/
|
||||
|
||||
#define pmd_free(mm, x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb,x) do { } while (0)
|
||||
|
||||
static inline void check_pgt_cache(void)
|
||||
{
|
||||
quicklist_trim(QUICK_PGD, NULL, 25, 16);
|
||||
|
|
|
@ -91,9 +91,9 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
|
|||
}
|
||||
|
||||
#define tlb_remove_page(tlb,page) free_page_and_swap_cache(page)
|
||||
#define pte_free_tlb(tlb, ptep) pte_free((tlb)->mm, ptep)
|
||||
#define pmd_free_tlb(tlb, pmdp) pmd_free((tlb)->mm, pmdp)
|
||||
#define pud_free_tlb(tlb, pudp) pud_free((tlb)->mm, pudp)
|
||||
#define pte_free_tlb(tlb, ptep, addr) pte_free((tlb)->mm, ptep)
|
||||
#define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp)
|
||||
#define pud_free_tlb(tlb, pudp, addr) pud_free((tlb)->mm, pudp)
|
||||
|
||||
#define tlb_migrate_finish(mm) do { } while (0)
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ BTFIXUPDEF_CALL(void, free_pmd_fast, pmd_t *)
|
|||
#define free_pmd_fast(pmd) BTFIXUP_CALL(free_pmd_fast)(pmd)
|
||||
|
||||
#define pmd_free(mm, pmd) free_pmd_fast(pmd)
|
||||
#define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
|
||||
#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd)
|
||||
|
||||
BTFIXUPDEF_CALL(void, pmd_populate, pmd_t *, struct page *)
|
||||
#define pmd_populate(MM, PMD, PTE) BTFIXUP_CALL(pmd_populate)(PMD, PTE)
|
||||
|
@ -63,6 +63,6 @@ BTFIXUPDEF_CALL(void, free_pte_fast, pte_t *)
|
|||
|
||||
BTFIXUPDEF_CALL(void, pte_free, pgtable_t )
|
||||
#define pte_free(mm, pte) BTFIXUP_CALL(pte_free)(pte)
|
||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
||||
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
|
||||
|
||||
#endif /* _SPARC_PGALLOC_H */
|
||||
|
|
|
@ -100,9 +100,9 @@ static inline void tlb_remove_page(struct mmu_gather *mp, struct page *page)
|
|||
}
|
||||
|
||||
#define tlb_remove_tlb_entry(mp,ptep,addr) do { } while (0)
|
||||
#define pte_free_tlb(mp, ptepage) pte_free((mp)->mm, ptepage)
|
||||
#define pmd_free_tlb(mp, pmdp) pmd_free((mp)->mm, pmdp)
|
||||
#define pud_free_tlb(tlb,pudp) __pud_free_tlb(tlb,pudp)
|
||||
#define pte_free_tlb(mp, ptepage, addr) pte_free((mp)->mm, ptepage)
|
||||
#define pmd_free_tlb(mp, pmdp, addr) pmd_free((mp)->mm, pmdp)
|
||||
#define pud_free_tlb(tlb,pudp, addr) __pud_free_tlb(tlb,pudp,addr)
|
||||
|
||||
#define tlb_migrate_finish(mm) do { } while (0)
|
||||
#define tlb_start_vma(tlb, vma) do { } while (0)
|
||||
|
|
|
@ -40,7 +40,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
|||
__free_page(pte);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb,pte) \
|
||||
#define __pte_free_tlb(tlb,pte, address) \
|
||||
do { \
|
||||
pgtable_page_dtor(pte); \
|
||||
tlb_remove_page((tlb),(pte)); \
|
||||
|
@ -53,7 +53,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
|||
free_page((unsigned long)pmd);
|
||||
}
|
||||
|
||||
#define __pmd_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x))
|
||||
#define __pmd_free_tlb(tlb,x, address) tlb_remove_page((tlb),virt_to_page(x))
|
||||
#endif
|
||||
|
||||
#define check_pgt_cache() do { } while (0)
|
||||
|
|
|
@ -116,11 +116,11 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
|||
__tlb_remove_tlb_entry(tlb, ptep, address); \
|
||||
} while (0)
|
||||
|
||||
#define pte_free_tlb(tlb, ptep) __pte_free_tlb(tlb, ptep)
|
||||
#define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr)
|
||||
|
||||
#define pud_free_tlb(tlb, pudp) __pud_free_tlb(tlb, pudp)
|
||||
#define pud_free_tlb(tlb, pudp, addr) __pud_free_tlb(tlb, pudp, addr)
|
||||
|
||||
#define pmd_free_tlb(tlb, pmdp) __pmd_free_tlb(tlb, pmdp)
|
||||
#define pmd_free_tlb(tlb, pmdp, addr) __pmd_free_tlb(tlb, pmdp, addr)
|
||||
|
||||
#define tlb_migrate_finish(mm) do {} while (0)
|
||||
|
||||
|
|
|
@ -46,7 +46,13 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte)
|
|||
__free_page(pte);
|
||||
}
|
||||
|
||||
extern void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte);
|
||||
extern void ___pte_free_tlb(struct mmu_gather *tlb, struct page *pte);
|
||||
|
||||
static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte,
|
||||
unsigned long address)
|
||||
{
|
||||
___pte_free_tlb(tlb, pte);
|
||||
}
|
||||
|
||||
static inline void pmd_populate_kernel(struct mm_struct *mm,
|
||||
pmd_t *pmd, pte_t *pte)
|
||||
|
@ -78,7 +84,13 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
|||
free_page((unsigned long)pmd);
|
||||
}
|
||||
|
||||
extern void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd);
|
||||
extern void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd);
|
||||
|
||||
static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
||||
unsigned long adddress)
|
||||
{
|
||||
___pmd_free_tlb(tlb, pmd);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_PAE
|
||||
extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
|
||||
|
@ -108,7 +120,14 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)
|
|||
free_page((unsigned long)pud);
|
||||
}
|
||||
|
||||
extern void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud);
|
||||
extern void ___pud_free_tlb(struct mmu_gather *tlb, pud_t *pud);
|
||||
|
||||
static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
|
||||
unsigned long address)
|
||||
{
|
||||
___pud_free_tlb(tlb, pud);
|
||||
}
|
||||
|
||||
#endif /* PAGETABLE_LEVELS > 3 */
|
||||
#endif /* PAGETABLE_LEVELS > 2 */
|
||||
|
||||
|
|
|
@ -212,9 +212,9 @@ extern int __get_user_bad(void);
|
|||
: "A" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx")
|
||||
#else
|
||||
#define __put_user_asm_u64(x, ptr, retval, errret) \
|
||||
__put_user_asm(x, ptr, retval, "q", "", "Zr", errret)
|
||||
__put_user_asm(x, ptr, retval, "q", "", "er", errret)
|
||||
#define __put_user_asm_ex_u64(x, addr) \
|
||||
__put_user_asm_ex(x, addr, "q", "", "Zr")
|
||||
__put_user_asm_ex(x, addr, "q", "", "er")
|
||||
#define __put_user_x8(x, ptr, __ret_pu) __put_user_x(8, x, ptr, __ret_pu)
|
||||
#endif
|
||||
|
||||
|
|
|
@ -88,11 +88,11 @@ int __copy_to_user(void __user *dst, const void *src, unsigned size)
|
|||
ret, "l", "k", "ir", 4);
|
||||
return ret;
|
||||
case 8:__put_user_asm(*(u64 *)src, (u64 __user *)dst,
|
||||
ret, "q", "", "ir", 8);
|
||||
ret, "q", "", "er", 8);
|
||||
return ret;
|
||||
case 10:
|
||||
__put_user_asm(*(u64 *)src, (u64 __user *)dst,
|
||||
ret, "q", "", "ir", 10);
|
||||
ret, "q", "", "er", 10);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
asm("":::"memory");
|
||||
|
@ -101,12 +101,12 @@ int __copy_to_user(void __user *dst, const void *src, unsigned size)
|
|||
return ret;
|
||||
case 16:
|
||||
__put_user_asm(*(u64 *)src, (u64 __user *)dst,
|
||||
ret, "q", "", "ir", 16);
|
||||
ret, "q", "", "er", 16);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
asm("":::"memory");
|
||||
__put_user_asm(1[(u64 *)src], 1 + (u64 __user *)dst,
|
||||
ret, "q", "", "ir", 8);
|
||||
ret, "q", "", "er", 8);
|
||||
return ret;
|
||||
default:
|
||||
return copy_user_generic((__force void *)dst, src, size);
|
||||
|
@ -157,7 +157,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
|
|||
ret, "q", "", "=r", 8);
|
||||
if (likely(!ret))
|
||||
__put_user_asm(tmp, (u64 __user *)dst,
|
||||
ret, "q", "", "ir", 8);
|
||||
ret, "q", "", "er", 8);
|
||||
return ret;
|
||||
}
|
||||
default:
|
||||
|
|
|
@ -356,7 +356,7 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
|
|||
#endif
|
||||
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI)
|
||||
/* check CPU config space for extended APIC ID */
|
||||
if (c->x86 >= 0xf) {
|
||||
if (cpu_has_apic && c->x86 >= 0xf) {
|
||||
unsigned int val;
|
||||
val = read_pci_config(0, 24, 0, 0x68);
|
||||
if ((val & ((1 << 17) | (1 << 18))) == ((1 << 17) | (1 << 18)))
|
||||
|
|
|
@ -1692,17 +1692,15 @@ static ssize_t set_trigger(struct sys_device *s, struct sysdev_attribute *attr,
|
|||
const char *buf, size_t siz)
|
||||
{
|
||||
char *p;
|
||||
int len;
|
||||
|
||||
strncpy(mce_helper, buf, sizeof(mce_helper));
|
||||
mce_helper[sizeof(mce_helper)-1] = 0;
|
||||
len = strlen(mce_helper);
|
||||
p = strchr(mce_helper, '\n');
|
||||
|
||||
if (*p)
|
||||
if (p)
|
||||
*p = 0;
|
||||
|
||||
return len;
|
||||
return strlen(mce_helper) + !!p;
|
||||
}
|
||||
|
||||
static ssize_t set_ignore_ce(struct sys_device *s,
|
||||
|
|
|
@ -65,6 +65,52 @@ static DEFINE_PER_CPU(struct cpu_hw_counters, cpu_hw_counters) = {
|
|||
.enabled = 1,
|
||||
};
|
||||
|
||||
/*
|
||||
* Not sure about some of these
|
||||
*/
|
||||
static const u64 p6_perfmon_event_map[] =
|
||||
{
|
||||
[PERF_COUNT_HW_CPU_CYCLES] = 0x0079,
|
||||
[PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0,
|
||||
[PERF_COUNT_HW_CACHE_REFERENCES] = 0x0000,
|
||||
[PERF_COUNT_HW_CACHE_MISSES] = 0x0000,
|
||||
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 0x00c4,
|
||||
[PERF_COUNT_HW_BRANCH_MISSES] = 0x00c5,
|
||||
[PERF_COUNT_HW_BUS_CYCLES] = 0x0062,
|
||||
};
|
||||
|
||||
static u64 p6_pmu_event_map(int event)
|
||||
{
|
||||
return p6_perfmon_event_map[event];
|
||||
}
|
||||
|
||||
/*
|
||||
* Counter setting that is specified not to count anything.
|
||||
* We use this to effectively disable a counter.
|
||||
*
|
||||
* L2_RQSTS with 0 MESI unit mask.
|
||||
*/
|
||||
#define P6_NOP_COUNTER 0x0000002EULL
|
||||
|
||||
static u64 p6_pmu_raw_event(u64 event)
|
||||
{
|
||||
#define P6_EVNTSEL_EVENT_MASK 0x000000FFULL
|
||||
#define P6_EVNTSEL_UNIT_MASK 0x0000FF00ULL
|
||||
#define P6_EVNTSEL_EDGE_MASK 0x00040000ULL
|
||||
#define P6_EVNTSEL_INV_MASK 0x00800000ULL
|
||||
#define P6_EVNTSEL_COUNTER_MASK 0xFF000000ULL
|
||||
|
||||
#define P6_EVNTSEL_MASK \
|
||||
(P6_EVNTSEL_EVENT_MASK | \
|
||||
P6_EVNTSEL_UNIT_MASK | \
|
||||
P6_EVNTSEL_EDGE_MASK | \
|
||||
P6_EVNTSEL_INV_MASK | \
|
||||
P6_EVNTSEL_COUNTER_MASK)
|
||||
|
||||
return event & P6_EVNTSEL_MASK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Intel PerfMon v3. Used on Core2 and later.
|
||||
*/
|
||||
|
@ -666,6 +712,7 @@ static int __hw_perf_counter_init(struct perf_counter *counter)
|
|||
{
|
||||
struct perf_counter_attr *attr = &counter->attr;
|
||||
struct hw_perf_counter *hwc = &counter->hw;
|
||||
u64 config;
|
||||
int err;
|
||||
|
||||
if (!x86_pmu_initialized())
|
||||
|
@ -718,14 +765,40 @@ static int __hw_perf_counter_init(struct perf_counter *counter)
|
|||
|
||||
if (attr->config >= x86_pmu.max_events)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* The generic map:
|
||||
*/
|
||||
hwc->config |= x86_pmu.event_map(attr->config);
|
||||
config = x86_pmu.event_map(attr->config);
|
||||
|
||||
if (config == 0)
|
||||
return -ENOENT;
|
||||
|
||||
if (config == -1LL)
|
||||
return -EINVAL;
|
||||
|
||||
hwc->config |= config;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void p6_pmu_disable_all(void)
|
||||
{
|
||||
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||
u64 val;
|
||||
|
||||
if (!cpuc->enabled)
|
||||
return;
|
||||
|
||||
cpuc->enabled = 0;
|
||||
barrier();
|
||||
|
||||
/* p6 only has one enable register */
|
||||
rdmsrl(MSR_P6_EVNTSEL0, val);
|
||||
val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||
wrmsrl(MSR_P6_EVNTSEL0, val);
|
||||
}
|
||||
|
||||
static void intel_pmu_disable_all(void)
|
||||
{
|
||||
wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0);
|
||||
|
@ -767,6 +840,23 @@ void hw_perf_disable(void)
|
|||
return x86_pmu.disable_all();
|
||||
}
|
||||
|
||||
static void p6_pmu_enable_all(void)
|
||||
{
|
||||
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||
unsigned long val;
|
||||
|
||||
if (cpuc->enabled)
|
||||
return;
|
||||
|
||||
cpuc->enabled = 1;
|
||||
barrier();
|
||||
|
||||
/* p6 only has one enable register */
|
||||
rdmsrl(MSR_P6_EVNTSEL0, val);
|
||||
val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||
wrmsrl(MSR_P6_EVNTSEL0, val);
|
||||
}
|
||||
|
||||
static void intel_pmu_enable_all(void)
|
||||
{
|
||||
wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, x86_pmu.intel_ctrl);
|
||||
|
@ -784,13 +874,13 @@ static void amd_pmu_enable_all(void)
|
|||
barrier();
|
||||
|
||||
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
||||
struct perf_counter *counter = cpuc->counters[idx];
|
||||
u64 val;
|
||||
|
||||
if (!test_bit(idx, cpuc->active_mask))
|
||||
continue;
|
||||
rdmsrl(MSR_K7_EVNTSEL0 + idx, val);
|
||||
if (val & ARCH_PERFMON_EVENTSEL0_ENABLE)
|
||||
continue;
|
||||
|
||||
val = counter->hw.config;
|
||||
val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||
wrmsrl(MSR_K7_EVNTSEL0 + idx, val);
|
||||
}
|
||||
|
@ -819,16 +909,13 @@ static inline void intel_pmu_ack_status(u64 ack)
|
|||
|
||||
static inline void x86_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
||||
{
|
||||
int err;
|
||||
err = checking_wrmsrl(hwc->config_base + idx,
|
||||
(void)checking_wrmsrl(hwc->config_base + idx,
|
||||
hwc->config | ARCH_PERFMON_EVENTSEL0_ENABLE);
|
||||
}
|
||||
|
||||
static inline void x86_pmu_disable_counter(struct hw_perf_counter *hwc, int idx)
|
||||
{
|
||||
int err;
|
||||
err = checking_wrmsrl(hwc->config_base + idx,
|
||||
hwc->config);
|
||||
(void)checking_wrmsrl(hwc->config_base + idx, hwc->config);
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
@ -836,13 +923,24 @@ intel_pmu_disable_fixed(struct hw_perf_counter *hwc, int __idx)
|
|||
{
|
||||
int idx = __idx - X86_PMC_IDX_FIXED;
|
||||
u64 ctrl_val, mask;
|
||||
int err;
|
||||
|
||||
mask = 0xfULL << (idx * 4);
|
||||
|
||||
rdmsrl(hwc->config_base, ctrl_val);
|
||||
ctrl_val &= ~mask;
|
||||
err = checking_wrmsrl(hwc->config_base, ctrl_val);
|
||||
(void)checking_wrmsrl(hwc->config_base, ctrl_val);
|
||||
}
|
||||
|
||||
static inline void
|
||||
p6_pmu_disable_counter(struct hw_perf_counter *hwc, int idx)
|
||||
{
|
||||
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||
u64 val = P6_NOP_COUNTER;
|
||||
|
||||
if (cpuc->enabled)
|
||||
val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||
|
||||
(void)checking_wrmsrl(hwc->config_base + idx, val);
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
@ -943,6 +1041,19 @@ intel_pmu_enable_fixed(struct hw_perf_counter *hwc, int __idx)
|
|||
err = checking_wrmsrl(hwc->config_base, ctrl_val);
|
||||
}
|
||||
|
||||
static void p6_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
||||
{
|
||||
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||
u64 val;
|
||||
|
||||
val = hwc->config;
|
||||
if (cpuc->enabled)
|
||||
val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||
|
||||
(void)checking_wrmsrl(hwc->config_base + idx, val);
|
||||
}
|
||||
|
||||
|
||||
static void intel_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
||||
{
|
||||
if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) {
|
||||
|
@ -959,8 +1070,6 @@ static void amd_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
|||
|
||||
if (cpuc->enabled)
|
||||
x86_pmu_enable_counter(hwc, idx);
|
||||
else
|
||||
x86_pmu_disable_counter(hwc, idx);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1176,6 +1285,49 @@ static void intel_pmu_reset(void)
|
|||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static int p6_pmu_handle_irq(struct pt_regs *regs)
|
||||
{
|
||||
struct perf_sample_data data;
|
||||
struct cpu_hw_counters *cpuc;
|
||||
struct perf_counter *counter;
|
||||
struct hw_perf_counter *hwc;
|
||||
int idx, handled = 0;
|
||||
u64 val;
|
||||
|
||||
data.regs = regs;
|
||||
data.addr = 0;
|
||||
|
||||
cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||
|
||||
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
||||
if (!test_bit(idx, cpuc->active_mask))
|
||||
continue;
|
||||
|
||||
counter = cpuc->counters[idx];
|
||||
hwc = &counter->hw;
|
||||
|
||||
val = x86_perf_counter_update(counter, hwc, idx);
|
||||
if (val & (1ULL << (x86_pmu.counter_bits - 1)))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* counter overflow
|
||||
*/
|
||||
handled = 1;
|
||||
data.period = counter->hw.last_period;
|
||||
|
||||
if (!x86_perf_counter_set_period(counter, hwc, idx))
|
||||
continue;
|
||||
|
||||
if (perf_counter_overflow(counter, 1, &data))
|
||||
p6_pmu_disable_counter(hwc, idx);
|
||||
}
|
||||
|
||||
if (handled)
|
||||
inc_irq_stat(apic_perf_irqs);
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
||||
/*
|
||||
* This handler is triggered by the local APIC, so the APIC IRQ handling
|
||||
|
@ -1185,14 +1337,13 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
|
|||
{
|
||||
struct perf_sample_data data;
|
||||
struct cpu_hw_counters *cpuc;
|
||||
int bit, cpu, loops;
|
||||
int bit, loops;
|
||||
u64 ack, status;
|
||||
|
||||
data.regs = regs;
|
||||
data.addr = 0;
|
||||
|
||||
cpu = smp_processor_id();
|
||||
cpuc = &per_cpu(cpu_hw_counters, cpu);
|
||||
cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||
|
||||
perf_disable();
|
||||
status = intel_pmu_get_status();
|
||||
|
@ -1249,14 +1400,13 @@ static int amd_pmu_handle_irq(struct pt_regs *regs)
|
|||
struct cpu_hw_counters *cpuc;
|
||||
struct perf_counter *counter;
|
||||
struct hw_perf_counter *hwc;
|
||||
int cpu, idx, handled = 0;
|
||||
int idx, handled = 0;
|
||||
u64 val;
|
||||
|
||||
data.regs = regs;
|
||||
data.addr = 0;
|
||||
|
||||
cpu = smp_processor_id();
|
||||
cpuc = &per_cpu(cpu_hw_counters, cpu);
|
||||
cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||
|
||||
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
||||
if (!test_bit(idx, cpuc->active_mask))
|
||||
|
@ -1353,6 +1503,32 @@ static __read_mostly struct notifier_block perf_counter_nmi_notifier = {
|
|||
.priority = 1
|
||||
};
|
||||
|
||||
static struct x86_pmu p6_pmu = {
|
||||
.name = "p6",
|
||||
.handle_irq = p6_pmu_handle_irq,
|
||||
.disable_all = p6_pmu_disable_all,
|
||||
.enable_all = p6_pmu_enable_all,
|
||||
.enable = p6_pmu_enable_counter,
|
||||
.disable = p6_pmu_disable_counter,
|
||||
.eventsel = MSR_P6_EVNTSEL0,
|
||||
.perfctr = MSR_P6_PERFCTR0,
|
||||
.event_map = p6_pmu_event_map,
|
||||
.raw_event = p6_pmu_raw_event,
|
||||
.max_events = ARRAY_SIZE(p6_perfmon_event_map),
|
||||
.max_period = (1ULL << 31) - 1,
|
||||
.version = 0,
|
||||
.num_counters = 2,
|
||||
/*
|
||||
* Counters have 40 bits implemented. However they are designed such
|
||||
* that bits [32-39] are sign extensions of bit 31. As such the
|
||||
* effective width of a counter for P6-like PMU is 32 bits only.
|
||||
*
|
||||
* See IA-32 Intel Architecture Software developer manual Vol 3B
|
||||
*/
|
||||
.counter_bits = 32,
|
||||
.counter_mask = (1ULL << 32) - 1,
|
||||
};
|
||||
|
||||
static struct x86_pmu intel_pmu = {
|
||||
.name = "Intel",
|
||||
.handle_irq = intel_pmu_handle_irq,
|
||||
|
@ -1392,6 +1568,37 @@ static struct x86_pmu amd_pmu = {
|
|||
.max_period = (1ULL << 47) - 1,
|
||||
};
|
||||
|
||||
static int p6_pmu_init(void)
|
||||
{
|
||||
switch (boot_cpu_data.x86_model) {
|
||||
case 1:
|
||||
case 3: /* Pentium Pro */
|
||||
case 5:
|
||||
case 6: /* Pentium II */
|
||||
case 7:
|
||||
case 8:
|
||||
case 11: /* Pentium III */
|
||||
break;
|
||||
case 9:
|
||||
case 13:
|
||||
/* Pentium M */
|
||||
break;
|
||||
default:
|
||||
pr_cont("unsupported p6 CPU model %d ",
|
||||
boot_cpu_data.x86_model);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!cpu_has_apic) {
|
||||
pr_info("no Local APIC, try rebooting with lapic");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
x86_pmu = p6_pmu;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_pmu_init(void)
|
||||
{
|
||||
union cpuid10_edx edx;
|
||||
|
@ -1400,8 +1607,14 @@ static int intel_pmu_init(void)
|
|||
unsigned int ebx;
|
||||
int version;
|
||||
|
||||
if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON))
|
||||
if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) {
|
||||
/* check for P6 processor family */
|
||||
if (boot_cpu_data.x86 == 6) {
|
||||
return p6_pmu_init();
|
||||
} else {
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether the Architectural PerfMon supports
|
||||
|
|
|
@ -187,7 +187,7 @@ static void __init apic_intr_init(void)
|
|||
#ifdef CONFIG_X86_THERMAL_VECTOR
|
||||
alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
|
||||
#endif
|
||||
#ifdef CONFIG_X86_THRESHOLD
|
||||
#ifdef CONFIG_X86_MCE_THRESHOLD
|
||||
alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt);
|
||||
#endif
|
||||
#if defined(CONFIG_X86_NEW_MCE) && defined(CONFIG_X86_LOCAL_APIC)
|
||||
|
|
|
@ -347,7 +347,7 @@ static irqreturn_t mfgpt_tick(int irq, void *dev_id)
|
|||
|
||||
static struct irqaction mfgptirq = {
|
||||
.handler = mfgpt_tick,
|
||||
.flags = IRQF_DISABLED | IRQF_NOBALANCING,
|
||||
.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER,
|
||||
.name = "mfgpt-timer"
|
||||
};
|
||||
|
||||
|
|
|
@ -249,6 +249,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-Z540N"),
|
||||
},
|
||||
},
|
||||
{ /* Handle problems with rebooting on CompuLab SBC-FITPC2 */
|
||||
.callback = set_bios_reboot,
|
||||
.ident = "CompuLab SBC-FITPC2",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "CompuLab"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "SBC-FITPC2"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
@ -672,6 +672,19 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
|
|||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/*
|
||||
* AMI BIOS with low memory corruption was found on Intel DG45ID board.
|
||||
* It hase different DMI_BIOS_VENDOR = "Intel Corp.", for now we will
|
||||
* match only DMI_BOARD_NAME and see if there is more bad products
|
||||
* with this vendor.
|
||||
*/
|
||||
.callback = dmi_low_memory_corruption,
|
||||
.ident = "AMI BIOS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "DG45ID"),
|
||||
},
|
||||
},
|
||||
#endif
|
||||
{}
|
||||
};
|
||||
|
|
|
@ -112,11 +112,6 @@ SECTIONS
|
|||
_sdata = .;
|
||||
DATA_DATA
|
||||
CONSTRUCTORS
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/* End of data section */
|
||||
_edata = .;
|
||||
#endif
|
||||
} :data
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
@ -156,10 +151,8 @@ SECTIONS
|
|||
.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
|
||||
*(.data.read_mostly)
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
/* End of data section */
|
||||
_edata = .;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
|
|
@ -25,7 +25,7 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
|
|||
return pte;
|
||||
}
|
||||
|
||||
void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte)
|
||||
void ___pte_free_tlb(struct mmu_gather *tlb, struct page *pte)
|
||||
{
|
||||
pgtable_page_dtor(pte);
|
||||
paravirt_release_pte(page_to_pfn(pte));
|
||||
|
@ -33,14 +33,14 @@ void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte)
|
|||
}
|
||||
|
||||
#if PAGETABLE_LEVELS > 2
|
||||
void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
||||
void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
||||
{
|
||||
paravirt_release_pmd(__pa(pmd) >> PAGE_SHIFT);
|
||||
tlb_remove_page(tlb, virt_to_page(pmd));
|
||||
}
|
||||
|
||||
#if PAGETABLE_LEVELS > 3
|
||||
void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud)
|
||||
void ___pud_free_tlb(struct mmu_gather *tlb, pud_t *pud)
|
||||
{
|
||||
paravirt_release_pud(__pa(pud) >> PAGE_SHIFT);
|
||||
tlb_remove_page(tlb, virt_to_page(pud));
|
||||
|
|
|
@ -79,8 +79,10 @@ static __init void bad_srat(void)
|
|||
acpi_numa = -1;
|
||||
for (i = 0; i < MAX_LOCAL_APIC; i++)
|
||||
apicid_to_node[i] = NUMA_NO_NODE;
|
||||
for (i = 0; i < MAX_NUMNODES; i++)
|
||||
nodes_add[i].start = nodes[i].end = 0;
|
||||
for (i = 0; i < MAX_NUMNODES; i++) {
|
||||
nodes[i].start = nodes[i].end = 0;
|
||||
nodes_add[i].start = nodes_add[i].end = 0;
|
||||
}
|
||||
remove_all_active_ranges();
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,6 @@
|
|||
|
||||
#include <asm-generic/tlb.h>
|
||||
|
||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
||||
#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, pte)
|
||||
|
||||
#endif /* _XTENSA_TLB_H */
|
||||
|
|
|
@ -16,9 +16,9 @@ struct queue_sysfs_entry {
|
|||
};
|
||||
|
||||
static ssize_t
|
||||
queue_var_show(unsigned int var, char *page)
|
||||
queue_var_show(unsigned long var, char *page)
|
||||
{
|
||||
return sprintf(page, "%d\n", var);
|
||||
return sprintf(page, "%lu\n", var);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
|
@ -77,7 +77,8 @@ queue_requests_store(struct request_queue *q, const char *page, size_t count)
|
|||
|
||||
static ssize_t queue_ra_show(struct request_queue *q, char *page)
|
||||
{
|
||||
int ra_kb = q->backing_dev_info.ra_pages << (PAGE_CACHE_SHIFT - 10);
|
||||
unsigned long ra_kb = q->backing_dev_info.ra_pages <<
|
||||
(PAGE_CACHE_SHIFT - 10);
|
||||
|
||||
return queue_var_show(ra_kb, (page));
|
||||
}
|
||||
|
@ -189,9 +190,9 @@ static ssize_t queue_nomerges_store(struct request_queue *q, const char *page,
|
|||
|
||||
static ssize_t queue_rq_affinity_show(struct request_queue *q, char *page)
|
||||
{
|
||||
unsigned int set = test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags);
|
||||
bool set = test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags);
|
||||
|
||||
return queue_var_show(set != 0, page);
|
||||
return queue_var_show(set, page);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
|
|
|
@ -101,11 +101,16 @@ int elv_rq_merge_ok(struct request *rq, struct bio *bio)
|
|||
return 0;
|
||||
|
||||
/*
|
||||
* Don't merge if failfast settings don't match
|
||||
* Don't merge if failfast settings don't match.
|
||||
*
|
||||
* FIXME: The negation in front of each condition is necessary
|
||||
* because bio and request flags use different bit positions
|
||||
* and the accessors return those bits directly. This
|
||||
* ugliness will soon go away.
|
||||
*/
|
||||
if (bio_failfast_dev(bio) != blk_failfast_dev(rq) ||
|
||||
bio_failfast_transport(bio) != blk_failfast_transport(rq) ||
|
||||
bio_failfast_driver(bio) != blk_failfast_driver(rq))
|
||||
if (!bio_failfast_dev(bio) != !blk_failfast_dev(rq) ||
|
||||
!bio_failfast_transport(bio) != !blk_failfast_transport(rq) ||
|
||||
!bio_failfast_driver(bio) != !blk_failfast_driver(rq))
|
||||
return 0;
|
||||
|
||||
if (!elv_iosched_allow_merge(rq, bio))
|
||||
|
|
|
@ -1627,7 +1627,7 @@ static int fd_ioctl(struct block_device *bdev, fmode_t mode,
|
|||
drive, dtp->blocks, dtp->spt, dtp->stretch);
|
||||
|
||||
/* sanity check */
|
||||
if (!dtp || setprm.track != dtp->blocks/dtp->spt/2 ||
|
||||
if (setprm.track != dtp->blocks/dtp->spt/2 ||
|
||||
setprm.head != 2) {
|
||||
redo_fd_request();
|
||||
return -EINVAL;
|
||||
|
|
|
@ -427,7 +427,12 @@ static unsigned int features[] = {
|
|||
VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_IDENTIFY
|
||||
};
|
||||
|
||||
static struct virtio_driver virtio_blk = {
|
||||
/*
|
||||
* virtio_blk causes spurious section mismatch warning by
|
||||
* simultaneously referring to a __devinit and a __devexit function.
|
||||
* Use __refdata to avoid this warning.
|
||||
*/
|
||||
static struct virtio_driver __refdata virtio_blk = {
|
||||
.feature_table = features,
|
||||
.feature_table_size = ARRAY_SIZE(features),
|
||||
.driver.name = KBUILD_MODNAME,
|
||||
|
|
|
@ -374,7 +374,7 @@ z2_init(void)
|
|||
static void __exit z2_exit(void)
|
||||
{
|
||||
int i, j;
|
||||
blk_unregister_region(MKDEV(Z2RAM_MAJOR, 0), 256);
|
||||
blk_unregister_region(MKDEV(Z2RAM_MAJOR, 0), Z2MINOR_COUNT);
|
||||
unregister_blkdev(Z2RAM_MAJOR, DEVICE_NAME);
|
||||
del_gendisk(z2ram_gendisk);
|
||||
put_disk(z2ram_gendisk);
|
||||
|
|
|
@ -52,6 +52,7 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
|
|||
return;
|
||||
tty->link->packet = 0;
|
||||
set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
|
||||
tty_flip_buffer_push(tty->link);
|
||||
wake_up_interruptible(&tty->link->read_wait);
|
||||
wake_up_interruptible(&tty->link->write_wait);
|
||||
if (tty->driver->subtype == PTY_TYPE_MASTER) {
|
||||
|
@ -207,6 +208,7 @@ static int pty_open(struct tty_struct *tty, struct file *filp)
|
|||
clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
|
||||
set_bit(TTY_THROTTLED, &tty->flags);
|
||||
retval = 0;
|
||||
tty->low_latency = 1;
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* cn_queue.c
|
||||
*
|
||||
* 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* connector.c
|
||||
*
|
||||
* 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -33,7 +33,7 @@
|
|||
#include <net/sock.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
|
||||
MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
|
||||
|
||||
static u32 cn_idx = CN_IDX_CONNECTOR;
|
||||
|
|
|
@ -970,7 +970,7 @@ static void amd64_read_dct_base_mask(struct amd64_pvt *pvt)
|
|||
}
|
||||
|
||||
for (cs = 0; cs < pvt->num_dcsm; cs++) {
|
||||
reg = K8_DCSB0 + (cs * 4);
|
||||
reg = K8_DCSM0 + (cs * 4);
|
||||
err = pci_read_config_dword(pvt->dram_f2_ctl, reg,
|
||||
&pvt->dcsm0[cs]);
|
||||
if (unlikely(err))
|
||||
|
|
|
@ -1075,14 +1075,16 @@ EXPORT_SYMBOL_GPL(hid_report_raw_event);
|
|||
*/
|
||||
int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt)
|
||||
{
|
||||
struct hid_report_enum *report_enum = hid->report_enum + type;
|
||||
struct hid_driver *hdrv = hid->driver;
|
||||
struct hid_report_enum *report_enum;
|
||||
struct hid_driver *hdrv;
|
||||
struct hid_report *report;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
if (!hid || !hid->driver)
|
||||
return -ENODEV;
|
||||
report_enum = hid->report_enum + type;
|
||||
hdrv = hid->driver;
|
||||
|
||||
if (!size) {
|
||||
dbg_hid("empty report\n");
|
||||
|
|
|
@ -527,8 +527,10 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
|
|||
goto goodreturn;
|
||||
|
||||
case HIDIOCGCOLLECTIONINDEX:
|
||||
i = field->usage[uref->usage_index].collection_index;
|
||||
unlock_kernel();
|
||||
kfree(uref_multi);
|
||||
return field->usage[uref->usage_index].collection_index;
|
||||
return i;
|
||||
case HIDIOCGUSAGES:
|
||||
for (i = 0; i < uref_multi->num_values; i++)
|
||||
uref_multi->values[i] =
|
||||
|
|
|
@ -593,7 +593,11 @@ static int atk_add_sensor(struct atk_data *data, union acpi_object *obj)
|
|||
sensor->data = data;
|
||||
sensor->id = flags->integer.value;
|
||||
sensor->limit1 = limit1->integer.value;
|
||||
if (data->old_interface)
|
||||
sensor->limit2 = limit2->integer.value;
|
||||
else
|
||||
/* The upper limit is expressed as delta from lower limit */
|
||||
sensor->limit2 = sensor->limit1 + limit2->integer.value;
|
||||
|
||||
snprintf(sensor->input_attr_name, ATTR_NAME_SIZE,
|
||||
"%s%d_input", base_name, start + *num);
|
||||
|
|
|
@ -86,6 +86,7 @@ superio_exit(void)
|
|||
#define SUPERIO_REG_ACT 0x30
|
||||
#define SUPERIO_REG_BASE 0x60
|
||||
#define SUPERIO_REG_DEVID 0x20
|
||||
#define SUPERIO_REG_DEVREV 0x21
|
||||
|
||||
/* Logical device registers */
|
||||
|
||||
|
@ -429,6 +430,9 @@ static int __init smsc47m1_find(unsigned short *addr,
|
|||
* The LPC47M292 (device id 0x6B) is somewhat compatible, but it
|
||||
* supports a 3rd fan, and the pin configuration registers are
|
||||
* unfortunately different.
|
||||
* The LPC47M233 has the same device id (0x6B) but is not compatible.
|
||||
* We check the high bit of the device revision register to
|
||||
* differentiate them.
|
||||
*/
|
||||
switch (val) {
|
||||
case 0x51:
|
||||
|
@ -448,6 +452,13 @@ static int __init smsc47m1_find(unsigned short *addr,
|
|||
sio_data->type = smsc47m1;
|
||||
break;
|
||||
case 0x6B:
|
||||
if (superio_inb(SUPERIO_REG_DEVREV) & 0x80) {
|
||||
pr_debug(DRVNAME ": "
|
||||
"Found SMSC LPC47M233, unsupported\n");
|
||||
superio_exit();
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pr_info(DRVNAME ": Found SMSC LPC47M292\n");
|
||||
sio_data->type = smsc47m2;
|
||||
break;
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include <linux/delay.h>
|
||||
|
||||
#define TSL2550_DRV_NAME "tsl2550"
|
||||
#define DRIVER_VERSION "1.1.1"
|
||||
#define DRIVER_VERSION "1.1.2"
|
||||
|
||||
/*
|
||||
* Defines
|
||||
|
@ -189,13 +189,16 @@ static int tsl2550_calculate_lux(u8 ch0, u8 ch1)
|
|||
u8 r = 128;
|
||||
|
||||
/* Avoid division by 0 and count 1 cannot be greater than count 0 */
|
||||
if (c0 && (c1 <= c0))
|
||||
if (c1 <= c0)
|
||||
if (c0) {
|
||||
r = c1 * 128 / c0;
|
||||
else
|
||||
return -1;
|
||||
|
||||
/* Calculate LUX */
|
||||
lux = ((c0 - c1) * ratio_lut[r]) / 256;
|
||||
} else
|
||||
lux = 0;
|
||||
else
|
||||
return -EAGAIN;
|
||||
|
||||
/* LUX range check */
|
||||
return lux > TSL2550_MAX_LUX ? TSL2550_MAX_LUX : lux;
|
||||
|
|
|
@ -455,6 +455,7 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq)
|
|||
|
||||
rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
|
||||
rq->special = cmd;
|
||||
cmd->rq = rq;
|
||||
}
|
||||
|
||||
ide_devset_get(multcount, mult_count);
|
||||
|
|
|
@ -1064,6 +1064,7 @@ static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd,
|
|||
tape->best_dsc_rw_freq = config.dsc_rw_frequency;
|
||||
break;
|
||||
case 0x0350:
|
||||
memset(&config, 0, sizeof(config));
|
||||
config.dsc_rw_frequency = (int) tape->best_dsc_rw_freq;
|
||||
config.nr_stages = 1;
|
||||
if (copy_to_user(argp, &config, sizeof(config)))
|
||||
|
|
|
@ -608,8 +608,7 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
|
|||
p, compat_mode);
|
||||
|
||||
if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))
|
||||
return str_to_user(dev_name(&evdev->dev),
|
||||
_IOC_SIZE(cmd), p);
|
||||
return str_to_user(dev->name, _IOC_SIZE(cmd), p);
|
||||
|
||||
if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))
|
||||
return str_to_user(dev->phys, _IOC_SIZE(cmd), p);
|
||||
|
|
|
@ -536,7 +536,7 @@ static int joydev_ioctl_common(struct joydev *joydev,
|
|||
default:
|
||||
if ((cmd & ~IOCSIZE_MASK) == JSIOCGNAME(0)) {
|
||||
int len;
|
||||
const char *name = dev_name(&dev->dev);
|
||||
const char *name = dev->name;
|
||||
|
||||
if (!name)
|
||||
return 0;
|
||||
|
|
|
@ -472,17 +472,17 @@ static void xpad_irq_out(struct urb *urb)
|
|||
switch (status) {
|
||||
case 0:
|
||||
/* success */
|
||||
break;
|
||||
return;
|
||||
|
||||
case -ECONNRESET:
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
/* this urb is terminated, clean up */
|
||||
dbg("%s - urb shutting down with status: %d",
|
||||
__func__, status);
|
||||
dbg("%s - urb shutting down with status: %d", __func__, status);
|
||||
return;
|
||||
|
||||
default:
|
||||
dbg("%s - nonzero urb status received: %d",
|
||||
__func__, status);
|
||||
dbg("%s - nonzero urb status received: %d", __func__, status);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
|
|
@ -894,6 +894,13 @@ static unsigned int atkbd_amilo_pa1510_forced_release_keys[] = {
|
|||
0xb0, 0xae, -1U
|
||||
};
|
||||
|
||||
/*
|
||||
* Amilo Pi 3525 key release for Fn+Volume keys not working
|
||||
*/
|
||||
static unsigned int atkbd_amilo_pi3525_forced_release_keys[] = {
|
||||
0x20, 0xa0, 0x2e, 0xae, 0x30, 0xb0, -1U
|
||||
};
|
||||
|
||||
/*
|
||||
* Amilo Xi 3650 key release for light touch bar not working
|
||||
*/
|
||||
|
@ -901,6 +908,13 @@ static unsigned int atkbd_amilo_xi3650_forced_release_keys[] = {
|
|||
0x67, 0xed, 0x90, 0xa2, 0x99, 0xa4, 0xae, 0xb0, -1U
|
||||
};
|
||||
|
||||
/*
|
||||
* Soltech TA12 system with broken key release on volume keys and mute key
|
||||
*/
|
||||
static unsigned int atkdb_soltech_ta12_forced_release_keys[] = {
|
||||
0xa0, 0xae, 0xb0, -1U
|
||||
};
|
||||
|
||||
/*
|
||||
* atkbd_set_keycode_table() initializes keyboard's keycode table
|
||||
* according to the selected scancode set
|
||||
|
@ -1567,6 +1581,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
|
|||
.callback = atkbd_setup_forced_release,
|
||||
.driver_data = atkbd_amilo_pa1510_forced_release_keys,
|
||||
},
|
||||
{
|
||||
.ident = "Fujitsu Amilo Pi 3525",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 3525"),
|
||||
},
|
||||
.callback = atkbd_setup_forced_release,
|
||||
.driver_data = atkbd_amilo_pi3525_forced_release_keys,
|
||||
},
|
||||
{
|
||||
.ident = "Fujitsu Amilo Xi 3650",
|
||||
.matches = {
|
||||
|
@ -1576,6 +1599,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
|
|||
.callback = atkbd_setup_forced_release,
|
||||
.driver_data = atkbd_amilo_xi3650_forced_release_keys,
|
||||
},
|
||||
{
|
||||
.ident = "Soltech Corporation TA12",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Soltech Corporation"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TA12"),
|
||||
},
|
||||
.callback = atkbd_setup_forced_release,
|
||||
.driver_data = atkdb_soltech_ta12_forced_release_keys,
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
@ -114,7 +114,7 @@ static int __devexit pcspkr_remove(struct platform_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pcspkr_suspend(struct platform_device *dev, pm_message_t state)
|
||||
static int pcspkr_suspend(struct device *dev)
|
||||
{
|
||||
pcspkr_event(NULL, EV_SND, SND_BELL, 0);
|
||||
|
||||
|
@ -127,14 +127,18 @@ static void pcspkr_shutdown(struct platform_device *dev)
|
|||
pcspkr_event(NULL, EV_SND, SND_BELL, 0);
|
||||
}
|
||||
|
||||
static struct dev_pm_ops pcspkr_pm_ops = {
|
||||
.suspend = pcspkr_suspend,
|
||||
};
|
||||
|
||||
static struct platform_driver pcspkr_platform_driver = {
|
||||
.driver = {
|
||||
.name = "pcspkr",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &pcspkr_pm_ops,
|
||||
},
|
||||
.probe = pcspkr_probe,
|
||||
.remove = __devexit_p(pcspkr_remove),
|
||||
.suspend = pcspkr_suspend,
|
||||
.shutdown = pcspkr_shutdown,
|
||||
};
|
||||
|
||||
|
|
|
@ -644,6 +644,15 @@ static struct dmi_system_id dmi_ids[] __initdata = {
|
|||
},
|
||||
.driver_data = keymap_fs_amilo_pro_v2000
|
||||
},
|
||||
{
|
||||
.callback = dmi_matched,
|
||||
.ident = "Maxdata Pro 7000 DX",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"),
|
||||
},
|
||||
.driver_data = keymap_fs_amilo_pro_v2000
|
||||
},
|
||||
{
|
||||
.callback = dmi_matched,
|
||||
.ident = "Fujitsu N3510",
|
||||
|
|
|
@ -731,10 +731,10 @@ l1oip_socket_thread(void *data)
|
|||
while (!signal_pending(current)) {
|
||||
struct kvec iov = {
|
||||
.iov_base = recvbuf,
|
||||
.iov_len = sizeof(recvbuf),
|
||||
.iov_len = recvbuf_size,
|
||||
};
|
||||
recvlen = kernel_recvmsg(socket, &msg, &iov, 1,
|
||||
sizeof(recvbuf), 0);
|
||||
recvbuf_size, 0);
|
||||
if (recvlen > 0) {
|
||||
l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen);
|
||||
} else {
|
||||
|
|
|
@ -1318,7 +1318,7 @@ static int crypt_iterate_devices(struct dm_target *ti,
|
|||
{
|
||||
struct crypt_config *cc = ti->private;
|
||||
|
||||
return fn(ti, cc->dev, cc->start, data);
|
||||
return fn(ti, cc->dev, cc->start, ti->len, data);
|
||||
}
|
||||
|
||||
static struct target_type crypt_target = {
|
||||
|
|
|
@ -324,12 +324,12 @@ static int delay_iterate_devices(struct dm_target *ti,
|
|||
struct delay_c *dc = ti->private;
|
||||
int ret = 0;
|
||||
|
||||
ret = fn(ti, dc->dev_read, dc->start_read, data);
|
||||
ret = fn(ti, dc->dev_read, dc->start_read, ti->len, data);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (dc->dev_write)
|
||||
ret = fn(ti, dc->dev_write, dc->start_write, data);
|
||||
ret = fn(ti, dc->dev_write, dc->start_write, ti->len, data);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
|
|
@ -139,7 +139,7 @@ static int linear_iterate_devices(struct dm_target *ti,
|
|||
{
|
||||
struct linear_c *lc = ti->private;
|
||||
|
||||
return fn(ti, lc->dev, lc->start, data);
|
||||
return fn(ti, lc->dev, lc->start, ti->len, data);
|
||||
}
|
||||
|
||||
static struct target_type linear_target = {
|
||||
|
|
|
@ -1453,7 +1453,7 @@ static int multipath_iterate_devices(struct dm_target *ti,
|
|||
|
||||
list_for_each_entry(pg, &m->priority_groups, list) {
|
||||
list_for_each_entry(p, &pg->pgpaths, list) {
|
||||
ret = fn(ti, p->path.dev, ti->begin, data);
|
||||
ret = fn(ti, p->path.dev, ti->begin, ti->len, data);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -638,6 +638,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes)
|
|||
spin_lock_irq(&ms->lock);
|
||||
bio_list_merge(&ms->writes, &requeue);
|
||||
spin_unlock_irq(&ms->lock);
|
||||
delayed_wake(ms);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1292,7 +1293,7 @@ static int mirror_iterate_devices(struct dm_target *ti,
|
|||
|
||||
for (i = 0; !ret && i < ms->nr_mirrors; i++)
|
||||
ret = fn(ti, ms->mirror[i].dev,
|
||||
ms->mirror[i].offset, data);
|
||||
ms->mirror[i].offset, ti->len, data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue