parisc architecture updates for kernel v5.19-rc1
Minor cleanups and code optimizations, e.g.: - improvements in assembly statements in the tmpalias code path, - added some additionals compile time checks, - drop some unneccesary assembler DMA syncs. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCYpUMsgAKCRD3ErUQojoP X/fNAQDGddN79CH+bABo6gq8dN/ko0NxxfJapAoPYEEZrKaFtwEA7FUZMfQqBVnm z+aSkbH6igueqxRCmbiW1OZ10KLwSgg= =SfFN -----END PGP SIGNATURE----- Merge tag 'for-5.19/parisc-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux Pull parisc architecture updates from Helge Deller: "Minor cleanups and code optimizations, e.g.: - improvements in assembly statements in the tmpalias code path - added some additionals compile time checks - drop some unneccesary assembler DMA syncs" * tag 'for-5.19/parisc-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: Drop __ARCH_WANT_OLD_READDIR and __ARCH_WANT_SYS_OLDUMOUNT parisc: Optimize tmpalias function calls parisc: Add dep_safe() macro to deposit a register in 32- and 64-kernels parisc: Fix wrong comment for shr macro parisc: Prevent ldil() to sign-extend into upper 32 bits parisc: Don't hardcode assembler bit definitions in tmpalias code parisc: Don't enforce DMA completion order in cache flushes parisc: video: fbdev: stifb: Add sti_dump_font() to dump STI font
This commit is contained in:
Коммит
e11a93567d
|
@ -143,7 +143,7 @@
|
|||
depd,z \r, 63-(\sa), 64-(\sa), \t
|
||||
.endm
|
||||
|
||||
/* Shift Right - note the r and t can NOT be the same! */
|
||||
/* Shift Right for 32-bit. Clobbers upper 32-bit on PA2.0. */
|
||||
.macro shr r, sa, t
|
||||
extru \r, 31-(\sa), 32-(\sa), \t
|
||||
.endm
|
||||
|
@ -174,6 +174,16 @@
|
|||
#endif
|
||||
.endm
|
||||
|
||||
/* The depw instruction leaves the most significant 32 bits of the
|
||||
* target register in an undefined state on PA 2.0 systems. */
|
||||
.macro dep_safe i, p, len, t
|
||||
#ifdef CONFIG_64BIT
|
||||
depd \i, 32+(\p), \len, \t
|
||||
#else
|
||||
depw \i, \p, \len, \t
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/* load 32-bit 'value' into 'reg' compensating for the ldil
|
||||
* sign-extension when running in wide mode.
|
||||
* WARNING!! neither 'value' nor 'reg' can be expressions
|
||||
|
|
|
@ -54,6 +54,7 @@ void parisc_setup_cache_timing(void);
|
|||
#define asm_io_sync() asm volatile("sync" \
|
||||
ALTERNATIVE(ALT_COND_NO_DCACHE, INSN_NOP) \
|
||||
ALTERNATIVE(ALT_COND_NO_IOC_FDC, INSN_NOP) :::"memory")
|
||||
#define asm_syncdma() asm volatile("syncdma" :::"memory")
|
||||
|
||||
#endif /* ! __ASSEMBLY__ */
|
||||
|
||||
|
|
|
@ -9,12 +9,27 @@
|
|||
*
|
||||
* All of the values in this file must be <4GB (because of assembly
|
||||
* loading restrictions). If you place this region anywhere above
|
||||
* __PAGE_OFFSET, you must adjust the memory map accordingly */
|
||||
* __PAGE_OFFSET, you must adjust the memory map accordingly
|
||||
*/
|
||||
|
||||
/* The alias region is used in kernel space to do copy/clear to or
|
||||
* from areas congruently mapped with user space. It is 8MB large
|
||||
* and must be 16MB aligned */
|
||||
#define TMPALIAS_MAP_START ((__PAGE_OFFSET) - 16*1024*1024)
|
||||
/*
|
||||
* The tmpalias region is used in kernel space to copy/clear/flush data
|
||||
* from pages congruently mapped with user space. It is comprised of
|
||||
* a pair regions. The size of these regions is determined by the largest
|
||||
* cache aliasing boundary for machines that support equivalent aliasing.
|
||||
*
|
||||
* The c3750 with PA8700 processor returns an alias value of 11. This
|
||||
* indicates that it has an alias boundary of 4 MB. It also supports
|
||||
* non-equivalent aliasing without a performance penalty.
|
||||
*
|
||||
* Machines with PA8800/PA8900 processors return an alias value of 0.
|
||||
* This indicates the alias boundary is unknown and may be larger than
|
||||
* 16 MB. Non-equivalent aliasing is not supported.
|
||||
*
|
||||
* Here we assume the maximum alias boundary is 4 MB.
|
||||
*/
|
||||
#define TMPALIAS_SIZE_BITS 22 /* 4 MB */
|
||||
#define TMPALIAS_MAP_START ((__PAGE_OFFSET) - (2 << TMPALIAS_SIZE_BITS))
|
||||
|
||||
#define FIXMAP_SIZE (FIX_BITMAP_COUNT << PAGE_SHIFT)
|
||||
#define FIXMAP_START (TMPALIAS_MAP_START - FIXMAP_SIZE)
|
||||
|
|
|
@ -142,7 +142,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
|
|||
}
|
||||
|
||||
#define __ARCH_WANT_NEW_STAT
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_ALARM
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
|
@ -156,7 +155,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
|
|||
#define __ARCH_WANT_SYS_FADVISE64
|
||||
#define __ARCH_WANT_SYS_GETPGRP
|
||||
#define __ARCH_WANT_SYS_NICE
|
||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||
#define __ARCH_WANT_SYS_SIGPENDING
|
||||
#define __ARCH_WANT_SYS_SIGPROCMASK
|
||||
#define __ARCH_WANT_SYS_FORK
|
||||
|
|
|
@ -754,6 +754,9 @@ void invalidate_kernel_vmap_range(void *vaddr, int size)
|
|||
unsigned long start = (unsigned long)vaddr;
|
||||
unsigned long end = start + size;
|
||||
|
||||
/* Ensure DMA is complete */
|
||||
asm_syncdma();
|
||||
|
||||
if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
|
||||
(unsigned long)size >= parisc_cache_flush_threshold) {
|
||||
flush_tlb_kernel_range(start, end);
|
||||
|
|
|
@ -554,8 +554,9 @@
|
|||
extrd,s \pte,63,25,\pte
|
||||
.endm
|
||||
|
||||
/* The alias region is an 8MB aligned 16MB to do clear and
|
||||
* copy user pages at addresses congruent with the user
|
||||
/* The alias region is comprised of a pair of 4 MB regions
|
||||
* aligned to 8 MB. It is used to clear/copy/flush user pages
|
||||
* using kernel virtual addresses congruent with the user
|
||||
* virtual address.
|
||||
*
|
||||
* To use the alias page, you set %r26 up with the to TLB
|
||||
|
@ -565,13 +566,8 @@
|
|||
.macro do_alias spc,tmp,tmp1,va,pte,prot,fault,patype
|
||||
cmpib,COND(<>),n 0,\spc,\fault
|
||||
ldil L%(TMPALIAS_MAP_START),\tmp
|
||||
#if defined(CONFIG_64BIT) && (TMPALIAS_MAP_START >= 0x80000000)
|
||||
/* on LP64, ldi will sign extend into the upper 32 bits,
|
||||
* which is behaviour we don't want */
|
||||
depdi 0,31,32,\tmp
|
||||
#endif
|
||||
copy \va,\tmp1
|
||||
depi 0,31,23,\tmp1
|
||||
depi_safe 0,31,TMPALIAS_SIZE_BITS+1,\tmp1
|
||||
cmpb,COND(<>),n \tmp,\tmp1,\fault
|
||||
mfctl %cr19,\tmp /* iir */
|
||||
/* get the opcode (first six bits) into \tmp */
|
||||
|
@ -604,13 +600,13 @@
|
|||
* OK, it is in the temp alias region, check whether "from" or "to".
|
||||
* Check "subtle" note in pacache.S re: r23/r26.
|
||||
*/
|
||||
#ifdef CONFIG_64BIT
|
||||
extrd,u,*= \va,41,1,%r0
|
||||
#else
|
||||
extrw,u,= \va,9,1,%r0
|
||||
#endif
|
||||
extrw,u,= \va,31-TMPALIAS_SIZE_BITS,1,%r0
|
||||
or,COND(tr) %r23,%r0,\pte
|
||||
or %r26,%r0,\pte
|
||||
|
||||
/* convert phys addr in \pte (from r23 or r26) to tlb insert format */
|
||||
SHRREG \pte,PAGE_SHIFT+PAGE_ADD_SHIFT-5, \pte
|
||||
depi_safe _PAGE_SIZE_ENCODING_DEFAULT, 31,5, \pte
|
||||
.endm
|
||||
|
||||
|
||||
|
|
|
@ -300,7 +300,6 @@ fdoneloop2:
|
|||
fdce,m %arg1(%sr1, %arg0) /* Fdce for one loop */
|
||||
|
||||
fdsync:
|
||||
syncdma
|
||||
sync
|
||||
mtsm %r22 /* restore I-bit */
|
||||
89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP)
|
||||
|
@ -488,6 +487,8 @@ ENDPROC_CFI(copy_page_asm)
|
|||
* parisc chip designers that there will not ever be a parisc
|
||||
* chip with a larger alias boundary (Never say never :-) ).
|
||||
*
|
||||
* Yah, what about the PA8800 and PA8900 processors?
|
||||
*
|
||||
* Subtle: the dtlb miss handlers support the temp alias region by
|
||||
* "knowing" that if a dtlb miss happens within the temp alias
|
||||
* region it must have occurred while in clear_user_page. Since
|
||||
|
@ -499,19 +500,10 @@ ENDPROC_CFI(copy_page_asm)
|
|||
* miss on the translation, the dtlb miss handler inserts the
|
||||
* translation into the tlb using these values:
|
||||
*
|
||||
* %r26 physical page (shifted for tlb insert) of "to" translation
|
||||
* %r23 physical page (shifted for tlb insert) of "from" translation
|
||||
* %r26 physical address of "to" translation
|
||||
* %r23 physical address of "from" translation
|
||||
*/
|
||||
|
||||
/* Drop prot bits and convert to page addr for iitlbt and idtlbt */
|
||||
#define PAGE_ADD_SHIFT (PAGE_SHIFT-12)
|
||||
.macro convert_phys_for_tlb_insert20 phys
|
||||
extrd,u \phys, 56-PAGE_ADD_SHIFT, 32-PAGE_ADD_SHIFT, \phys
|
||||
#if _PAGE_SIZE_ENCODING_DEFAULT
|
||||
depdi _PAGE_SIZE_ENCODING_DEFAULT, 63, (63-58), \phys
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* copy_user_page_asm() performs a page copy using mappings
|
||||
* equivalent to the user page mappings. It can be used to
|
||||
|
@ -540,24 +532,10 @@ ENTRY_CFI(copy_user_page_asm)
|
|||
sub %r25, %r1, %r23
|
||||
|
||||
ldil L%(TMPALIAS_MAP_START), %r28
|
||||
#ifdef CONFIG_64BIT
|
||||
#if (TMPALIAS_MAP_START >= 0x80000000)
|
||||
depdi 0, 31,32, %r28 /* clear any sign extension */
|
||||
#endif
|
||||
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
|
||||
convert_phys_for_tlb_insert20 %r23 /* convert phys addr to tlb insert format */
|
||||
depd %r24,63,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
dep_safe %r24, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
|
||||
depi_safe 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
copy %r28, %r29
|
||||
depdi 1, 41,1, %r29 /* Form aliased virtual address 'from' */
|
||||
#else
|
||||
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
|
||||
extrw,u %r23, 24,25, %r23 /* convert phys addr to tlb insert format */
|
||||
depw %r24, 31,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
copy %r28, %r29
|
||||
depwi 1, 9,1, %r29 /* Form aliased virtual address 'from' */
|
||||
#endif
|
||||
depi_safe 1, 31-TMPALIAS_SIZE_BITS,1, %r29 /* Form aliased virtual address 'from' */
|
||||
|
||||
/* Purge any old translations */
|
||||
|
||||
|
@ -687,18 +665,8 @@ ENTRY_CFI(clear_user_page_asm)
|
|||
tophys_r1 %r26
|
||||
|
||||
ldil L%(TMPALIAS_MAP_START), %r28
|
||||
#ifdef CONFIG_64BIT
|
||||
#if (TMPALIAS_MAP_START >= 0x80000000)
|
||||
depdi 0, 31,32, %r28 /* clear any sign extension */
|
||||
#endif
|
||||
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
|
||||
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
#else
|
||||
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
|
||||
depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
#endif
|
||||
dep_safe %r25, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
|
||||
depi_safe 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
|
||||
/* Purge any old translation */
|
||||
|
||||
|
@ -763,18 +731,8 @@ ENDPROC_CFI(clear_user_page_asm)
|
|||
|
||||
ENTRY_CFI(flush_dcache_page_asm)
|
||||
ldil L%(TMPALIAS_MAP_START), %r28
|
||||
#ifdef CONFIG_64BIT
|
||||
#if (TMPALIAS_MAP_START >= 0x80000000)
|
||||
depdi 0, 31,32, %r28 /* clear any sign extension */
|
||||
#endif
|
||||
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
|
||||
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
#else
|
||||
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
|
||||
depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
#endif
|
||||
dep_safe %r25, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
|
||||
depi_safe 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
|
||||
/* Purge any old translation */
|
||||
|
||||
|
@ -822,18 +780,8 @@ ENDPROC_CFI(flush_dcache_page_asm)
|
|||
|
||||
ENTRY_CFI(purge_dcache_page_asm)
|
||||
ldil L%(TMPALIAS_MAP_START), %r28
|
||||
#ifdef CONFIG_64BIT
|
||||
#if (TMPALIAS_MAP_START >= 0x80000000)
|
||||
depdi 0, 31,32, %r28 /* clear any sign extension */
|
||||
#endif
|
||||
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
|
||||
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
#else
|
||||
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
|
||||
depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
#endif
|
||||
dep_safe %r25, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
|
||||
depi_safe 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
|
||||
/* Purge any old translation */
|
||||
|
||||
|
@ -881,18 +829,8 @@ ENDPROC_CFI(purge_dcache_page_asm)
|
|||
|
||||
ENTRY_CFI(flush_icache_page_asm)
|
||||
ldil L%(TMPALIAS_MAP_START), %r28
|
||||
#ifdef CONFIG_64BIT
|
||||
#if (TMPALIAS_MAP_START >= 0x80000000)
|
||||
depdi 0, 31,32, %r28 /* clear any sign extension */
|
||||
#endif
|
||||
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
|
||||
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
#else
|
||||
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
|
||||
depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */
|
||||
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
#endif
|
||||
dep_safe %r25, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
|
||||
depi_safe 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
|
||||
/* Purge any old translation. Note that the FIC instruction
|
||||
* may use either the instruction or data TLB. Given that we
|
||||
|
@ -1098,7 +1036,6 @@ ENTRY_CFI(flush_kernel_dcache_range_asm)
|
|||
|
||||
sync
|
||||
89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP)
|
||||
syncdma
|
||||
bv %r0(%r2)
|
||||
nop
|
||||
ENDPROC_CFI(flush_kernel_dcache_range_asm)
|
||||
|
@ -1140,7 +1077,6 @@ ENTRY_CFI(purge_kernel_dcache_range_asm)
|
|||
|
||||
sync
|
||||
89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP)
|
||||
syncdma
|
||||
bv %r0(%r2)
|
||||
nop
|
||||
ENDPROC_CFI(purge_kernel_dcache_range_asm)
|
||||
|
|
|
@ -555,6 +555,12 @@ void __init mem_init(void)
|
|||
BUILD_BUG_ON(PT_INITIAL > PTRS_PER_PGD);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
/* avoid ldil_%L() asm statements to sign-extend into upper 32-bits */
|
||||
BUILD_BUG_ON(__PAGE_OFFSET >= 0x80000000);
|
||||
BUILD_BUG_ON(TMPALIAS_MAP_START >= 0x80000000);
|
||||
#endif
|
||||
|
||||
high_memory = __va((max_pfn << PAGE_SHIFT));
|
||||
set_max_mapnr(max_low_pfn);
|
||||
memblock_free_all();
|
||||
|
|
|
@ -549,6 +549,26 @@ sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name)
|
|||
}
|
||||
#endif
|
||||
|
||||
static void sti_dump_font(struct sti_cooked_font *font)
|
||||
{
|
||||
#ifdef STI_DUMP_FONT
|
||||
unsigned char *p = (unsigned char *)font->raw;
|
||||
int n;
|
||||
|
||||
p += sizeof(struct sti_rom_font);
|
||||
pr_debug(" w %d h %d bpc %d\n", font->width, font->height,
|
||||
font->raw->bytes_per_char);
|
||||
|
||||
for (n = 0; n < 256 * font->raw->bytes_per_char; n += 16, p += 16) {
|
||||
pr_debug(" 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x,"
|
||||
" 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x,"
|
||||
" 0x%02x, 0x%02x, 0x%02x, 0x%02x,\n",
|
||||
p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8],
|
||||
p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static int sti_search_font(struct sti_cooked_rom *rom, int height, int width)
|
||||
{
|
||||
struct sti_cooked_font *font;
|
||||
|
@ -796,6 +816,7 @@ static int sti_read_rom(int wordmode, struct sti_struct *sti,
|
|||
sti->font->width = sti->font->raw->width;
|
||||
sti->font->height = sti->font->raw->height;
|
||||
sti_font_convert_bytemode(sti, sti->font);
|
||||
sti_dump_font(sti->font);
|
||||
|
||||
sti->sti_mem_request = raw->sti_mem_req;
|
||||
sti->graphics_id[0] = raw->graphics_id[0];
|
||||
|
|
Загрузка…
Ссылка в новой задаче