diff options
| -rw-r--r-- | drivers/misc/sgi-xp/xp.h | 8 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xp_main.c | 6 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xp_sn2.c | 50 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xp_uv.c | 27 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xpc.h | 44 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xpc_channel.c | 5 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xpc_main.c | 8 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xpc_partition.c | 37 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xpc_sn2.c | 68 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xpc_uv.c | 2 | ||||
| -rw-r--r-- | drivers/misc/sgi-xp/xpnet.c | 26 |
11 files changed, 154 insertions, 127 deletions
diff --git a/drivers/misc/sgi-xp/xp.h b/drivers/misc/sgi-xp/xp.h index 01bf1a2cd8ed..45d0a08c2ddd 100644 --- a/drivers/misc/sgi-xp/xp.h +++ b/drivers/misc/sgi-xp/xp.h | |||
| @@ -207,7 +207,9 @@ enum xp_retval { | |||
| 207 | xpUnsupported, /* 56: unsupported functionality or resource */ | 207 | xpUnsupported, /* 56: unsupported functionality or resource */ |
| 208 | xpNeedMoreInfo, /* 57: more info is needed by SAL */ | 208 | xpNeedMoreInfo, /* 57: more info is needed by SAL */ |
| 209 | 209 | ||
| 210 | xpUnknownReason /* 58: unknown reason - must be last in enum */ | 210 | xpGruCopyError, /* 58: gru_copy_gru() returned error */ |
| 211 | |||
| 212 | xpUnknownReason /* 59: unknown reason - must be last in enum */ | ||
| 211 | }; | 213 | }; |
| 212 | 214 | ||
| 213 | /* | 215 | /* |
| @@ -349,7 +351,9 @@ extern short xp_max_npartitions; | |||
| 349 | extern short xp_partition_id; | 351 | extern short xp_partition_id; |
| 350 | extern u8 xp_region_size; | 352 | extern u8 xp_region_size; |
| 351 | 353 | ||
| 352 | extern enum xp_retval (*xp_remote_memcpy) (void *, const void *, size_t); | 354 | extern unsigned long (*xp_pa) (void *); |
| 355 | extern enum xp_retval (*xp_remote_memcpy) (unsigned long, const unsigned long, | ||
| 356 | size_t); | ||
| 353 | extern int (*xp_cpu_to_nasid) (int); | 357 | extern int (*xp_cpu_to_nasid) (int); |
| 354 | 358 | ||
| 355 | extern u64 xp_nofault_PIOR_target; | 359 | extern u64 xp_nofault_PIOR_target; |
diff --git a/drivers/misc/sgi-xp/xp_main.c b/drivers/misc/sgi-xp/xp_main.c index c34b23fe498f..f86ad3af26b7 100644 --- a/drivers/misc/sgi-xp/xp_main.c +++ b/drivers/misc/sgi-xp/xp_main.c | |||
| @@ -41,7 +41,11 @@ EXPORT_SYMBOL_GPL(xp_partition_id); | |||
| 41 | u8 xp_region_size; | 41 | u8 xp_region_size; |
| 42 | EXPORT_SYMBOL_GPL(xp_region_size); | 42 | EXPORT_SYMBOL_GPL(xp_region_size); |
| 43 | 43 | ||
| 44 | enum xp_retval (*xp_remote_memcpy) (void *dst, const void *src, size_t len); | 44 | unsigned long (*xp_pa) (void *addr); |
| 45 | EXPORT_SYMBOL_GPL(xp_pa); | ||
| 46 | |||
| 47 | enum xp_retval (*xp_remote_memcpy) (unsigned long dst_gpa, | ||
| 48 | const unsigned long src_gpa, size_t len); | ||
| 45 | EXPORT_SYMBOL_GPL(xp_remote_memcpy); | 49 | EXPORT_SYMBOL_GPL(xp_remote_memcpy); |
| 46 | 50 | ||
| 47 | int (*xp_cpu_to_nasid) (int cpuid); | 51 | int (*xp_cpu_to_nasid) (int cpuid); |
diff --git a/drivers/misc/sgi-xp/xp_sn2.c b/drivers/misc/sgi-xp/xp_sn2.c index c6a1ede7d6e6..1440134caf31 100644 --- a/drivers/misc/sgi-xp/xp_sn2.c +++ b/drivers/misc/sgi-xp/xp_sn2.c | |||
| @@ -63,7 +63,7 @@ xp_register_nofault_code_sn2(void) | |||
| 63 | return xpSuccess; | 63 | return xpSuccess; |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | void | 66 | static void |
| 67 | xp_unregister_nofault_code_sn2(void) | 67 | xp_unregister_nofault_code_sn2(void) |
| 68 | { | 68 | { |
| 69 | u64 func_addr = *(u64 *)xp_nofault_PIOR; | 69 | u64 func_addr = *(u64 *)xp_nofault_PIOR; |
| @@ -75,44 +75,41 @@ xp_unregister_nofault_code_sn2(void) | |||
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | /* | 77 | /* |
| 78 | * Convert a virtual memory address to a physical memory address. | ||
| 79 | */ | ||
| 80 | static unsigned long | ||
| 81 | xp_pa_sn2(void *addr) | ||
| 82 | { | ||
| 83 | return __pa(addr); | ||
| 84 | } | ||
| 85 | |||
| 86 | /* | ||
| 78 | * Wrapper for bte_copy(). | 87 | * Wrapper for bte_copy(). |
| 79 | * | 88 | * |
| 80 | * vdst - virtual address of the destination of the transfer. | 89 | * dst_pa - physical address of the destination of the transfer. |
| 81 | * psrc - physical address of the source of the transfer. | 90 | * src_pa - physical address of the source of the transfer. |
| 82 | * len - number of bytes to transfer from source to destination. | 91 | * len - number of bytes to transfer from source to destination. |
| 83 | * | 92 | * |
| 84 | * Note: xp_remote_memcpy_sn2() should never be called while holding a spinlock. | 93 | * Note: xp_remote_memcpy_sn2() should never be called while holding a spinlock. |
| 85 | */ | 94 | */ |
| 86 | static enum xp_retval | 95 | static enum xp_retval |
| 87 | xp_remote_memcpy_sn2(void *vdst, const void *psrc, size_t len) | 96 | xp_remote_memcpy_sn2(unsigned long dst_pa, const unsigned long src_pa, |
| 97 | size_t len) | ||
| 88 | { | 98 | { |
| 89 | bte_result_t ret; | 99 | bte_result_t ret; |
| 90 | u64 pdst = ia64_tpa(vdst); | ||
| 91 | /* ??? What are the rules governing the src and dst addresses passed in? | ||
| 92 | * ??? Currently we're assuming that dst is a virtual address and src | ||
| 93 | * ??? is a physical address, is this appropriate? Can we allow them to | ||
| 94 | * ??? be whatever and we make the change here without damaging the | ||
| 95 | * ??? addresses? | ||
| 96 | */ | ||
| 97 | 100 | ||
| 98 | /* | 101 | ret = bte_copy(src_pa, dst_pa, len, (BTE_NOTIFY | BTE_WACQUIRE), NULL); |
| 99 | * Ensure that the physically mapped memory is contiguous. | ||
| 100 | * | ||
| 101 | * We do this by ensuring that the memory is from region 7 only. | ||
| 102 | * If the need should arise to use memory from one of the other | ||
| 103 | * regions, then modify the BUG_ON() statement to ensure that the | ||
| 104 | * memory from that region is always physically contiguous. | ||
| 105 | */ | ||
| 106 | BUG_ON(REGION_NUMBER(vdst) != RGN_KERNEL); | ||
| 107 | |||
| 108 | ret = bte_copy((u64)psrc, pdst, len, (BTE_NOTIFY | BTE_WACQUIRE), NULL); | ||
| 109 | if (ret == BTE_SUCCESS) | 102 | if (ret == BTE_SUCCESS) |
| 110 | return xpSuccess; | 103 | return xpSuccess; |
| 111 | 104 | ||
| 112 | if (is_shub2()) | 105 | if (is_shub2()) { |
| 113 | dev_err(xp, "bte_copy() on shub2 failed, error=0x%x\n", ret); | 106 | dev_err(xp, "bte_copy() on shub2 failed, error=0x%x dst_pa=" |
| 114 | else | 107 | "0x%016lx src_pa=0x%016lx len=%ld\\n", ret, dst_pa, |
| 115 | dev_err(xp, "bte_copy() failed, error=%d\n", ret); | 108 | src_pa, len); |
| 109 | } else { | ||
| 110 | dev_err(xp, "bte_copy() failed, error=%d dst_pa=0x%016lx " | ||
| 111 | "src_pa=0x%016lx len=%ld\\n", ret, dst_pa, src_pa, len); | ||
| 112 | } | ||
| 116 | 113 | ||
| 117 | return xpBteCopyError; | 114 | return xpBteCopyError; |
| 118 | } | 115 | } |
| @@ -132,6 +129,7 @@ xp_init_sn2(void) | |||
| 132 | xp_partition_id = sn_partition_id; | 129 | xp_partition_id = sn_partition_id; |
| 133 | xp_region_size = sn_region_size; | 130 | xp_region_size = sn_region_size; |
| 134 | 131 | ||
| 132 | xp_pa = xp_pa_sn2; | ||
| 135 | xp_remote_memcpy = xp_remote_memcpy_sn2; | 133 | xp_remote_memcpy = xp_remote_memcpy_sn2; |
| 136 | xp_cpu_to_nasid = xp_cpu_to_nasid_sn2; | 134 | xp_cpu_to_nasid = xp_cpu_to_nasid_sn2; |
| 137 | 135 | ||
diff --git a/drivers/misc/sgi-xp/xp_uv.c b/drivers/misc/sgi-xp/xp_uv.c index 382b1b6bcc0b..44f2c2b58c2f 100644 --- a/drivers/misc/sgi-xp/xp_uv.c +++ b/drivers/misc/sgi-xp/xp_uv.c | |||
| @@ -13,13 +13,33 @@ | |||
| 13 | * | 13 | * |
| 14 | */ | 14 | */ |
| 15 | 15 | ||
| 16 | #include <linux/device.h> | ||
| 17 | #include <asm/uv/uv_hub.h> | ||
| 18 | #include "../sgi-gru/grukservices.h" | ||
| 16 | #include "xp.h" | 19 | #include "xp.h" |
| 17 | 20 | ||
| 21 | /* | ||
| 22 | * Convert a virtual memory address to a physical memory address. | ||
| 23 | */ | ||
| 24 | static unsigned long | ||
| 25 | xp_pa_uv(void *addr) | ||
| 26 | { | ||
| 27 | return uv_gpa(addr); | ||
| 28 | } | ||
| 29 | |||
| 18 | static enum xp_retval | 30 | static enum xp_retval |
| 19 | xp_remote_memcpy_uv(void *vdst, const void *psrc, size_t len) | 31 | xp_remote_memcpy_uv(unsigned long dst_gpa, const unsigned long src_gpa, |
| 32 | size_t len) | ||
| 20 | { | 33 | { |
| 21 | /* !!! this function needs fleshing out */ | 34 | int ret; |
| 22 | return xpUnsupported; | 35 | |
| 36 | ret = gru_copy_gpa(dst_gpa, src_gpa, len); | ||
| 37 | if (ret == 0) | ||
| 38 | return xpSuccess; | ||
| 39 | |||
| 40 | dev_err(xp, "gru_copy_gpa() failed, dst_gpa=0x%016lx src_gpa=0x%016lx " | ||
| 41 | "len=%ld\n", dst_gpa, src_gpa, len); | ||
| 42 | return xpGruCopyError; | ||
| 23 | } | 43 | } |
| 24 | 44 | ||
| 25 | enum xp_retval | 45 | enum xp_retval |
| @@ -29,6 +49,7 @@ xp_init_uv(void) | |||
| 29 | 49 | ||
| 30 | xp_max_npartitions = XP_MAX_NPARTITIONS_UV; | 50 | xp_max_npartitions = XP_MAX_NPARTITIONS_UV; |
| 31 | 51 | ||
| 52 | xp_pa = xp_pa_uv; | ||
| 32 | xp_remote_memcpy = xp_remote_memcpy_uv; | 53 | xp_remote_memcpy = xp_remote_memcpy_uv; |
| 33 | 54 | ||
| 34 | return xpSuccess; | 55 | return xpSuccess; |
diff --git a/drivers/misc/sgi-xp/xpc.h b/drivers/misc/sgi-xp/xpc.h index 96408fcf5a1e..49e26993345b 100644 --- a/drivers/misc/sgi-xp/xpc.h +++ b/drivers/misc/sgi-xp/xpc.h | |||
| @@ -91,8 +91,8 @@ struct xpc_rsvd_page { | |||
| 91 | u8 version; | 91 | u8 version; |
| 92 | u8 pad1[3]; /* align to next u64 in 1st 64-byte cacheline */ | 92 | u8 pad1[3]; /* align to next u64 in 1st 64-byte cacheline */ |
| 93 | union { | 93 | union { |
| 94 | u64 vars_pa; /* physical address of struct xpc_vars */ | 94 | unsigned long vars_pa; /* phys address of struct xpc_vars */ |
| 95 | u64 activate_mq_gpa; /* global phys address of activate_mq */ | 95 | unsigned long activate_mq_gpa; /* gru phy addr of activate_mq */ |
| 96 | } sn; | 96 | } sn; |
| 97 | unsigned long ts_jiffies; /* timestamp when rsvd pg was setup by XPC */ | 97 | unsigned long ts_jiffies; /* timestamp when rsvd pg was setup by XPC */ |
| 98 | u64 pad2[10]; /* align to last u64 in 2nd 64-byte cacheline */ | 98 | u64 pad2[10]; /* align to last u64 in 2nd 64-byte cacheline */ |
| @@ -122,8 +122,8 @@ struct xpc_vars_sn2 { | |||
| 122 | u64 heartbeat_offline; /* if 0, heartbeat should be changing */ | 122 | u64 heartbeat_offline; /* if 0, heartbeat should be changing */ |
| 123 | int activate_IRQ_nasid; | 123 | int activate_IRQ_nasid; |
| 124 | int activate_IRQ_phys_cpuid; | 124 | int activate_IRQ_phys_cpuid; |
| 125 | u64 vars_part_pa; | 125 | unsigned long vars_part_pa; |
| 126 | u64 amos_page_pa; /* paddr of page of amos from MSPEC driver */ | 126 | unsigned long amos_page_pa;/* paddr of page of amos from MSPEC driver */ |
| 127 | struct amo *amos_page; /* vaddr of page of amos from MSPEC driver */ | 127 | struct amo *amos_page; /* vaddr of page of amos from MSPEC driver */ |
| 128 | }; | 128 | }; |
| 129 | 129 | ||
| @@ -142,10 +142,10 @@ struct xpc_vars_sn2 { | |||
| 142 | struct xpc_vars_part_sn2 { | 142 | struct xpc_vars_part_sn2 { |
| 143 | u64 magic; | 143 | u64 magic; |
| 144 | 144 | ||
| 145 | u64 openclose_args_pa; /* physical address of open and close args */ | 145 | unsigned long openclose_args_pa; /* phys addr of open and close args */ |
| 146 | u64 GPs_pa; /* physical address of Get/Put values */ | 146 | unsigned long GPs_pa; /* physical address of Get/Put values */ |
| 147 | 147 | ||
| 148 | u64 chctl_amo_pa; /* physical address of chctl flags' amo */ | 148 | unsigned long chctl_amo_pa; /* physical address of chctl flags' amo */ |
| 149 | 149 | ||
| 150 | int notify_IRQ_nasid; /* nasid of where to send notify IRQs */ | 150 | int notify_IRQ_nasid; /* nasid of where to send notify IRQs */ |
| 151 | int notify_IRQ_phys_cpuid; /* CPUID of where to send notify IRQs */ | 151 | int notify_IRQ_phys_cpuid; /* CPUID of where to send notify IRQs */ |
| @@ -213,7 +213,7 @@ struct xpc_openclose_args { | |||
| 213 | u16 msg_size; /* sizeof each message entry */ | 213 | u16 msg_size; /* sizeof each message entry */ |
| 214 | u16 remote_nentries; /* #of message entries in remote msg queue */ | 214 | u16 remote_nentries; /* #of message entries in remote msg queue */ |
| 215 | u16 local_nentries; /* #of message entries in local msg queue */ | 215 | u16 local_nentries; /* #of message entries in local msg queue */ |
| 216 | u64 local_msgqueue_pa; /* physical address of local message queue */ | 216 | unsigned long local_msgqueue_pa; /* phys addr of local message queue */ |
| 217 | }; | 217 | }; |
| 218 | 218 | ||
| 219 | #define XPC_OPENCLOSE_ARGS_SIZE \ | 219 | #define XPC_OPENCLOSE_ARGS_SIZE \ |
| @@ -366,8 +366,8 @@ struct xpc_channel { | |||
| 366 | void *remote_msgqueue_base; /* base address of kmalloc'd space */ | 366 | void *remote_msgqueue_base; /* base address of kmalloc'd space */ |
| 367 | struct xpc_msg *remote_msgqueue; /* cached copy of remote partition's */ | 367 | struct xpc_msg *remote_msgqueue; /* cached copy of remote partition's */ |
| 368 | /* local message queue */ | 368 | /* local message queue */ |
| 369 | u64 remote_msgqueue_pa; /* phys addr of remote partition's */ | 369 | unsigned long remote_msgqueue_pa; /* phys addr of remote partition's */ |
| 370 | /* local message queue */ | 370 | /* local message queue */ |
| 371 | 371 | ||
| 372 | atomic_t references; /* #of external references to queues */ | 372 | atomic_t references; /* #of external references to queues */ |
| 373 | 373 | ||
| @@ -491,12 +491,12 @@ xpc_any_msg_chctl_flags_set(union xpc_channel_ctl_flags *chctl) | |||
| 491 | */ | 491 | */ |
| 492 | 492 | ||
| 493 | struct xpc_partition_sn2 { | 493 | struct xpc_partition_sn2 { |
| 494 | u64 remote_amos_page_pa; /* phys addr of partition's amos page */ | 494 | unsigned long remote_amos_page_pa; /* paddr of partition's amos page */ |
| 495 | int activate_IRQ_nasid; /* active partition's act/deact nasid */ | 495 | int activate_IRQ_nasid; /* active partition's act/deact nasid */ |
| 496 | int activate_IRQ_phys_cpuid; /* active part's act/deact phys cpuid */ | 496 | int activate_IRQ_phys_cpuid; /* active part's act/deact phys cpuid */ |
| 497 | 497 | ||
| 498 | u64 remote_vars_pa; /* phys addr of partition's vars */ | 498 | unsigned long remote_vars_pa; /* phys addr of partition's vars */ |
| 499 | u64 remote_vars_part_pa; /* phys addr of partition's vars part */ | 499 | unsigned long remote_vars_part_pa; /* paddr of partition's vars part */ |
| 500 | u8 remote_vars_version; /* version# of partition's vars */ | 500 | u8 remote_vars_version; /* version# of partition's vars */ |
| 501 | 501 | ||
| 502 | void *local_GPs_base; /* base address of kmalloc'd space */ | 502 | void *local_GPs_base; /* base address of kmalloc'd space */ |
| @@ -504,10 +504,10 @@ struct xpc_partition_sn2 { | |||
| 504 | void *remote_GPs_base; /* base address of kmalloc'd space */ | 504 | void *remote_GPs_base; /* base address of kmalloc'd space */ |
| 505 | struct xpc_gp_sn2 *remote_GPs; /* copy of remote partition's local */ | 505 | struct xpc_gp_sn2 *remote_GPs; /* copy of remote partition's local */ |
| 506 | /* Get/Put values */ | 506 | /* Get/Put values */ |
| 507 | u64 remote_GPs_pa; /* phys address of remote partition's local */ | 507 | unsigned long remote_GPs_pa; /* phys addr of remote partition's local */ |
| 508 | /* Get/Put values */ | 508 | /* Get/Put values */ |
| 509 | 509 | ||
| 510 | u64 remote_openclose_args_pa; /* phys addr of remote's args */ | 510 | unsigned long remote_openclose_args_pa; /* phys addr of remote's args */ |
| 511 | 511 | ||
| 512 | int notify_IRQ_nasid; /* nasid of where to send notify IRQs */ | 512 | int notify_IRQ_nasid; /* nasid of where to send notify IRQs */ |
| 513 | int notify_IRQ_phys_cpuid; /* CPUID of where to send notify IRQs */ | 513 | int notify_IRQ_phys_cpuid; /* CPUID of where to send notify IRQs */ |
| @@ -529,7 +529,7 @@ struct xpc_partition { | |||
| 529 | 529 | ||
| 530 | u8 remote_rp_version; /* version# of partition's rsvd pg */ | 530 | u8 remote_rp_version; /* version# of partition's rsvd pg */ |
| 531 | unsigned long remote_rp_ts_jiffies; /* timestamp when rsvd pg setup */ | 531 | unsigned long remote_rp_ts_jiffies; /* timestamp when rsvd pg setup */ |
| 532 | u64 remote_rp_pa; /* phys addr of partition's rsvd pg */ | 532 | unsigned long remote_rp_pa; /* phys addr of partition's rsvd pg */ |
| 533 | u64 last_heartbeat; /* HB at last read */ | 533 | u64 last_heartbeat; /* HB at last read */ |
| 534 | u32 activate_IRQ_rcvd; /* IRQs since activation */ | 534 | u32 activate_IRQ_rcvd; /* IRQs since activation */ |
| 535 | spinlock_t act_lock; /* protect updating of act_state */ | 535 | spinlock_t act_lock; /* protect updating of act_state */ |
| @@ -623,7 +623,8 @@ extern void xpc_activate_partition(struct xpc_partition *); | |||
| 623 | extern void xpc_activate_kthreads(struct xpc_channel *, int); | 623 | extern void xpc_activate_kthreads(struct xpc_channel *, int); |
| 624 | extern void xpc_create_kthreads(struct xpc_channel *, int, int); | 624 | extern void xpc_create_kthreads(struct xpc_channel *, int, int); |
| 625 | extern void xpc_disconnect_wait(int); | 625 | extern void xpc_disconnect_wait(int); |
| 626 | extern enum xp_retval (*xpc_get_partition_rsvd_page_pa) (u64, u64 *, u64 *, | 626 | extern enum xp_retval (*xpc_get_partition_rsvd_page_pa) (void *, u64 *, |
| 627 | unsigned long *, | ||
| 627 | size_t *); | 628 | size_t *); |
| 628 | extern enum xp_retval (*xpc_rsvd_page_init) (struct xpc_rsvd_page *); | 629 | extern enum xp_retval (*xpc_rsvd_page_init) (struct xpc_rsvd_page *); |
| 629 | extern void (*xpc_heartbeat_init) (void); | 630 | extern void (*xpc_heartbeat_init) (void); |
| @@ -640,8 +641,8 @@ extern void (*xpc_notify_senders_of_disconnect) (struct xpc_channel *); | |||
| 640 | extern void (*xpc_process_msg_chctl_flags) (struct xpc_partition *, int); | 641 | extern void (*xpc_process_msg_chctl_flags) (struct xpc_partition *, int); |
| 641 | extern int (*xpc_n_of_deliverable_msgs) (struct xpc_channel *); | 642 | extern int (*xpc_n_of_deliverable_msgs) (struct xpc_channel *); |
| 642 | extern struct xpc_msg *(*xpc_get_deliverable_msg) (struct xpc_channel *); | 643 | extern struct xpc_msg *(*xpc_get_deliverable_msg) (struct xpc_channel *); |
| 643 | extern void (*xpc_request_partition_activation) (struct xpc_rsvd_page *, u64, | 644 | extern void (*xpc_request_partition_activation) (struct xpc_rsvd_page *, |
| 644 | int); | 645 | unsigned long, int); |
| 645 | extern void (*xpc_request_partition_reactivation) (struct xpc_partition *); | 646 | extern void (*xpc_request_partition_reactivation) (struct xpc_partition *); |
| 646 | extern void (*xpc_request_partition_deactivation) (struct xpc_partition *); | 647 | extern void (*xpc_request_partition_deactivation) (struct xpc_partition *); |
| 647 | extern void (*xpc_cancel_partition_deactivation_request) ( | 648 | extern void (*xpc_cancel_partition_deactivation_request) ( |
| @@ -690,7 +691,8 @@ extern enum xp_retval xpc_mark_partition_active(struct xpc_partition *); | |||
| 690 | extern void xpc_mark_partition_inactive(struct xpc_partition *); | 691 | extern void xpc_mark_partition_inactive(struct xpc_partition *); |
| 691 | extern void xpc_discovery(void); | 692 | extern void xpc_discovery(void); |
| 692 | extern enum xp_retval xpc_get_remote_rp(int, unsigned long *, | 693 | extern enum xp_retval xpc_get_remote_rp(int, unsigned long *, |
| 693 | struct xpc_rsvd_page *, u64 *); | 694 | struct xpc_rsvd_page *, |
| 695 | unsigned long *); | ||
| 694 | extern void xpc_deactivate_partition(const int, struct xpc_partition *, | 696 | extern void xpc_deactivate_partition(const int, struct xpc_partition *, |
| 695 | enum xp_retval); | 697 | enum xp_retval); |
| 696 | extern enum xp_retval xpc_initiate_partid_to_nasids(short, void *); | 698 | extern enum xp_retval xpc_initiate_partid_to_nasids(short, void *); |
diff --git a/drivers/misc/sgi-xp/xpc_channel.c b/drivers/misc/sgi-xp/xpc_channel.c index 0615efbe0070..d7a15f1a78a5 100644 --- a/drivers/misc/sgi-xp/xpc_channel.c +++ b/drivers/misc/sgi-xp/xpc_channel.c | |||
| @@ -366,9 +366,8 @@ again: | |||
| 366 | dev_dbg(xpc_chan, "XPC_CHCTL_OPENREPLY (local_msgqueue_pa=" | 366 | dev_dbg(xpc_chan, "XPC_CHCTL_OPENREPLY (local_msgqueue_pa=" |
| 367 | "0x%lx, local_nentries=%d, remote_nentries=%d) " | 367 | "0x%lx, local_nentries=%d, remote_nentries=%d) " |
| 368 | "received from partid=%d, channel=%d\n", | 368 | "received from partid=%d, channel=%d\n", |
| 369 | (unsigned long)args->local_msgqueue_pa, | 369 | args->local_msgqueue_pa, args->local_nentries, |
| 370 | args->local_nentries, args->remote_nentries, | 370 | args->remote_nentries, ch->partid, ch->number); |
| 371 | ch->partid, ch->number); | ||
| 372 | 371 | ||
| 373 | if (ch->flags & (XPC_C_DISCONNECTING | XPC_C_DISCONNECTED)) { | 372 | if (ch->flags & (XPC_C_DISCONNECTING | XPC_C_DISCONNECTED)) { |
| 374 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 373 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c index f7478cc3572d..dc686110aef7 100644 --- a/drivers/misc/sgi-xp/xpc_main.c +++ b/drivers/misc/sgi-xp/xpc_main.c | |||
| @@ -169,8 +169,9 @@ static struct notifier_block xpc_die_notifier = { | |||
| 169 | .notifier_call = xpc_system_die, | 169 | .notifier_call = xpc_system_die, |
| 170 | }; | 170 | }; |
| 171 | 171 | ||
| 172 | enum xp_retval (*xpc_get_partition_rsvd_page_pa) (u64 buf, u64 *cookie, | 172 | enum xp_retval (*xpc_get_partition_rsvd_page_pa) (void *buf, u64 *cookie, |
| 173 | u64 *paddr, size_t *len); | 173 | unsigned long *rp_pa, |
| 174 | size_t *len); | ||
| 174 | enum xp_retval (*xpc_rsvd_page_init) (struct xpc_rsvd_page *rp); | 175 | enum xp_retval (*xpc_rsvd_page_init) (struct xpc_rsvd_page *rp); |
| 175 | void (*xpc_heartbeat_init) (void); | 176 | void (*xpc_heartbeat_init) (void); |
| 176 | void (*xpc_heartbeat_exit) (void); | 177 | void (*xpc_heartbeat_exit) (void); |
| @@ -189,7 +190,8 @@ int (*xpc_n_of_deliverable_msgs) (struct xpc_channel *ch); | |||
| 189 | struct xpc_msg *(*xpc_get_deliverable_msg) (struct xpc_channel *ch); | 190 | struct xpc_msg *(*xpc_get_deliverable_msg) (struct xpc_channel *ch); |
| 190 | 191 | ||
| 191 | void (*xpc_request_partition_activation) (struct xpc_rsvd_page *remote_rp, | 192 | void (*xpc_request_partition_activation) (struct xpc_rsvd_page *remote_rp, |
| 192 | u64 remote_rp_pa, int nasid); | 193 | unsigned long remote_rp_pa, |
| 194 | int nasid); | ||
| 193 | void (*xpc_request_partition_reactivation) (struct xpc_partition *part); | 195 | void (*xpc_request_partition_reactivation) (struct xpc_partition *part); |
| 194 | void (*xpc_request_partition_deactivation) (struct xpc_partition *part); | 196 | void (*xpc_request_partition_deactivation) (struct xpc_partition *part); |
| 195 | void (*xpc_cancel_partition_deactivation_request) (struct xpc_partition *part); | 197 | void (*xpc_cancel_partition_deactivation_request) (struct xpc_partition *part); |
diff --git a/drivers/misc/sgi-xp/xpc_partition.c b/drivers/misc/sgi-xp/xpc_partition.c index f84d66410205..f150dbfcfcc7 100644 --- a/drivers/misc/sgi-xp/xpc_partition.c +++ b/drivers/misc/sgi-xp/xpc_partition.c | |||
| @@ -60,15 +60,15 @@ xpc_kmalloc_cacheline_aligned(size_t size, gfp_t flags, void **base) | |||
| 60 | * Given a nasid, get the physical address of the partition's reserved page | 60 | * Given a nasid, get the physical address of the partition's reserved page |
| 61 | * for that nasid. This function returns 0 on any error. | 61 | * for that nasid. This function returns 0 on any error. |
| 62 | */ | 62 | */ |
| 63 | static u64 | 63 | static unsigned long |
| 64 | xpc_get_rsvd_page_pa(int nasid) | 64 | xpc_get_rsvd_page_pa(int nasid) |
| 65 | { | 65 | { |
| 66 | enum xp_retval ret; | 66 | enum xp_retval ret; |
| 67 | u64 cookie = 0; | 67 | u64 cookie = 0; |
| 68 | u64 rp_pa = nasid; /* seed with nasid */ | 68 | unsigned long rp_pa = nasid; /* seed with nasid */ |
| 69 | size_t len = 0; | 69 | size_t len = 0; |
| 70 | u64 buf = buf; | 70 | size_t buf_len = 0; |
| 71 | u64 buf_len = 0; | 71 | void *buf = buf; |
| 72 | void *buf_base = NULL; | 72 | void *buf_base = NULL; |
| 73 | 73 | ||
| 74 | while (1) { | 74 | while (1) { |
| @@ -78,7 +78,7 @@ xpc_get_rsvd_page_pa(int nasid) | |||
| 78 | 78 | ||
| 79 | dev_dbg(xpc_part, "SAL returned with ret=%d, cookie=0x%016lx, " | 79 | dev_dbg(xpc_part, "SAL returned with ret=%d, cookie=0x%016lx, " |
| 80 | "address=0x%016lx, len=0x%016lx\n", ret, | 80 | "address=0x%016lx, len=0x%016lx\n", ret, |
| 81 | (unsigned long)cookie, (unsigned long)rp_pa, len); | 81 | (unsigned long)cookie, rp_pa, len); |
| 82 | 82 | ||
| 83 | if (ret != xpNeedMoreInfo) | 83 | if (ret != xpNeedMoreInfo) |
| 84 | break; | 84 | break; |
| @@ -87,19 +87,17 @@ xpc_get_rsvd_page_pa(int nasid) | |||
| 87 | if (L1_CACHE_ALIGN(len) > buf_len) { | 87 | if (L1_CACHE_ALIGN(len) > buf_len) { |
| 88 | kfree(buf_base); | 88 | kfree(buf_base); |
| 89 | buf_len = L1_CACHE_ALIGN(len); | 89 | buf_len = L1_CACHE_ALIGN(len); |
| 90 | buf = (u64)xpc_kmalloc_cacheline_aligned(buf_len, | 90 | buf = xpc_kmalloc_cacheline_aligned(buf_len, GFP_KERNEL, |
| 91 | GFP_KERNEL, | 91 | &buf_base); |
| 92 | &buf_base); | ||
| 93 | if (buf_base == NULL) { | 92 | if (buf_base == NULL) { |
| 94 | dev_err(xpc_part, "unable to kmalloc " | 93 | dev_err(xpc_part, "unable to kmalloc " |
| 95 | "len=0x%016lx\n", | 94 | "len=0x%016lx\n", buf_len); |
| 96 | (unsigned long)buf_len); | ||
| 97 | ret = xpNoMemory; | 95 | ret = xpNoMemory; |
| 98 | break; | 96 | break; |
| 99 | } | 97 | } |
| 100 | } | 98 | } |
| 101 | 99 | ||
| 102 | ret = xp_remote_memcpy((void *)buf, (void *)rp_pa, buf_len); | 100 | ret = xp_remote_memcpy(xp_pa(buf), rp_pa, buf_len); |
| 103 | if (ret != xpSuccess) { | 101 | if (ret != xpSuccess) { |
| 104 | dev_dbg(xpc_part, "xp_remote_memcpy failed %d\n", ret); | 102 | dev_dbg(xpc_part, "xp_remote_memcpy failed %d\n", ret); |
| 105 | break; | 103 | break; |
| @@ -111,8 +109,7 @@ xpc_get_rsvd_page_pa(int nasid) | |||
| 111 | if (ret != xpSuccess) | 109 | if (ret != xpSuccess) |
| 112 | rp_pa = 0; | 110 | rp_pa = 0; |
| 113 | 111 | ||
| 114 | dev_dbg(xpc_part, "reserved page at phys address 0x%016lx\n", | 112 | dev_dbg(xpc_part, "reserved page at phys address 0x%016lx\n", rp_pa); |
| 115 | (unsigned long)rp_pa); | ||
| 116 | return rp_pa; | 113 | return rp_pa; |
| 117 | } | 114 | } |
| 118 | 115 | ||
| @@ -125,7 +122,7 @@ struct xpc_rsvd_page * | |||
| 125 | xpc_setup_rsvd_page(void) | 122 | xpc_setup_rsvd_page(void) |
| 126 | { | 123 | { |
| 127 | struct xpc_rsvd_page *rp; | 124 | struct xpc_rsvd_page *rp; |
| 128 | u64 rp_pa; | 125 | unsigned long rp_pa; |
| 129 | unsigned long new_ts_jiffies; | 126 | unsigned long new_ts_jiffies; |
| 130 | 127 | ||
| 131 | /* get the local reserved page's address */ | 128 | /* get the local reserved page's address */ |
| @@ -193,7 +190,7 @@ xpc_setup_rsvd_page(void) | |||
| 193 | */ | 190 | */ |
| 194 | enum xp_retval | 191 | enum xp_retval |
| 195 | xpc_get_remote_rp(int nasid, unsigned long *discovered_nasids, | 192 | xpc_get_remote_rp(int nasid, unsigned long *discovered_nasids, |
| 196 | struct xpc_rsvd_page *remote_rp, u64 *remote_rp_pa) | 193 | struct xpc_rsvd_page *remote_rp, unsigned long *remote_rp_pa) |
| 197 | { | 194 | { |
| 198 | int l; | 195 | int l; |
| 199 | enum xp_retval ret; | 196 | enum xp_retval ret; |
| @@ -205,7 +202,7 @@ xpc_get_remote_rp(int nasid, unsigned long *discovered_nasids, | |||
| 205 | return xpNoRsvdPageAddr; | 202 | return xpNoRsvdPageAddr; |
| 206 | 203 | ||
| 207 | /* pull over the reserved page header and part_nasids mask */ | 204 | /* pull over the reserved page header and part_nasids mask */ |
| 208 | ret = xp_remote_memcpy(remote_rp, (void *)*remote_rp_pa, | 205 | ret = xp_remote_memcpy(xp_pa(remote_rp), *remote_rp_pa, |
| 209 | XPC_RP_HEADER_SIZE + xpc_nasid_mask_nbytes); | 206 | XPC_RP_HEADER_SIZE + xpc_nasid_mask_nbytes); |
| 210 | if (ret != xpSuccess) | 207 | if (ret != xpSuccess) |
| 211 | return ret; | 208 | return ret; |
| @@ -389,7 +386,7 @@ xpc_discovery(void) | |||
| 389 | { | 386 | { |
| 390 | void *remote_rp_base; | 387 | void *remote_rp_base; |
| 391 | struct xpc_rsvd_page *remote_rp; | 388 | struct xpc_rsvd_page *remote_rp; |
| 392 | u64 remote_rp_pa; | 389 | unsigned long remote_rp_pa; |
| 393 | int region; | 390 | int region; |
| 394 | int region_size; | 391 | int region_size; |
| 395 | int max_regions; | 392 | int max_regions; |
| @@ -500,7 +497,7 @@ enum xp_retval | |||
| 500 | xpc_initiate_partid_to_nasids(short partid, void *nasid_mask) | 497 | xpc_initiate_partid_to_nasids(short partid, void *nasid_mask) |
| 501 | { | 498 | { |
| 502 | struct xpc_partition *part; | 499 | struct xpc_partition *part; |
| 503 | u64 part_nasid_pa; | 500 | unsigned long part_nasid_pa; |
| 504 | 501 | ||
| 505 | part = &xpc_partitions[partid]; | 502 | part = &xpc_partitions[partid]; |
| 506 | if (part->remote_rp_pa == 0) | 503 | if (part->remote_rp_pa == 0) |
| @@ -508,8 +505,8 @@ xpc_initiate_partid_to_nasids(short partid, void *nasid_mask) | |||
| 508 | 505 | ||
| 509 | memset(nasid_mask, 0, xpc_nasid_mask_nbytes); | 506 | memset(nasid_mask, 0, xpc_nasid_mask_nbytes); |
| 510 | 507 | ||
| 511 | part_nasid_pa = (u64)XPC_RP_PART_NASIDS(part->remote_rp_pa); | 508 | part_nasid_pa = (unsigned long)XPC_RP_PART_NASIDS(part->remote_rp_pa); |
| 512 | 509 | ||
| 513 | return xp_remote_memcpy(nasid_mask, (void *)part_nasid_pa, | 510 | return xp_remote_memcpy(xp_pa(nasid_mask), part_nasid_pa, |
| 514 | xpc_nasid_mask_nbytes); | 511 | xpc_nasid_mask_nbytes); |
| 515 | } | 512 | } |
diff --git a/drivers/misc/sgi-xp/xpc_sn2.c b/drivers/misc/sgi-xp/xpc_sn2.c index fde870aebcb9..1571a7cdf9d0 100644 --- a/drivers/misc/sgi-xp/xpc_sn2.c +++ b/drivers/misc/sgi-xp/xpc_sn2.c | |||
| @@ -207,8 +207,8 @@ xpc_handle_activate_IRQ_sn2(int irq, void *dev_id) | |||
| 207 | * Flag the appropriate amo variable and send an IRQ to the specified node. | 207 | * Flag the appropriate amo variable and send an IRQ to the specified node. |
| 208 | */ | 208 | */ |
| 209 | static void | 209 | static void |
| 210 | xpc_send_activate_IRQ_sn2(u64 amos_page_pa, int from_nasid, int to_nasid, | 210 | xpc_send_activate_IRQ_sn2(unsigned long amos_page_pa, int from_nasid, |
| 211 | int to_phys_cpuid) | 211 | int to_nasid, int to_phys_cpuid) |
| 212 | { | 212 | { |
| 213 | struct amo *amos = (struct amo *)__va(amos_page_pa + | 213 | struct amo *amos = (struct amo *)__va(amos_page_pa + |
| 214 | (XPC_ACTIVATE_IRQ_AMOS_SN2 * | 214 | (XPC_ACTIVATE_IRQ_AMOS_SN2 * |
| @@ -404,7 +404,7 @@ xpc_send_chctl_openreply_sn2(struct xpc_channel *ch, unsigned long *irq_flags) | |||
| 404 | 404 | ||
| 405 | args->remote_nentries = ch->remote_nentries; | 405 | args->remote_nentries = ch->remote_nentries; |
| 406 | args->local_nentries = ch->local_nentries; | 406 | args->local_nentries = ch->local_nentries; |
| 407 | args->local_msgqueue_pa = __pa(ch->local_msgqueue); | 407 | args->local_msgqueue_pa = xp_pa(ch->local_msgqueue); |
| 408 | XPC_SEND_NOTIFY_IRQ_SN2(ch, XPC_CHCTL_OPENREPLY, irq_flags); | 408 | XPC_SEND_NOTIFY_IRQ_SN2(ch, XPC_CHCTL_OPENREPLY, irq_flags); |
| 409 | } | 409 | } |
| 410 | 410 | ||
| @@ -577,13 +577,13 @@ xpc_allow_amo_ops_shub_wars_1_1_sn2(void) | |||
| 577 | } | 577 | } |
| 578 | 578 | ||
| 579 | static enum xp_retval | 579 | static enum xp_retval |
| 580 | xpc_get_partition_rsvd_page_pa_sn2(u64 buf, u64 *cookie, u64 *paddr, | 580 | xpc_get_partition_rsvd_page_pa_sn2(void *buf, u64 *cookie, unsigned long *rp_pa, |
| 581 | size_t *len) | 581 | size_t *len) |
| 582 | { | 582 | { |
| 583 | s64 status; | 583 | s64 status; |
| 584 | enum xp_retval ret; | 584 | enum xp_retval ret; |
| 585 | 585 | ||
| 586 | status = sn_partition_reserved_page_pa(buf, cookie, paddr, len); | 586 | status = sn_partition_reserved_page_pa((u64)buf, cookie, rp_pa, len); |
| 587 | if (status == SALRET_OK) | 587 | if (status == SALRET_OK) |
| 588 | ret = xpSuccess; | 588 | ret = xpSuccess; |
| 589 | else if (status == SALRET_MORE_PASSES) | 589 | else if (status == SALRET_MORE_PASSES) |
| @@ -604,7 +604,7 @@ xpc_rsvd_page_init_sn2(struct xpc_rsvd_page *rp) | |||
| 604 | 604 | ||
| 605 | xpc_vars_sn2 = XPC_RP_VARS(rp); | 605 | xpc_vars_sn2 = XPC_RP_VARS(rp); |
| 606 | 606 | ||
| 607 | rp->sn.vars_pa = __pa(xpc_vars_sn2); | 607 | rp->sn.vars_pa = xp_pa(xpc_vars_sn2); |
| 608 | 608 | ||
| 609 | /* vars_part array follows immediately after vars */ | 609 | /* vars_part array follows immediately after vars */ |
| 610 | xpc_vars_part_sn2 = (struct xpc_vars_part_sn2 *)((u8 *)XPC_RP_VARS(rp) + | 610 | xpc_vars_part_sn2 = (struct xpc_vars_part_sn2 *)((u8 *)XPC_RP_VARS(rp) + |
| @@ -649,7 +649,7 @@ xpc_rsvd_page_init_sn2(struct xpc_rsvd_page *rp) | |||
| 649 | xpc_vars_sn2->version = XPC_V_VERSION; | 649 | xpc_vars_sn2->version = XPC_V_VERSION; |
| 650 | xpc_vars_sn2->activate_IRQ_nasid = cpuid_to_nasid(0); | 650 | xpc_vars_sn2->activate_IRQ_nasid = cpuid_to_nasid(0); |
| 651 | xpc_vars_sn2->activate_IRQ_phys_cpuid = cpu_physical_id(0); | 651 | xpc_vars_sn2->activate_IRQ_phys_cpuid = cpu_physical_id(0); |
| 652 | xpc_vars_sn2->vars_part_pa = __pa(xpc_vars_part_sn2); | 652 | xpc_vars_sn2->vars_part_pa = xp_pa(xpc_vars_part_sn2); |
| 653 | xpc_vars_sn2->amos_page_pa = ia64_tpa((u64)amos_page); | 653 | xpc_vars_sn2->amos_page_pa = ia64_tpa((u64)amos_page); |
| 654 | xpc_vars_sn2->amos_page = amos_page; /* save for next load of XPC */ | 654 | xpc_vars_sn2->amos_page = amos_page; /* save for next load of XPC */ |
| 655 | 655 | ||
| @@ -734,8 +734,8 @@ xpc_check_remote_hb_sn2(void) | |||
| 734 | } | 734 | } |
| 735 | 735 | ||
| 736 | /* pull the remote_hb cache line */ | 736 | /* pull the remote_hb cache line */ |
| 737 | ret = xp_remote_memcpy(remote_vars, | 737 | ret = xp_remote_memcpy(xp_pa(remote_vars), |
| 738 | (void *)part->sn.sn2.remote_vars_pa, | 738 | part->sn.sn2.remote_vars_pa, |
| 739 | XPC_RP_VARS_SIZE); | 739 | XPC_RP_VARS_SIZE); |
| 740 | if (ret != xpSuccess) { | 740 | if (ret != xpSuccess) { |
| 741 | XPC_DEACTIVATE_PARTITION(part, ret); | 741 | XPC_DEACTIVATE_PARTITION(part, ret); |
| @@ -768,7 +768,8 @@ xpc_check_remote_hb_sn2(void) | |||
| 768 | * assumed to be of size XPC_RP_VARS_SIZE. | 768 | * assumed to be of size XPC_RP_VARS_SIZE. |
| 769 | */ | 769 | */ |
| 770 | static enum xp_retval | 770 | static enum xp_retval |
| 771 | xpc_get_remote_vars_sn2(u64 remote_vars_pa, struct xpc_vars_sn2 *remote_vars) | 771 | xpc_get_remote_vars_sn2(unsigned long remote_vars_pa, |
| 772 | struct xpc_vars_sn2 *remote_vars) | ||
| 772 | { | 773 | { |
| 773 | enum xp_retval ret; | 774 | enum xp_retval ret; |
| 774 | 775 | ||
| @@ -776,7 +777,7 @@ xpc_get_remote_vars_sn2(u64 remote_vars_pa, struct xpc_vars_sn2 *remote_vars) | |||
| 776 | return xpVarsNotSet; | 777 | return xpVarsNotSet; |
| 777 | 778 | ||
| 778 | /* pull over the cross partition variables */ | 779 | /* pull over the cross partition variables */ |
| 779 | ret = xp_remote_memcpy(remote_vars, (void *)remote_vars_pa, | 780 | ret = xp_remote_memcpy(xp_pa(remote_vars), remote_vars_pa, |
| 780 | XPC_RP_VARS_SIZE); | 781 | XPC_RP_VARS_SIZE); |
| 781 | if (ret != xpSuccess) | 782 | if (ret != xpSuccess) |
| 782 | return ret; | 783 | return ret; |
| @@ -791,7 +792,7 @@ xpc_get_remote_vars_sn2(u64 remote_vars_pa, struct xpc_vars_sn2 *remote_vars) | |||
| 791 | 792 | ||
| 792 | static void | 793 | static void |
| 793 | xpc_request_partition_activation_sn2(struct xpc_rsvd_page *remote_rp, | 794 | xpc_request_partition_activation_sn2(struct xpc_rsvd_page *remote_rp, |
| 794 | u64 remote_rp_pa, int nasid) | 795 | unsigned long remote_rp_pa, int nasid) |
| 795 | { | 796 | { |
| 796 | xpc_send_local_activate_IRQ_sn2(nasid); | 797 | xpc_send_local_activate_IRQ_sn2(nasid); |
| 797 | } | 798 | } |
| @@ -883,7 +884,8 @@ xpc_partition_deactivation_requested_sn2(short partid) | |||
| 883 | static void | 884 | static void |
| 884 | xpc_update_partition_info_sn2(struct xpc_partition *part, u8 remote_rp_version, | 885 | xpc_update_partition_info_sn2(struct xpc_partition *part, u8 remote_rp_version, |
| 885 | unsigned long *remote_rp_ts_jiffies, | 886 | unsigned long *remote_rp_ts_jiffies, |
| 886 | u64 remote_rp_pa, u64 remote_vars_pa, | 887 | unsigned long remote_rp_pa, |
| 888 | unsigned long remote_vars_pa, | ||
| 887 | struct xpc_vars_sn2 *remote_vars) | 889 | struct xpc_vars_sn2 *remote_vars) |
| 888 | { | 890 | { |
| 889 | struct xpc_partition_sn2 *part_sn2 = &part->sn.sn2; | 891 | struct xpc_partition_sn2 *part_sn2 = &part->sn.sn2; |
| @@ -948,8 +950,8 @@ xpc_identify_activate_IRQ_req_sn2(int nasid) | |||
| 948 | { | 950 | { |
| 949 | struct xpc_rsvd_page *remote_rp; | 951 | struct xpc_rsvd_page *remote_rp; |
| 950 | struct xpc_vars_sn2 *remote_vars; | 952 | struct xpc_vars_sn2 *remote_vars; |
| 951 | u64 remote_rp_pa; | 953 | unsigned long remote_rp_pa; |
| 952 | u64 remote_vars_pa; | 954 | unsigned long remote_vars_pa; |
| 953 | int remote_rp_version; | 955 | int remote_rp_version; |
| 954 | int reactivate = 0; | 956 | int reactivate = 0; |
| 955 | unsigned long remote_rp_ts_jiffies = 0; | 957 | unsigned long remote_rp_ts_jiffies = 0; |
| @@ -1291,11 +1293,11 @@ xpc_setup_infrastructure_sn2(struct xpc_partition *part) | |||
| 1291 | * The setting of the magic # indicates that these per partition | 1293 | * The setting of the magic # indicates that these per partition |
| 1292 | * specific variables are ready to be used. | 1294 | * specific variables are ready to be used. |
| 1293 | */ | 1295 | */ |
| 1294 | xpc_vars_part_sn2[partid].GPs_pa = __pa(part_sn2->local_GPs); | 1296 | xpc_vars_part_sn2[partid].GPs_pa = xp_pa(part_sn2->local_GPs); |
| 1295 | xpc_vars_part_sn2[partid].openclose_args_pa = | 1297 | xpc_vars_part_sn2[partid].openclose_args_pa = |
| 1296 | __pa(part->local_openclose_args); | 1298 | xp_pa(part->local_openclose_args); |
| 1297 | xpc_vars_part_sn2[partid].chctl_amo_pa = | 1299 | xpc_vars_part_sn2[partid].chctl_amo_pa = |
| 1298 | __pa(part_sn2->local_chctl_amo_va); | 1300 | xp_pa(part_sn2->local_chctl_amo_va); |
| 1299 | cpuid = raw_smp_processor_id(); /* any CPU in this partition will do */ | 1301 | cpuid = raw_smp_processor_id(); /* any CPU in this partition will do */ |
| 1300 | xpc_vars_part_sn2[partid].notify_IRQ_nasid = cpuid_to_nasid(cpuid); | 1302 | xpc_vars_part_sn2[partid].notify_IRQ_nasid = cpuid_to_nasid(cpuid); |
| 1301 | xpc_vars_part_sn2[partid].notify_IRQ_phys_cpuid = | 1303 | xpc_vars_part_sn2[partid].notify_IRQ_phys_cpuid = |
| @@ -1382,25 +1384,25 @@ xpc_teardown_infrastructure_sn2(struct xpc_partition *part) | |||
| 1382 | * Create a wrapper that hides the underlying mechanism for pulling a cacheline | 1384 | * Create a wrapper that hides the underlying mechanism for pulling a cacheline |
| 1383 | * (or multiple cachelines) from a remote partition. | 1385 | * (or multiple cachelines) from a remote partition. |
| 1384 | * | 1386 | * |
| 1385 | * src must be a cacheline aligned physical address on the remote partition. | 1387 | * src_pa must be a cacheline aligned physical address on the remote partition. |
| 1386 | * dst must be a cacheline aligned virtual address on this partition. | 1388 | * dst must be a cacheline aligned virtual address on this partition. |
| 1387 | * cnt must be cacheline sized | 1389 | * cnt must be cacheline sized |
| 1388 | */ | 1390 | */ |
| 1389 | /* ??? Replace this function by call to xp_remote_memcpy() or bte_copy()? */ | 1391 | /* ??? Replace this function by call to xp_remote_memcpy() or bte_copy()? */ |
| 1390 | static enum xp_retval | 1392 | static enum xp_retval |
| 1391 | xpc_pull_remote_cachelines_sn2(struct xpc_partition *part, void *dst, | 1393 | xpc_pull_remote_cachelines_sn2(struct xpc_partition *part, void *dst, |
| 1392 | const void *src, size_t cnt) | 1394 | const unsigned long src_pa, size_t cnt) |
| 1393 | { | 1395 | { |
| 1394 | enum xp_retval ret; | 1396 | enum xp_retval ret; |
| 1395 | 1397 | ||
| 1396 | DBUG_ON((u64)src != L1_CACHE_ALIGN((u64)src)); | 1398 | DBUG_ON(src_pa != L1_CACHE_ALIGN(src_pa)); |
| 1397 | DBUG_ON((u64)dst != L1_CACHE_ALIGN((u64)dst)); | 1399 | DBUG_ON((unsigned long)dst != L1_CACHE_ALIGN((unsigned long)dst)); |
| 1398 | DBUG_ON(cnt != L1_CACHE_ALIGN(cnt)); | 1400 | DBUG_ON(cnt != L1_CACHE_ALIGN(cnt)); |
| 1399 | 1401 | ||
| 1400 | if (part->act_state == XPC_P_DEACTIVATING) | 1402 | if (part->act_state == XPC_P_DEACTIVATING) |
| 1401 | return part->reason; | 1403 | return part->reason; |
| 1402 | 1404 | ||
| 1403 | ret = xp_remote_memcpy(dst, src, cnt); | 1405 | ret = xp_remote_memcpy(xp_pa(dst), src_pa, cnt); |
| 1404 | if (ret != xpSuccess) { | 1406 | if (ret != xpSuccess) { |
| 1405 | dev_dbg(xpc_chan, "xp_remote_memcpy() from partition %d failed," | 1407 | dev_dbg(xpc_chan, "xp_remote_memcpy() from partition %d failed," |
| 1406 | " ret=%d\n", XPC_PARTID(part), ret); | 1408 | " ret=%d\n", XPC_PARTID(part), ret); |
| @@ -1420,7 +1422,8 @@ xpc_pull_remote_vars_part_sn2(struct xpc_partition *part) | |||
| 1420 | struct xpc_vars_part_sn2 *pulled_entry_cacheline = | 1422 | struct xpc_vars_part_sn2 *pulled_entry_cacheline = |
| 1421 | (struct xpc_vars_part_sn2 *)L1_CACHE_ALIGN((u64)buffer); | 1423 | (struct xpc_vars_part_sn2 *)L1_CACHE_ALIGN((u64)buffer); |
| 1422 | struct xpc_vars_part_sn2 *pulled_entry; | 1424 | struct xpc_vars_part_sn2 *pulled_entry; |
| 1423 | u64 remote_entry_cacheline_pa, remote_entry_pa; | 1425 | unsigned long remote_entry_cacheline_pa; |
| 1426 | unsigned long remote_entry_pa; | ||
| 1424 | short partid = XPC_PARTID(part); | 1427 | short partid = XPC_PARTID(part); |
| 1425 | enum xp_retval ret; | 1428 | enum xp_retval ret; |
| 1426 | 1429 | ||
| @@ -1440,7 +1443,7 @@ xpc_pull_remote_vars_part_sn2(struct xpc_partition *part) | |||
| 1440 | (L1_CACHE_BYTES - 1))); | 1443 | (L1_CACHE_BYTES - 1))); |
| 1441 | 1444 | ||
| 1442 | ret = xpc_pull_remote_cachelines_sn2(part, pulled_entry_cacheline, | 1445 | ret = xpc_pull_remote_cachelines_sn2(part, pulled_entry_cacheline, |
| 1443 | (void *)remote_entry_cacheline_pa, | 1446 | remote_entry_cacheline_pa, |
| 1444 | L1_CACHE_BYTES); | 1447 | L1_CACHE_BYTES); |
| 1445 | if (ret != xpSuccess) { | 1448 | if (ret != xpSuccess) { |
| 1446 | dev_dbg(xpc_chan, "failed to pull XPC vars_part from " | 1449 | dev_dbg(xpc_chan, "failed to pull XPC vars_part from " |
| @@ -1587,7 +1590,7 @@ xpc_get_chctl_all_flags_sn2(struct xpc_partition *part) | |||
| 1587 | if (xpc_any_openclose_chctl_flags_set(&chctl)) { | 1590 | if (xpc_any_openclose_chctl_flags_set(&chctl)) { |
| 1588 | ret = xpc_pull_remote_cachelines_sn2(part, part-> | 1591 | ret = xpc_pull_remote_cachelines_sn2(part, part-> |
| 1589 | remote_openclose_args, | 1592 | remote_openclose_args, |
| 1590 | (void *)part_sn2-> | 1593 | part_sn2-> |
| 1591 | remote_openclose_args_pa, | 1594 | remote_openclose_args_pa, |
| 1592 | XPC_OPENCLOSE_ARGS_SIZE); | 1595 | XPC_OPENCLOSE_ARGS_SIZE); |
| 1593 | if (ret != xpSuccess) { | 1596 | if (ret != xpSuccess) { |
| @@ -1604,7 +1607,7 @@ xpc_get_chctl_all_flags_sn2(struct xpc_partition *part) | |||
| 1604 | 1607 | ||
| 1605 | if (xpc_any_msg_chctl_flags_set(&chctl)) { | 1608 | if (xpc_any_msg_chctl_flags_set(&chctl)) { |
| 1606 | ret = xpc_pull_remote_cachelines_sn2(part, part_sn2->remote_GPs, | 1609 | ret = xpc_pull_remote_cachelines_sn2(part, part_sn2->remote_GPs, |
| 1607 | (void *)part_sn2->remote_GPs_pa, | 1610 | part_sn2->remote_GPs_pa, |
| 1608 | XPC_GP_SIZE); | 1611 | XPC_GP_SIZE); |
| 1609 | if (ret != xpSuccess) { | 1612 | if (ret != xpSuccess) { |
| 1610 | XPC_DEACTIVATE_PARTITION(part, ret); | 1613 | XPC_DEACTIVATE_PARTITION(part, ret); |
| @@ -1971,8 +1974,10 @@ xpc_pull_remote_msg_sn2(struct xpc_channel *ch, s64 get) | |||
| 1971 | { | 1974 | { |
| 1972 | struct xpc_partition *part = &xpc_partitions[ch->partid]; | 1975 | struct xpc_partition *part = &xpc_partitions[ch->partid]; |
| 1973 | struct xpc_channel_sn2 *ch_sn2 = &ch->sn.sn2; | 1976 | struct xpc_channel_sn2 *ch_sn2 = &ch->sn.sn2; |
| 1974 | struct xpc_msg *remote_msg, *msg; | 1977 | unsigned long remote_msg_pa; |
| 1975 | u32 msg_index, nmsgs; | 1978 | struct xpc_msg *msg; |
| 1979 | u32 msg_index; | ||
| 1980 | u32 nmsgs; | ||
| 1976 | u64 msg_offset; | 1981 | u64 msg_offset; |
| 1977 | enum xp_retval ret; | 1982 | enum xp_retval ret; |
| 1978 | 1983 | ||
| @@ -1996,10 +2001,9 @@ xpc_pull_remote_msg_sn2(struct xpc_channel *ch, s64 get) | |||
| 1996 | 2001 | ||
| 1997 | msg_offset = msg_index * ch->msg_size; | 2002 | msg_offset = msg_index * ch->msg_size; |
| 1998 | msg = (struct xpc_msg *)((u64)ch->remote_msgqueue + msg_offset); | 2003 | msg = (struct xpc_msg *)((u64)ch->remote_msgqueue + msg_offset); |
| 1999 | remote_msg = (struct xpc_msg *)(ch->remote_msgqueue_pa + | 2004 | remote_msg_pa = ch->remote_msgqueue_pa + msg_offset; |
| 2000 | msg_offset); | ||
| 2001 | 2005 | ||
| 2002 | ret = xpc_pull_remote_cachelines_sn2(part, msg, remote_msg, | 2006 | ret = xpc_pull_remote_cachelines_sn2(part, msg, remote_msg_pa, |
| 2003 | nmsgs * ch->msg_size); | 2007 | nmsgs * ch->msg_size); |
| 2004 | if (ret != xpSuccess) { | 2008 | if (ret != xpSuccess) { |
| 2005 | 2009 | ||
diff --git a/drivers/misc/sgi-xp/xpc_uv.c b/drivers/misc/sgi-xp/xpc_uv.c index 232867aa6929..c2d4ddd6e955 100644 --- a/drivers/misc/sgi-xp/xpc_uv.c +++ b/drivers/misc/sgi-xp/xpc_uv.c | |||
| @@ -61,7 +61,7 @@ xpc_heartbeat_exit_uv(void) | |||
| 61 | 61 | ||
| 62 | static void | 62 | static void |
| 63 | xpc_request_partition_activation_uv(struct xpc_rsvd_page *remote_rp, | 63 | xpc_request_partition_activation_uv(struct xpc_rsvd_page *remote_rp, |
| 64 | u64 remote_rp_pa, int nasid) | 64 | unsigned long remote_rp_pa, int nasid) |
| 65 | { | 65 | { |
| 66 | short partid = remote_rp->SAL_partid; | 66 | short partid = remote_rp->SAL_partid; |
| 67 | struct xpc_partition *part = &xpc_partitions[partid]; | 67 | struct xpc_partition *part = &xpc_partitions[partid]; |
diff --git a/drivers/misc/sgi-xp/xpnet.c b/drivers/misc/sgi-xp/xpnet.c index 49385f441705..4f5d62230116 100644 --- a/drivers/misc/sgi-xp/xpnet.c +++ b/drivers/misc/sgi-xp/xpnet.c | |||
| @@ -44,7 +44,7 @@ struct xpnet_message { | |||
| 44 | u16 version; /* Version for this message */ | 44 | u16 version; /* Version for this message */ |
| 45 | u16 embedded_bytes; /* #of bytes embedded in XPC message */ | 45 | u16 embedded_bytes; /* #of bytes embedded in XPC message */ |
| 46 | u32 magic; /* Special number indicating this is xpnet */ | 46 | u32 magic; /* Special number indicating this is xpnet */ |
| 47 | u64 buf_pa; /* phys address of buffer to retrieve */ | 47 | unsigned long buf_pa; /* phys address of buffer to retrieve */ |
| 48 | u32 size; /* #of bytes in buffer */ | 48 | u32 size; /* #of bytes in buffer */ |
| 49 | u8 leadin_ignore; /* #of bytes to ignore at the beginning */ | 49 | u8 leadin_ignore; /* #of bytes to ignore at the beginning */ |
| 50 | u8 tailout_ignore; /* #of bytes to ignore at the end */ | 50 | u8 tailout_ignore; /* #of bytes to ignore at the end */ |
| @@ -152,6 +152,7 @@ static void | |||
| 152 | xpnet_receive(short partid, int channel, struct xpnet_message *msg) | 152 | xpnet_receive(short partid, int channel, struct xpnet_message *msg) |
| 153 | { | 153 | { |
| 154 | struct sk_buff *skb; | 154 | struct sk_buff *skb; |
| 155 | void *dst; | ||
| 155 | enum xp_retval ret; | 156 | enum xp_retval ret; |
| 156 | struct xpnet_dev_private *priv = | 157 | struct xpnet_dev_private *priv = |
| 157 | (struct xpnet_dev_private *)xpnet_device->priv; | 158 | (struct xpnet_dev_private *)xpnet_device->priv; |
| @@ -166,9 +167,8 @@ xpnet_receive(short partid, int channel, struct xpnet_message *msg) | |||
| 166 | 167 | ||
| 167 | return; | 168 | return; |
| 168 | } | 169 | } |
| 169 | dev_dbg(xpnet, "received 0x%lx, %d, %d, %d\n", | 170 | dev_dbg(xpnet, "received 0x%lx, %d, %d, %d\n", msg->buf_pa, msg->size, |
| 170 | (unsigned long)msg->buf_pa, msg->size, msg->leadin_ignore, | 171 | msg->leadin_ignore, msg->tailout_ignore); |
| 171 | msg->tailout_ignore); | ||
| 172 | 172 | ||
| 173 | /* reserve an extra cache line */ | 173 | /* reserve an extra cache line */ |
| 174 | skb = dev_alloc_skb(msg->size + L1_CACHE_BYTES); | 174 | skb = dev_alloc_skb(msg->size + L1_CACHE_BYTES); |
| @@ -210,15 +210,12 @@ xpnet_receive(short partid, int channel, struct xpnet_message *msg) | |||
| 210 | skb_copy_to_linear_data(skb, &msg->data, | 210 | skb_copy_to_linear_data(skb, &msg->data, |
| 211 | (size_t)msg->embedded_bytes); | 211 | (size_t)msg->embedded_bytes); |
| 212 | } else { | 212 | } else { |
| 213 | dst = (void *)((u64)skb->data & ~(L1_CACHE_BYTES - 1)); | ||
| 213 | dev_dbg(xpnet, "transferring buffer to the skb->data area;\n\t" | 214 | dev_dbg(xpnet, "transferring buffer to the skb->data area;\n\t" |
| 214 | "xp_remote_memcpy(0x%p, 0x%p, %hu)\n", (void *) | 215 | "xp_remote_memcpy(0x%p, 0x%p, %hu)\n", dst, |
| 215 | ((u64)skb->data & ~(L1_CACHE_BYTES - 1)), | ||
| 216 | (void *)msg->buf_pa, msg->size); | 216 | (void *)msg->buf_pa, msg->size); |
| 217 | 217 | ||
| 218 | ret = xp_remote_memcpy((void *)((u64)skb->data & | 218 | ret = xp_remote_memcpy(xp_pa(dst), msg->buf_pa, msg->size); |
| 219 | ~(L1_CACHE_BYTES - 1)), | ||
| 220 | (void *)msg->buf_pa, msg->size); | ||
| 221 | |||
| 222 | if (ret != xpSuccess) { | 219 | if (ret != xpSuccess) { |
| 223 | /* | 220 | /* |
| 224 | * !!! Need better way of cleaning skb. Currently skb | 221 | * !!! Need better way of cleaning skb. Currently skb |
| @@ -226,8 +223,7 @@ xpnet_receive(short partid, int channel, struct xpnet_message *msg) | |||
| 226 | * !!! dev_kfree_skb. | 223 | * !!! dev_kfree_skb. |
| 227 | */ | 224 | */ |
| 228 | dev_err(xpnet, "xp_remote_memcpy(0x%p, 0x%p, 0x%hx) " | 225 | dev_err(xpnet, "xp_remote_memcpy(0x%p, 0x%p, 0x%hx) " |
| 229 | "returned error=0x%x\n", (void *) | 226 | "returned error=0x%x\n", dst, |
| 230 | ((u64)skb->data & ~(L1_CACHE_BYTES - 1)), | ||
| 231 | (void *)msg->buf_pa, msg->size, ret); | 227 | (void *)msg->buf_pa, msg->size, ret); |
| 232 | 228 | ||
| 233 | xpc_received(partid, channel, (void *)msg); | 229 | xpc_received(partid, channel, (void *)msg); |
| @@ -428,13 +424,13 @@ xpnet_send(struct sk_buff *skb, struct xpnet_pending_msg *queued_msg, | |||
| 428 | msg->size = end_addr - start_addr; | 424 | msg->size = end_addr - start_addr; |
| 429 | msg->leadin_ignore = (u64)skb->data - start_addr; | 425 | msg->leadin_ignore = (u64)skb->data - start_addr; |
| 430 | msg->tailout_ignore = end_addr - (u64)skb_tail_pointer(skb); | 426 | msg->tailout_ignore = end_addr - (u64)skb_tail_pointer(skb); |
| 431 | msg->buf_pa = __pa(start_addr); | 427 | msg->buf_pa = xp_pa((void *)start_addr); |
| 432 | 428 | ||
| 433 | dev_dbg(xpnet, "sending XPC message to %d:%d\n" | 429 | dev_dbg(xpnet, "sending XPC message to %d:%d\n" |
| 434 | KERN_DEBUG "msg->buf_pa=0x%lx, msg->size=%u, " | 430 | KERN_DEBUG "msg->buf_pa=0x%lx, msg->size=%u, " |
| 435 | "msg->leadin_ignore=%u, msg->tailout_ignore=%u\n", | 431 | "msg->leadin_ignore=%u, msg->tailout_ignore=%u\n", |
| 436 | dest_partid, XPC_NET_CHANNEL, (unsigned long)msg->buf_pa, | 432 | dest_partid, XPC_NET_CHANNEL, msg->buf_pa, msg->size, |
| 437 | msg->size, msg->leadin_ignore, msg->tailout_ignore); | 433 | msg->leadin_ignore, msg->tailout_ignore); |
| 438 | 434 | ||
| 439 | atomic_inc(&queued_msg->use_count); | 435 | atomic_inc(&queued_msg->use_count); |
| 440 | 436 | ||
