Merge branch 'parisc-5.2-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parisc fixes from Helge Deller: - Fix crashes when accessing PCI devices on some machines like C240 and J5000. The crashes were triggered because we replaced cache flushes by nops in the alternative coding where we shouldn't for some machines. - Dave fixed a race in the usage of the sr1 space register when used to load the coherence index. - Use the hardware lpa instruction to to load the physical address of kernel virtual addresses in the iommu driver code. - The kernel may fail to link when CONFIG_MLONGCALLS isn't set. Solve that by rearranging functions in the final vmlinux executeable. - Some defconfig cleanups and removal of compiler warnings. * 'parisc-5.2-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: Fix crash due alternative coding for NP iopdir_fdc bit parisc: Use lpa instruction to load physical addresses in driver code parisc: configs: Remove useless UEVENT_HELPER_PATH parisc: Use implicit space register selection for loading the coherence index of I/O pdirs parisc: Fix compiler warnings in float emulation code parisc/slab: cleanup after /proc/slab_allocators removal parisc: Allow building 64-bit kernel without -mlong-calls compiler option parisc: Kconfig: remove ARCH_DISCARD_MEMBLOCK
This commit is contained in:
commit
16d72dd489
|
@ -36,7 +36,6 @@ config PARISC
|
|||
select GENERIC_STRNCPY_FROM_USER
|
||||
select SYSCTL_ARCH_UNALIGN_ALLOW
|
||||
select SYSCTL_EXCEPTION_TRACE
|
||||
select ARCH_DISCARD_MEMBLOCK
|
||||
select HAVE_MOD_ARCH_SPECIFIC
|
||||
select VIRT_TO_BUS
|
||||
select MODULES_USE_ELF_RELA
|
||||
|
@ -195,7 +194,8 @@ config PREFETCH
|
|||
|
||||
config MLONGCALLS
|
||||
bool "Enable the -mlong-calls compiler option for big kernels"
|
||||
default y
|
||||
default y if !MODULES || UBSAN || FTRACE
|
||||
default n
|
||||
depends on PA8X00
|
||||
help
|
||||
If you configure the kernel to include many drivers built-in instead
|
||||
|
|
|
@ -34,7 +34,6 @@ CONFIG_INET_DIAG=m
|
|||
CONFIG_NETFILTER=y
|
||||
CONFIG_LLC2=m
|
||||
CONFIG_NET_PKTGEN=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
|
|
|
@ -70,7 +70,6 @@ CONFIG_IP_DCCP=m
|
|||
# CONFIG_IP_DCCP_CCID3 is not set
|
||||
CONFIG_LLC2=m
|
||||
CONFIG_NET_PKTGEN=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
|
|
|
@ -24,7 +24,6 @@ CONFIG_INET=y
|
|||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
|
|
|
@ -32,7 +32,6 @@ CONFIG_INET6_IPCOMP=m
|
|||
CONFIG_IPV6_TUNNEL=m
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NET_PKTGEN=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
|
|
|
@ -57,7 +57,6 @@ CONFIG_IP_DCCP=m
|
|||
CONFIG_TIPC=m
|
||||
CONFIG_LLC2=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
|
|
|
@ -44,7 +44,6 @@ CONFIG_INET6_AH=y
|
|||
CONFIG_INET6_ESP=y
|
||||
CONFIG_INET6_IPCOMP=y
|
||||
CONFIG_LLC2=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
|
|
|
@ -47,7 +47,6 @@ CONFIG_INET_ESP=m
|
|||
CONFIG_INET_DIAG=m
|
||||
CONFIG_LLC2=m
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
|
|
|
@ -2,6 +2,30 @@
|
|||
#ifndef __PARISC_SPECIAL_INSNS_H
|
||||
#define __PARISC_SPECIAL_INSNS_H
|
||||
|
||||
#define lpa(va) ({ \
|
||||
unsigned long pa; \
|
||||
__asm__ __volatile__( \
|
||||
"copy %%r0,%0\n\t" \
|
||||
"lpa %%r0(%1),%0" \
|
||||
: "=r" (pa) \
|
||||
: "r" (va) \
|
||||
: "memory" \
|
||||
); \
|
||||
pa; \
|
||||
})
|
||||
|
||||
#define lpa_user(va) ({ \
|
||||
unsigned long pa; \
|
||||
__asm__ __volatile__( \
|
||||
"copy %%r0,%0\n\t" \
|
||||
"lpa %%r0(%%sr3,%1),%0" \
|
||||
: "=r" (pa) \
|
||||
: "r" (va) \
|
||||
: "memory" \
|
||||
); \
|
||||
pa; \
|
||||
})
|
||||
|
||||
#define mfctl(reg) ({ \
|
||||
unsigned long cr; \
|
||||
__asm__ __volatile__( \
|
||||
|
|
|
@ -56,7 +56,8 @@ void __init_or_module apply_alternatives(struct alt_instr *start,
|
|||
* time IO-PDIR is changed in Ike/Astro.
|
||||
*/
|
||||
if ((cond & ALT_COND_NO_IOC_FDC) &&
|
||||
(boot_cpu_data.pdc.capabilities & PDC_MODEL_IOPDIR_FDC))
|
||||
((boot_cpu_data.cpu_type <= pcxw_) ||
|
||||
(boot_cpu_data.pdc.capabilities & PDC_MODEL_IOPDIR_FDC)))
|
||||
continue;
|
||||
|
||||
/* Want to replace pdtlb by a pdtlb,l instruction? */
|
||||
|
|
|
@ -35,6 +35,15 @@ OUTPUT_FORMAT("elf64-hppa-linux")
|
|||
OUTPUT_ARCH(hppa:hppa2.0w)
|
||||
#endif
|
||||
|
||||
#define EXIT_TEXT_SECTIONS() .exit.text : { EXIT_TEXT }
|
||||
#if !defined(CONFIG_64BIT) || defined(CONFIG_MLONGCALLS)
|
||||
#define MLONGCALL_KEEP(x)
|
||||
#define MLONGCALL_DISCARD(x) x
|
||||
#else
|
||||
#define MLONGCALL_KEEP(x) x
|
||||
#define MLONGCALL_DISCARD(x)
|
||||
#endif
|
||||
|
||||
ENTRY(parisc_kernel_start)
|
||||
#ifndef CONFIG_64BIT
|
||||
jiffies = jiffies_64 + 4;
|
||||
|
@ -47,15 +56,11 @@ SECTIONS
|
|||
|
||||
__init_begin = .;
|
||||
HEAD_TEXT_SECTION
|
||||
INIT_TEXT_SECTION(8)
|
||||
MLONGCALL_DISCARD(INIT_TEXT_SECTION(8))
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
INIT_DATA_SECTION(PAGE_SIZE)
|
||||
/* we have to discard exit text and such at runtime, not link time */
|
||||
.exit.text :
|
||||
{
|
||||
EXIT_TEXT
|
||||
}
|
||||
MLONGCALL_DISCARD(EXIT_TEXT_SECTIONS())
|
||||
.exit.data :
|
||||
{
|
||||
EXIT_DATA
|
||||
|
@ -73,11 +78,12 @@ SECTIONS
|
|||
|
||||
_text = .; /* Text and read-only data */
|
||||
_stext = .;
|
||||
MLONGCALL_KEEP(INIT_TEXT_SECTION(8))
|
||||
.text ALIGN(PAGE_SIZE) : {
|
||||
TEXT_TEXT
|
||||
LOCK_TEXT
|
||||
SCHED_TEXT
|
||||
CPUIDLE_TEXT
|
||||
LOCK_TEXT
|
||||
KPROBES_TEXT
|
||||
IRQENTRY_TEXT
|
||||
SOFTIRQENTRY_TEXT
|
||||
|
@ -92,6 +98,7 @@ SECTIONS
|
|||
*(.lock.text) /* out-of-line lock text */
|
||||
*(.gnu.warning)
|
||||
}
|
||||
MLONGCALL_KEEP(EXIT_TEXT_SECTIONS())
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_etext = .;
|
||||
/* End of text section */
|
||||
|
|
|
@ -47,19 +47,19 @@
|
|||
((exponent < (SGL_P - 1)) ? \
|
||||
(Sall(sgl_value) << (SGL_EXP_LENGTH + 1 + exponent)) : FALSE)
|
||||
|
||||
#define Int_isinexact_to_sgl(int_value) (int_value << 33 - SGL_EXP_LENGTH)
|
||||
#define Int_isinexact_to_sgl(int_value) ((int_value << 33 - SGL_EXP_LENGTH) != 0)
|
||||
|
||||
#define Sgl_roundnearest_from_int(int_value,sgl_value) \
|
||||
if (int_value & 1<<(SGL_EXP_LENGTH - 2)) /* round bit */ \
|
||||
if ((int_value << 34 - SGL_EXP_LENGTH) || Slow(sgl_value)) \
|
||||
if (((int_value << 34 - SGL_EXP_LENGTH) != 0) || Slow(sgl_value)) \
|
||||
Sall(sgl_value)++
|
||||
|
||||
#define Dint_isinexact_to_sgl(dint_valueA,dint_valueB) \
|
||||
((Dintp1(dint_valueA) << 33 - SGL_EXP_LENGTH) || Dintp2(dint_valueB))
|
||||
(((Dintp1(dint_valueA) << 33 - SGL_EXP_LENGTH) != 0) || Dintp2(dint_valueB))
|
||||
|
||||
#define Sgl_roundnearest_from_dint(dint_valueA,dint_valueB,sgl_value) \
|
||||
if (Dintp1(dint_valueA) & 1<<(SGL_EXP_LENGTH - 2)) \
|
||||
if ((Dintp1(dint_valueA) << 34 - SGL_EXP_LENGTH) || \
|
||||
if (((Dintp1(dint_valueA) << 34 - SGL_EXP_LENGTH) != 0) || \
|
||||
Dintp2(dint_valueB) || Slow(sgl_value)) Sall(sgl_value)++
|
||||
|
||||
#define Dint_isinexact_to_dbl(dint_value) \
|
||||
|
|
|
@ -562,14 +562,12 @@ ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
|
|||
/* We currently only support kernel addresses */
|
||||
BUG_ON(sid != KERNEL_SPACE);
|
||||
|
||||
mtsp(sid,1);
|
||||
|
||||
/*
|
||||
** WORD 1 - low order word
|
||||
** "hints" parm includes the VALID bit!
|
||||
** "dep" clobbers the physical address offset bits as well.
|
||||
*/
|
||||
pa = virt_to_phys(vba);
|
||||
pa = lpa(vba);
|
||||
asm volatile("depw %1,31,12,%0" : "+r" (pa) : "r" (hints));
|
||||
((u32 *)pdir_ptr)[1] = (u32) pa;
|
||||
|
||||
|
@ -594,7 +592,7 @@ ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
|
|||
** Grab virtual index [0:11]
|
||||
** Deposit virt_idx bits into I/O PDIR word
|
||||
*/
|
||||
asm volatile ("lci %%r0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba));
|
||||
asm volatile ("lci %%r0(%1), %0" : "=r" (ci) : "r" (vba));
|
||||
asm volatile ("extru %1,19,12,%0" : "+r" (ci) : "r" (ci));
|
||||
asm volatile ("depw %1,15,12,%0" : "+r" (pa) : "r" (ci));
|
||||
|
||||
|
|
|
@ -569,11 +569,10 @@ sba_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
|
|||
u64 pa; /* physical address */
|
||||
register unsigned ci; /* coherent index */
|
||||
|
||||
pa = virt_to_phys(vba);
|
||||
pa = lpa(vba);
|
||||
pa &= IOVP_MASK;
|
||||
|
||||
mtsp(sid,1);
|
||||
asm("lci 0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba));
|
||||
asm("lci 0(%1), %0" : "=r" (ci) : "r" (vba));
|
||||
pa |= (ci >> PAGE_SHIFT) & 0xff; /* move CI (8 bits) into lowest byte */
|
||||
|
||||
pa |= SBA_PDIR_VALID_BIT; /* set "valid" bit */
|
||||
|
|
Loading…
Reference in New Issue