]>
Commit | Line | Data |
---|---|---|
00e5a55c BS |
1 | From: Raymund Will <rw@suse.de> |
2 | Subject: sgi-xpc: need to pass the physical address, not virtual. | |
3 | References: bnc#458811 | |
4 | ||
5 | This version differs significantly from the community patch, | |
6 | that breaks kABI after RC2, which is considered worse than | |
7 | deviating from upstream (at least in this area). | |
8 | ||
9 | Instead of actually _passing_ the physical address to | |
10 | uv_bios_mq_watchlist_alloc() it's converted locally. | |
11 | ||
12 | Signed-off-by: Raymund Will <rw@suse.de> | |
13 | ||
14 | --- | |
15 | arch/x86/kernel/bios_uv.c | 4 +++- | |
16 | drivers/misc/sgi-xp/xpc_uv.c | 4 ++-- | |
17 | include/asm-x86/uv/bios.h | 2 +- | |
18 | 3 files changed, 6 insertions(+), 4 deletions(-) | |
19 | ||
20 | --- a/arch/x86/kernel/bios_uv.c | |
21 | +++ b/arch/x86/kernel/bios_uv.c | |
22 | @@ -101,13 +101,15 @@ s64 uv_bios_get_sn_info(int fc, int *uvt | |
23 | } | |
24 | ||
25 | int | |
26 | -uv_bios_mq_watchlist_alloc(int blade, unsigned long addr, unsigned int mq_size, | |
27 | +uv_bios_mq_watchlist_alloc(int blade, void *mq, unsigned int mq_size, | |
28 | unsigned long *intr_mmr_offset) | |
29 | { | |
30 | union uv_watchlist_u size_blade; | |
31 | + unsigned long addr; | |
32 | u64 watchlist; | |
33 | s64 ret; | |
34 | ||
35 | + addr = uv_gpa(mq); | |
36 | size_blade.size = mq_size; | |
37 | size_blade.blade = blade; | |
38 | ||
39 | --- a/drivers/misc/sgi-xp/xpc_uv.c | |
40 | +++ b/drivers/misc/sgi-xp/xpc_uv.c | |
41 | @@ -119,7 +119,7 @@ xpc_gru_mq_watchlist_alloc_uv(struct xpc | |
42 | int ret; | |
43 | ||
44 | #if defined CONFIG_X86_64 | |
45 | - ret = uv_bios_mq_watchlist_alloc(mq->mmr_blade, uv_gpa(mq->address), | |
46 | + ret = uv_bios_mq_watchlist_alloc(mq->mmr_blade, mq->address, | |
47 | mq->order, &mq->mmr_offset); | |
48 | if (ret < 0) { | |
49 | dev_err(xpc_part, "uv_bios_mq_watchlist_alloc() failed, " | |
50 | @@ -127,7 +127,7 @@ xpc_gru_mq_watchlist_alloc_uv(struct xpc | |
51 | return ret; | |
52 | } | |
53 | #elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV | |
54 | - ret = sn_mq_watchlist_alloc(mq->mmr_blade, uv_gpa(mq->address), | |
55 | + ret = sn_mq_watchlist_alloc(mq->mmr_blade, mq->address, | |
56 | mq->order, &mq->mmr_offset); | |
57 | if (ret < 0) { | |
58 | dev_err(xpc_part, "sn_mq_watchlist_alloc() failed, ret=%d\n", | |
59 | --- a/include/asm-x86/uv/bios.h | |
60 | +++ b/include/asm-x86/uv/bios.h | |
61 | @@ -100,7 +100,7 @@ extern s64 uv_bios_call_reentrant(enum u | |
62 | ||
63 | extern s64 uv_bios_get_sn_info(int, int *, long *, long *, long *); | |
64 | extern s64 uv_bios_freq_base(u64, u64 *); | |
65 | -extern int uv_bios_mq_watchlist_alloc(int, unsigned long, unsigned int, | |
66 | +extern int uv_bios_mq_watchlist_alloc(int, void *, unsigned int, | |
67 | unsigned long *); | |
68 | extern int uv_bios_mq_watchlist_free(int, int); | |
69 | extern s64 uv_bios_change_memprotect(u64, u64, enum uv_memprotect); |