C6X: headers
Original port to early 2.6 kernel using TI COFF toolchain. Brought up to date by Mark Salter <msalter@redhat.com> Signed-off-by: Aurelien Jacquiot <a-jacquiot@ti.com> Signed-off-by: Mark Salter <msalter@redhat.com> Acked-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
parent
52679b2d73
commit
a7f626c194
23 changed files with 1178 additions and 0 deletions
1
arch/c6x/include/asm/asm-offsets.h
Normal file
1
arch/c6x/include/asm/asm-offsets.h
Normal file
|
@ -0,0 +1 @@
|
|||
#include <generated/asm-offsets.h>
|
105
arch/c6x/include/asm/bitops.h
Normal file
105
arch/c6x/include/asm/bitops.h
Normal file
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2004, 2009, 2010 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_BITOPS_H
|
||||
#define _ASM_C6X_BITOPS_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
/*
|
||||
* clear_bit() doesn't provide any barrier for the compiler.
|
||||
*/
|
||||
#define smp_mb__before_clear_bit() barrier()
|
||||
#define smp_mb__after_clear_bit() barrier()
|
||||
|
||||
/*
|
||||
* We are lucky, DSP is perfect for bitops: do it in 3 cycles
|
||||
*/
|
||||
|
||||
/**
|
||||
* __ffs - find first bit in word.
|
||||
* @word: The word to search
|
||||
*
|
||||
* Undefined if no bit exists, so code should check against 0 first.
|
||||
* Note __ffs(0) = undef, __ffs(1) = 0, __ffs(0x80000000) = 31.
|
||||
*
|
||||
*/
|
||||
static inline unsigned long __ffs(unsigned long x)
|
||||
{
|
||||
asm (" bitr .M1 %0,%0\n"
|
||||
" nop\n"
|
||||
" lmbd .L1 1,%0,%0\n"
|
||||
: "+a"(x));
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
/*
|
||||
* ffz - find first zero in word.
|
||||
* @word: The word to search
|
||||
*
|
||||
* Undefined if no zero exists, so code should check against ~0UL first.
|
||||
*/
|
||||
#define ffz(x) __ffs(~(x))
|
||||
|
||||
/**
|
||||
* fls - find last (most-significant) bit set
|
||||
* @x: the word to search
|
||||
*
|
||||
* This is defined the same way as ffs.
|
||||
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
|
||||
*/
|
||||
static inline int fls(int x)
|
||||
{
|
||||
if (!x)
|
||||
return 0;
|
||||
|
||||
asm (" lmbd .L1 1,%0,%0\n" : "+a"(x));
|
||||
|
||||
return 32 - x;
|
||||
}
|
||||
|
||||
/**
|
||||
* ffs - find first bit set
|
||||
* @x: the word to search
|
||||
*
|
||||
* This is defined the same way as
|
||||
* the libc and compiler builtin ffs routines, therefore
|
||||
* differs in spirit from the above ffz (man ffs).
|
||||
* Note ffs(0) = 0, ffs(1) = 1, ffs(0x80000000) = 32.
|
||||
*/
|
||||
static inline int ffs(int x)
|
||||
{
|
||||
if (!x)
|
||||
return 0;
|
||||
|
||||
return __ffs(x) + 1;
|
||||
}
|
||||
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
#include <asm-generic/bitops/find.h>
|
||||
|
||||
#include <asm-generic/bitops/sched.h>
|
||||
#include <asm-generic/bitops/hweight.h>
|
||||
#include <asm-generic/bitops/lock.h>
|
||||
|
||||
#include <asm-generic/bitops/atomic.h>
|
||||
#include <asm-generic/bitops/non-atomic.h>
|
||||
#include <asm-generic/bitops/le.h>
|
||||
#include <asm-generic/bitops/ext2-atomic.h>
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_C6X_BITOPS_H */
|
12
arch/c6x/include/asm/byteorder.h
Normal file
12
arch/c6x/include/asm/byteorder.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
#ifndef _ASM_C6X_BYTEORDER_H
|
||||
#define _ASM_C6X_BYTEORDER_H
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
#ifdef _BIG_ENDIAN
|
||||
#include <linux/byteorder/big_endian.h>
|
||||
#else /* _BIG_ENDIAN */
|
||||
#include <linux/byteorder/little_endian.h>
|
||||
#endif /* _BIG_ENDIAN */
|
||||
|
||||
#endif /* _ASM_BYTEORDER_H */
|
67
arch/c6x/include/asm/delay.h
Normal file
67
arch/c6x/include/asm/delay.h
Normal file
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_DELAY_H
|
||||
#define _ASM_C6X_DELAY_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
extern unsigned int ticks_per_ns_scaled;
|
||||
|
||||
static inline void __delay(unsigned long loops)
|
||||
{
|
||||
uint32_t tmp;
|
||||
|
||||
/* 6 cycles per loop */
|
||||
asm volatile (" mv .s1 %0,%1\n"
|
||||
"0: [%1] b .s1 0b\n"
|
||||
" add .l1 -6,%0,%0\n"
|
||||
" cmplt .l1 1,%0,%1\n"
|
||||
" nop 3\n"
|
||||
: "+a"(loops), "=A"(tmp));
|
||||
}
|
||||
|
||||
static inline void _c6x_tickdelay(unsigned int x)
|
||||
{
|
||||
uint32_t cnt, endcnt;
|
||||
|
||||
asm volatile (" mvc .s2 TSCL,%0\n"
|
||||
" add .s2x %0,%1,%2\n"
|
||||
" || mvk .l2 1,B0\n"
|
||||
"0: [B0] b .s2 0b\n"
|
||||
" mvc .s2 TSCL,%0\n"
|
||||
" sub .s2 %0,%2,%0\n"
|
||||
" cmpgt .l2 0,%0,B0\n"
|
||||
" nop 2\n"
|
||||
: "=b"(cnt), "+a"(x), "=b"(endcnt) : : "B0");
|
||||
}
|
||||
|
||||
/* use scaled math to avoid slow division */
|
||||
#define C6X_NDELAY_SCALE 10
|
||||
|
||||
static inline void _ndelay(unsigned int n)
|
||||
{
|
||||
_c6x_tickdelay((ticks_per_ns_scaled * n) >> C6X_NDELAY_SCALE);
|
||||
}
|
||||
|
||||
static inline void _udelay(unsigned int n)
|
||||
{
|
||||
while (n >= 10) {
|
||||
_ndelay(10000);
|
||||
n -= 10;
|
||||
}
|
||||
while (n-- > 0)
|
||||
_ndelay(1000);
|
||||
}
|
||||
|
||||
#define udelay(x) _udelay((unsigned int)(x))
|
||||
#define ndelay(x) _ndelay((unsigned int)(x))
|
||||
|
||||
#endif /* _ASM_C6X_DELAY_H */
|
113
arch/c6x/include/asm/elf.h
Normal file
113
arch/c6x/include/asm/elf.h
Normal file
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2004, 2009, 2010 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_ELF_H
|
||||
#define _ASM_C6X_ELF_H
|
||||
|
||||
/*
|
||||
* ELF register definitions..
|
||||
*/
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
typedef unsigned long elf_greg_t;
|
||||
typedef unsigned long elf_fpreg_t;
|
||||
|
||||
#define ELF_NGREG 58
|
||||
#define ELF_NFPREG 1
|
||||
|
||||
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
||||
typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
|
||||
|
||||
/*
|
||||
* This is used to ensure we don't load something for the wrong architecture.
|
||||
*/
|
||||
#define elf_check_arch(x) ((x)->e_machine == EM_TI_C6000)
|
||||
|
||||
#define elf_check_const_displacement(x) (1)
|
||||
|
||||
/*
|
||||
* These are used to set parameters in the core dumps.
|
||||
*/
|
||||
#ifdef __LITTLE_ENDIAN__
|
||||
#define ELF_DATA ELFDATA2LSB
|
||||
#else
|
||||
#define ELF_DATA ELFDATA2MSB
|
||||
#endif
|
||||
|
||||
#define ELF_CLASS ELFCLASS32
|
||||
#define ELF_ARCH EM_TI_C6000
|
||||
|
||||
/* Nothing for now. Need to setup DP... */
|
||||
#define ELF_PLAT_INIT(_r)
|
||||
|
||||
#define USE_ELF_CORE_DUMP
|
||||
#define ELF_EXEC_PAGESIZE 4096
|
||||
|
||||
#define ELF_CORE_COPY_REGS(_dest, _regs) \
|
||||
memcpy((char *) &_dest, (char *) _regs, \
|
||||
sizeof(struct pt_regs));
|
||||
|
||||
/* This yields a mask that user programs can use to figure out what
|
||||
instruction set this cpu supports. */
|
||||
|
||||
#define ELF_HWCAP (0)
|
||||
|
||||
/* This yields a string that ld.so will use to load implementation
|
||||
specific libraries for optimization. This is more specific in
|
||||
intent than poking at uname or /proc/cpuinfo. */
|
||||
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) set_personality(PER_LINUX)
|
||||
|
||||
/* C6X specific section types */
|
||||
#define SHT_C6000_UNWIND 0x70000001
|
||||
#define SHT_C6000_PREEMPTMAP 0x70000002
|
||||
#define SHT_C6000_ATTRIBUTES 0x70000003
|
||||
|
||||
/* C6X specific DT_ tags */
|
||||
#define DT_C6000_DSBT_BASE 0x70000000
|
||||
#define DT_C6000_DSBT_SIZE 0x70000001
|
||||
#define DT_C6000_PREEMPTMAP 0x70000002
|
||||
#define DT_C6000_DSBT_INDEX 0x70000003
|
||||
|
||||
/* C6X specific relocs */
|
||||
#define R_C6000_NONE 0
|
||||
#define R_C6000_ABS32 1
|
||||
#define R_C6000_ABS16 2
|
||||
#define R_C6000_ABS8 3
|
||||
#define R_C6000_PCR_S21 4
|
||||
#define R_C6000_PCR_S12 5
|
||||
#define R_C6000_PCR_S10 6
|
||||
#define R_C6000_PCR_S7 7
|
||||
#define R_C6000_ABS_S16 8
|
||||
#define R_C6000_ABS_L16 9
|
||||
#define R_C6000_ABS_H16 10
|
||||
#define R_C6000_SBR_U15_B 11
|
||||
#define R_C6000_SBR_U15_H 12
|
||||
#define R_C6000_SBR_U15_W 13
|
||||
#define R_C6000_SBR_S16 14
|
||||
#define R_C6000_SBR_L16_B 15
|
||||
#define R_C6000_SBR_L16_H 16
|
||||
#define R_C6000_SBR_L16_W 17
|
||||
#define R_C6000_SBR_H16_B 18
|
||||
#define R_C6000_SBR_H16_H 19
|
||||
#define R_C6000_SBR_H16_W 20
|
||||
#define R_C6000_SBR_GOT_U15_W 21
|
||||
#define R_C6000_SBR_GOT_L16_W 22
|
||||
#define R_C6000_SBR_GOT_H16_W 23
|
||||
#define R_C6000_DSBT_INDEX 24
|
||||
#define R_C6000_PREL31 25
|
||||
#define R_C6000_COPY 26
|
||||
#define R_C6000_ALIGN 253
|
||||
#define R_C6000_FPHEAD 254
|
||||
#define R_C6000_NOCMP 255
|
||||
|
||||
#endif /*_ASM_C6X_ELF_H */
|
6
arch/c6x/include/asm/ftrace.h
Normal file
6
arch/c6x/include/asm/ftrace.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef _ASM_C6X_FTRACE_H
|
||||
#define _ASM_C6X_FTRACE_H
|
||||
|
||||
/* empty */
|
||||
|
||||
#endif /* _ASM_C6X_FTRACE_H */
|
30
arch/c6x/include/asm/linkage.h
Normal file
30
arch/c6x/include/asm/linkage.h
Normal file
|
@ -0,0 +1,30 @@
|
|||
#ifndef _ASM_C6X_LINKAGE_H
|
||||
#define _ASM_C6X_LINKAGE_H
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
#define __ALIGN .align 2
|
||||
#define __ALIGN_STR ".align 2"
|
||||
|
||||
#ifndef __DSBT__
|
||||
#define ENTRY(name) \
|
||||
.global name @ \
|
||||
__ALIGN @ \
|
||||
name:
|
||||
#else
|
||||
#define ENTRY(name) \
|
||||
.global name @ \
|
||||
.hidden name @ \
|
||||
__ALIGN @ \
|
||||
name:
|
||||
#endif
|
||||
|
||||
#define ENDPROC(name) \
|
||||
.type name, @function @ \
|
||||
.size name, . - name
|
||||
|
||||
#endif
|
||||
|
||||
#include <asm-generic/linkage.h>
|
||||
|
||||
#endif /* _ASM_C6X_LINKAGE_H */
|
4
arch/c6x/include/asm/memblock.h
Normal file
4
arch/c6x/include/asm/memblock.h
Normal file
|
@ -0,0 +1,4 @@
|
|||
#ifndef _ASM_C6X_MEMBLOCK_H
|
||||
#define _ASM_C6X_MEMBLOCK_H
|
||||
|
||||
#endif /* _ASM_C6X_MEMBLOCK_H */
|
18
arch/c6x/include/asm/mmu.h
Normal file
18
arch/c6x/include/asm/mmu.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2004, 2009, 2010 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_MMU_H
|
||||
#define _ASM_C6X_MMU_H
|
||||
|
||||
typedef struct {
|
||||
unsigned long end_brk;
|
||||
} mm_context_t;
|
||||
|
||||
#endif /* _ASM_C6X_MMU_H */
|
6
arch/c6x/include/asm/mutex.h
Normal file
6
arch/c6x/include/asm/mutex.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef _ASM_C6X_MUTEX_H
|
||||
#define _ASM_C6X_MUTEX_H
|
||||
|
||||
#include <asm-generic/mutex-null.h>
|
||||
|
||||
#endif /* _ASM_C6X_MUTEX_H */
|
11
arch/c6x/include/asm/page.h
Normal file
11
arch/c6x/include/asm/page.h
Normal file
|
@ -0,0 +1,11 @@
|
|||
#ifndef _ASM_C6X_PAGE_H
|
||||
#define _ASM_C6X_PAGE_H
|
||||
|
||||
#define VM_DATA_DEFAULT_FLAGS \
|
||||
(VM_READ | VM_WRITE | \
|
||||
((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \
|
||||
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
|
||||
|
||||
#include <asm-generic/page.h>
|
||||
|
||||
#endif /* _ASM_C6X_PAGE_H */
|
81
arch/c6x/include/asm/pgtable.h
Normal file
81
arch/c6x/include/asm/pgtable.h
Normal file
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2004, 2009, 2010 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_PGTABLE_H
|
||||
#define _ASM_C6X_PGTABLE_H
|
||||
|
||||
#include <asm-generic/4level-fixup.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/*
|
||||
* All 32bit addresses are effectively valid for vmalloc...
|
||||
* Sort of meaningless for non-VM targets.
|
||||
*/
|
||||
#define VMALLOC_START 0
|
||||
#define VMALLOC_END 0xffffffff
|
||||
|
||||
#define pgd_present(pgd) (1)
|
||||
#define pgd_none(pgd) (0)
|
||||
#define pgd_bad(pgd) (0)
|
||||
#define pgd_clear(pgdp)
|
||||
#define kern_addr_valid(addr) (1)
|
||||
|
||||
#define pmd_offset(a, b) ((void *)0)
|
||||
#define pmd_none(x) (!pmd_val(x))
|
||||
#define pmd_present(x) (pmd_val(x))
|
||||
#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0)
|
||||
#define pmd_bad(x) (pmd_val(x) & ~PAGE_MASK)
|
||||
|
||||
#define PAGE_NONE __pgprot(0) /* these mean nothing to NO_MM */
|
||||
#define PAGE_SHARED __pgprot(0) /* these mean nothing to NO_MM */
|
||||
#define PAGE_COPY __pgprot(0) /* these mean nothing to NO_MM */
|
||||
#define PAGE_READONLY __pgprot(0) /* these mean nothing to NO_MM */
|
||||
#define PAGE_KERNEL __pgprot(0) /* these mean nothing to NO_MM */
|
||||
#define pgprot_noncached(prot) (prot)
|
||||
|
||||
extern void paging_init(void);
|
||||
|
||||
#define __swp_type(x) (0)
|
||||
#define __swp_offset(x) (0)
|
||||
#define __swp_entry(typ, off) ((swp_entry_t) { ((typ) | ((off) << 7)) })
|
||||
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
||||
#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
|
||||
|
||||
static inline int pte_file(pte_t pte)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define set_pte(pteptr, pteval) (*(pteptr) = pteval)
|
||||
#define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval)
|
||||
|
||||
/*
|
||||
* ZERO_PAGE is a global shared page that is always zero: used
|
||||
* for zero-mapped memory areas etc..
|
||||
*/
|
||||
#define ZERO_PAGE(vaddr) virt_to_page(empty_zero_page)
|
||||
extern unsigned long empty_zero_page;
|
||||
|
||||
#define swapper_pg_dir ((pgd_t *) 0)
|
||||
|
||||
/*
|
||||
* No page table caches to initialise
|
||||
*/
|
||||
#define pgtable_cache_init() do { } while (0)
|
||||
#define io_remap_pfn_range remap_pfn_range
|
||||
|
||||
#define io_remap_page_range(vma, vaddr, paddr, size, prot) \
|
||||
remap_pfn_range(vma, vaddr, (paddr) >> PAGE_SHIFT, size, prot)
|
||||
|
||||
#include <asm-generic/pgtable.h>
|
||||
|
||||
#endif /* _ASM_C6X_PGTABLE_H */
|
28
arch/c6x/include/asm/procinfo.h
Normal file
28
arch/c6x/include/asm/procinfo.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright (C) 2010 Texas Instruments Incorporated
|
||||
* Author: Mark Salter (msalter@redhat.com)
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_PROCINFO_H
|
||||
#define _ASM_C6X_PROCINFO_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
struct proc_info_list {
|
||||
unsigned int cpu_val;
|
||||
unsigned int cpu_mask;
|
||||
const char *arch_name;
|
||||
const char *elf_name;
|
||||
unsigned int elf_hwcap;
|
||||
};
|
||||
|
||||
#else /* __KERNEL__ */
|
||||
#include <asm/elf.h>
|
||||
#warning "Please include asm/elf.h instead"
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _ASM_C6X_PROCINFO_H */
|
1
arch/c6x/include/asm/prom.h
Normal file
1
arch/c6x/include/asm/prom.h
Normal file
|
@ -0,0 +1 @@
|
|||
/* dummy prom.h; here to make linux/of.h's #includes happy */
|
12
arch/c6x/include/asm/sections.h
Normal file
12
arch/c6x/include/asm/sections.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
#ifndef _ASM_C6X_SECTIONS_H
|
||||
#define _ASM_C6X_SECTIONS_H
|
||||
|
||||
#include <asm-generic/sections.h>
|
||||
|
||||
extern char _vectors_start[];
|
||||
extern char _vectors_end[];
|
||||
|
||||
extern char _data_lma[];
|
||||
extern char _fdt_start[], _fdt_end[];
|
||||
|
||||
#endif /* _ASM_C6X_SECTIONS_H */
|
32
arch/c6x/include/asm/setup.h
Normal file
32
arch/c6x/include/asm/setup.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2004, 2009, 2010 2011 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_SETUP_H
|
||||
#define _ASM_C6X_SETUP_H
|
||||
|
||||
#define COMMAND_LINE_SIZE 1024
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern char c6x_command_line[COMMAND_LINE_SIZE];
|
||||
|
||||
extern int c6x_add_memory(phys_addr_t start, unsigned long size);
|
||||
|
||||
extern unsigned long ram_start;
|
||||
extern unsigned long ram_end;
|
||||
|
||||
extern int c6x_num_cores;
|
||||
extern unsigned int c6x_silicon_rev;
|
||||
extern unsigned int c6x_devstat;
|
||||
extern unsigned char c6x_fuse_mac[6];
|
||||
|
||||
extern void machine_init(unsigned long dt_ptr);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* _ASM_C6X_SETUP_H */
|
21
arch/c6x/include/asm/string.h
Normal file
21
arch/c6x/include/asm/string.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2004, 2009, 2011 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_STRING_H
|
||||
#define _ASM_C6X_STRING_H
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <linux/linkage.h>
|
||||
|
||||
asmlinkage extern void *memcpy(void *to, const void *from, size_t n);
|
||||
|
||||
#define __HAVE_ARCH_MEMCPY
|
||||
|
||||
#endif /* _ASM_C6X_STRING_H */
|
54
arch/c6x/include/asm/swab.h
Normal file
54
arch/c6x/include/asm/swab.h
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated
|
||||
* Author: Mark Salter <msalter@redhat.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_SWAB_H
|
||||
#define _ASM_C6X_SWAB_H
|
||||
|
||||
static inline __attribute_const__ __u16 __c6x_swab16(__u16 val)
|
||||
{
|
||||
asm("swap4 .l1 %0,%0\n" : "+a"(val));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline __attribute_const__ __u32 __c6x_swab32(__u32 val)
|
||||
{
|
||||
asm("swap4 .l1 %0,%0\n"
|
||||
"swap2 .l1 %0,%0\n"
|
||||
: "+a"(val));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline __attribute_const__ __u64 __c6x_swab64(__u64 val)
|
||||
{
|
||||
asm(" swap2 .s1 %p0,%P0\n"
|
||||
"|| swap2 .l1 %P0,%p0\n"
|
||||
" swap4 .l1 %p0,%p0\n"
|
||||
" swap4 .l1 %P0,%P0\n"
|
||||
: "+a"(val));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline __attribute_const__ __u32 __c6x_swahw32(__u32 val)
|
||||
{
|
||||
asm("swap2 .l1 %0,%0\n" : "+a"(val));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline __attribute_const__ __u32 __c6x_swahb32(__u32 val)
|
||||
{
|
||||
asm("swap4 .l1 %0,%0\n" : "+a"(val));
|
||||
return val;
|
||||
}
|
||||
|
||||
#define __arch_swab16 __c6x_swab16
|
||||
#define __arch_swab32 __c6x_swab32
|
||||
#define __arch_swab64 __c6x_swab64
|
||||
#define __arch_swahw32 __c6x_swahw32
|
||||
#define __arch_swahb32 __c6x_swahb32
|
||||
|
||||
#endif /* _ASM_C6X_SWAB_H */
|
123
arch/c6x/include/asm/syscall.h
Normal file
123
arch/c6x/include/asm/syscall.h
Normal file
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated
|
||||
* Author: Mark Salter <msalter@redhat.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_C6X_SYSCALL_H
|
||||
#define __ASM_C6X_SYSCALL_H
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
static inline int syscall_get_nr(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
return regs->b0;
|
||||
}
|
||||
|
||||
static inline void syscall_rollback(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
static inline long syscall_get_error(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
return IS_ERR_VALUE(regs->a4) ? regs->a4 : 0;
|
||||
}
|
||||
|
||||
static inline long syscall_get_return_value(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
return regs->a4;
|
||||
}
|
||||
|
||||
static inline void syscall_set_return_value(struct task_struct *task,
|
||||
struct pt_regs *regs,
|
||||
int error, long val)
|
||||
{
|
||||
regs->a4 = error ?: val;
|
||||
}
|
||||
|
||||
static inline void syscall_get_arguments(struct task_struct *task,
|
||||
struct pt_regs *regs, unsigned int i,
|
||||
unsigned int n, unsigned long *args)
|
||||
{
|
||||
switch (i) {
|
||||
case 0:
|
||||
if (!n--)
|
||||
break;
|
||||
*args++ = regs->a4;
|
||||
case 1:
|
||||
if (!n--)
|
||||
break;
|
||||
*args++ = regs->b4;
|
||||
case 2:
|
||||
if (!n--)
|
||||
break;
|
||||
*args++ = regs->a6;
|
||||
case 3:
|
||||
if (!n--)
|
||||
break;
|
||||
*args++ = regs->b6;
|
||||
case 4:
|
||||
if (!n--)
|
||||
break;
|
||||
*args++ = regs->a8;
|
||||
case 5:
|
||||
if (!n--)
|
||||
break;
|
||||
*args++ = regs->b8;
|
||||
case 6:
|
||||
if (!n--)
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
static inline void syscall_set_arguments(struct task_struct *task,
|
||||
struct pt_regs *regs,
|
||||
unsigned int i, unsigned int n,
|
||||
const unsigned long *args)
|
||||
{
|
||||
switch (i) {
|
||||
case 0:
|
||||
if (!n--)
|
||||
break;
|
||||
regs->a4 = *args++;
|
||||
case 1:
|
||||
if (!n--)
|
||||
break;
|
||||
regs->b4 = *args++;
|
||||
case 2:
|
||||
if (!n--)
|
||||
break;
|
||||
regs->a6 = *args++;
|
||||
case 3:
|
||||
if (!n--)
|
||||
break;
|
||||
regs->b6 = *args++;
|
||||
case 4:
|
||||
if (!n--)
|
||||
break;
|
||||
regs->a8 = *args++;
|
||||
case 5:
|
||||
if (!n--)
|
||||
break;
|
||||
regs->a9 = *args++;
|
||||
case 6:
|
||||
if (!n)
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* __ASM_C6X_SYSCALLS_H */
|
168
arch/c6x/include/asm/system.h
Normal file
168
arch/c6x/include/asm/system.h
Normal file
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_SYSTEM_H
|
||||
#define _ASM_C6X_SYSTEM_H
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/irqflags.h>
|
||||
|
||||
#define prepare_to_switch() do { } while (0)
|
||||
|
||||
struct task_struct;
|
||||
struct thread_struct;
|
||||
asmlinkage void *__switch_to(struct thread_struct *prev,
|
||||
struct thread_struct *next,
|
||||
struct task_struct *tsk);
|
||||
|
||||
#define switch_to(prev, next, last) \
|
||||
do { \
|
||||
current->thread.wchan = (u_long) __builtin_return_address(0); \
|
||||
(last) = __switch_to(&(prev)->thread, \
|
||||
&(next)->thread, (prev)); \
|
||||
mb(); \
|
||||
current->thread.wchan = 0; \
|
||||
} while (0)
|
||||
|
||||
/* Reset the board */
|
||||
#define HARD_RESET_NOW()
|
||||
|
||||
#define get_creg(reg) \
|
||||
({ unsigned int __x; \
|
||||
asm volatile ("mvc .s2 " #reg ",%0\n" : "=b"(__x)); __x; })
|
||||
|
||||
#define set_creg(reg, v) \
|
||||
do { unsigned int __x = (unsigned int)(v); \
|
||||
asm volatile ("mvc .s2 %0," #reg "\n" : : "b"(__x)); \
|
||||
} while (0)
|
||||
|
||||
#define or_creg(reg, n) \
|
||||
do { unsigned __x, __n = (unsigned)(n); \
|
||||
asm volatile ("mvc .s2 " #reg ",%0\n" \
|
||||
"or .l2 %1,%0,%0\n" \
|
||||
"mvc .s2 %0," #reg "\n" \
|
||||
"nop\n" \
|
||||
: "=&b"(__x) : "b"(__n)); \
|
||||
} while (0)
|
||||
|
||||
#define and_creg(reg, n) \
|
||||
do { unsigned __x, __n = (unsigned)(n); \
|
||||
asm volatile ("mvc .s2 " #reg ",%0\n" \
|
||||
"and .l2 %1,%0,%0\n" \
|
||||
"mvc .s2 %0," #reg "\n" \
|
||||
"nop\n" \
|
||||
: "=&b"(__x) : "b"(__n)); \
|
||||
} while (0)
|
||||
|
||||
#define get_coreid() (get_creg(DNUM) & 0xff)
|
||||
|
||||
/* Set/get IST */
|
||||
#define set_ist(x) set_creg(ISTP, x)
|
||||
#define get_ist() get_creg(ISTP)
|
||||
|
||||
/*
|
||||
* Exception management
|
||||
*/
|
||||
asmlinkage void enable_exception(void);
|
||||
#define disable_exception()
|
||||
#define get_except_type() get_creg(EFR)
|
||||
#define ack_exception(type) set_creg(ECR, 1 << (type))
|
||||
#define get_iexcept() get_creg(IERR)
|
||||
#define set_iexcept(mask) set_creg(IERR, (mask))
|
||||
|
||||
/*
|
||||
* Misc. functions
|
||||
*/
|
||||
#define nop() asm("NOP\n");
|
||||
#define mb() barrier()
|
||||
#define rmb() barrier()
|
||||
#define wmb() barrier()
|
||||
#define set_mb(var, value) do { var = value; mb(); } while (0)
|
||||
#define set_wmb(var, value) do { var = value; wmb(); } while (0)
|
||||
|
||||
#define smp_mb() barrier()
|
||||
#define smp_rmb() barrier()
|
||||
#define smp_wmb() barrier()
|
||||
#define smp_read_barrier_depends() do { } while (0)
|
||||
|
||||
#define xchg(ptr, x) \
|
||||
((__typeof__(*(ptr)))__xchg((unsigned int)(x), (void *) (ptr), \
|
||||
sizeof(*(ptr))))
|
||||
#define tas(ptr) xchg((ptr), 1)
|
||||
|
||||
unsigned int _lmbd(unsigned int, unsigned int);
|
||||
unsigned int _bitr(unsigned int);
|
||||
|
||||
struct __xchg_dummy { unsigned int a[100]; };
|
||||
#define __xg(x) ((volatile struct __xchg_dummy *)(x))
|
||||
|
||||
static inline unsigned int __xchg(unsigned int x, volatile void *ptr, int size)
|
||||
{
|
||||
unsigned int tmp;
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
tmp = 0;
|
||||
tmp = *((unsigned char *) ptr);
|
||||
*((unsigned char *) ptr) = (unsigned char) x;
|
||||
break;
|
||||
case 2:
|
||||
tmp = 0;
|
||||
tmp = *((unsigned short *) ptr);
|
||||
*((unsigned short *) ptr) = x;
|
||||
break;
|
||||
case 4:
|
||||
tmp = 0;
|
||||
tmp = *((unsigned int *) ptr);
|
||||
*((unsigned int *) ptr) = x;
|
||||
break;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
#include <asm-generic/cmpxchg-local.h>
|
||||
|
||||
/*
|
||||
* cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make
|
||||
* them available.
|
||||
*/
|
||||
#define cmpxchg_local(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), \
|
||||
(unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
sizeof(*(ptr))))
|
||||
#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
|
||||
|
||||
#include <asm-generic/cmpxchg.h>
|
||||
|
||||
#define _extu(x, s, e) \
|
||||
({ unsigned int __x; \
|
||||
asm volatile ("extu .S2 %3,%1,%2,%0\n" : \
|
||||
"=b"(__x) : "n"(s), "n"(e), "b"(x)); \
|
||||
__x; })
|
||||
|
||||
|
||||
extern unsigned int c6x_core_freq;
|
||||
|
||||
struct pt_regs;
|
||||
|
||||
extern void die(char *str, struct pt_regs *fp, int nr);
|
||||
extern asmlinkage int process_exception(struct pt_regs *regs);
|
||||
extern void time_init(void);
|
||||
extern void free_initmem(void);
|
||||
|
||||
extern void (*c6x_restart)(void);
|
||||
extern void (*c6x_halt)(void);
|
||||
|
||||
#endif /* _ASM_C6X_SYSTEM_H */
|
8
arch/c6x/include/asm/tlb.h
Normal file
8
arch/c6x/include/asm/tlb.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
#ifndef _ASM_C6X_TLB_H
|
||||
#define _ASM_C6X_TLB_H
|
||||
|
||||
#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm)
|
||||
|
||||
#include <asm-generic/tlb.h>
|
||||
|
||||
#endif /* _ASM_C6X_TLB_H */
|
107
arch/c6x/include/asm/uaccess.h
Normal file
107
arch/c6x/include/asm/uaccess.h
Normal file
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated
|
||||
* Author: Mark Salter <msalter@redhat.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_UACCESS_H
|
||||
#define _ASM_C6X_UACCESS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#ifdef CONFIG_ACCESS_CHECK
|
||||
#define __access_ok _access_ok
|
||||
#endif
|
||||
|
||||
/*
|
||||
* __copy_from_user/copy_to_user are based on ones in asm-generic/uaccess.h
|
||||
*
|
||||
* C6X supports unaligned 32 and 64 bit loads and stores.
|
||||
*/
|
||||
static inline __must_check long __copy_from_user(void *to,
|
||||
const void __user *from, unsigned long n)
|
||||
{
|
||||
u32 tmp32;
|
||||
u64 tmp64;
|
||||
|
||||
if (__builtin_constant_p(n)) {
|
||||
switch (n) {
|
||||
case 1:
|
||||
*(u8 *)to = *(u8 __force *)from;
|
||||
return 0;
|
||||
case 4:
|
||||
asm volatile ("ldnw .d1t1 *%2,%0\n"
|
||||
"nop 4\n"
|
||||
"stnw .d1t1 %0,*%1\n"
|
||||
: "=&a"(tmp32)
|
||||
: "A"(to), "a"(from)
|
||||
: "memory");
|
||||
return 0;
|
||||
case 8:
|
||||
asm volatile ("ldndw .d1t1 *%2,%0\n"
|
||||
"nop 4\n"
|
||||
"stndw .d1t1 %0,*%1\n"
|
||||
: "=&a"(tmp64)
|
||||
: "a"(to), "a"(from)
|
||||
: "memory");
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(to, (const void __force *)from, n);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline __must_check long __copy_to_user(void __user *to,
|
||||
const void *from, unsigned long n)
|
||||
{
|
||||
u32 tmp32;
|
||||
u64 tmp64;
|
||||
|
||||
if (__builtin_constant_p(n)) {
|
||||
switch (n) {
|
||||
case 1:
|
||||
*(u8 __force *)to = *(u8 *)from;
|
||||
return 0;
|
||||
case 4:
|
||||
asm volatile ("ldnw .d1t1 *%2,%0\n"
|
||||
"nop 4\n"
|
||||
"stnw .d1t1 %0,*%1\n"
|
||||
: "=&a"(tmp32)
|
||||
: "a"(to), "a"(from)
|
||||
: "memory");
|
||||
return 0;
|
||||
case 8:
|
||||
asm volatile ("ldndw .d1t1 *%2,%0\n"
|
||||
"nop 4\n"
|
||||
"stndw .d1t1 %0,*%1\n"
|
||||
: "=&a"(tmp64)
|
||||
: "a"(to), "a"(from)
|
||||
: "memory");
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy((void __force *)to, from, n);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define __copy_to_user __copy_to_user
|
||||
#define __copy_from_user __copy_from_user
|
||||
|
||||
extern int _access_ok(unsigned long addr, unsigned long size);
|
||||
#ifdef CONFIG_ACCESS_CHECK
|
||||
#define __access_ok _access_ok
|
||||
#endif
|
||||
|
||||
#include <asm-generic/uaccess.h>
|
||||
|
||||
#endif /* _ASM_C6X_UACCESS_H */
|
170
arch/c6x/include/asm/unaligned.h
Normal file
170
arch/c6x/include/asm/unaligned.h
Normal file
|
@ -0,0 +1,170 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2004, 2009, 2010 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
* Rewritten for 2.6.3x: Mark Salter <msalter@redhat.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ASM_C6X_UNALIGNED_H
|
||||
#define _ASM_C6X_UNALIGNED_H
|
||||
|
||||
#include <linux/swab.h>
|
||||
|
||||
/*
|
||||
* The C64x+ can do unaligned word and dword accesses in hardware
|
||||
* using special load/store instructions.
|
||||
*/
|
||||
|
||||
static inline u16 get_unaligned_le16(const void *p)
|
||||
{
|
||||
const u8 *_p = p;
|
||||
return _p[0] | _p[1] << 8;
|
||||
}
|
||||
|
||||
static inline u16 get_unaligned_be16(const void *p)
|
||||
{
|
||||
const u8 *_p = p;
|
||||
return _p[0] << 8 | _p[1];
|
||||
}
|
||||
|
||||
static inline void put_unaligned_le16(u16 val, void *p)
|
||||
{
|
||||
u8 *_p = p;
|
||||
_p[0] = val;
|
||||
_p[1] = val >> 8;
|
||||
}
|
||||
|
||||
static inline void put_unaligned_be16(u16 val, void *p)
|
||||
{
|
||||
u8 *_p = p;
|
||||
_p[0] = val >> 8;
|
||||
_p[1] = val;
|
||||
}
|
||||
|
||||
static inline u32 get_unaligned32(const void *p)
|
||||
{
|
||||
u32 val = (u32) p;
|
||||
asm (" ldnw .d1t1 *%0,%0\n"
|
||||
" nop 4\n"
|
||||
: "+a"(val));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void put_unaligned32(u32 val, void *p)
|
||||
{
|
||||
asm volatile (" stnw .d2t1 %0,*%1\n"
|
||||
: : "a"(val), "b"(p) : "memory");
|
||||
}
|
||||
|
||||
static inline u64 get_unaligned64(const void *p)
|
||||
{
|
||||
u64 val;
|
||||
asm volatile (" ldndw .d1t1 *%1,%0\n"
|
||||
" nop 4\n"
|
||||
: "=a"(val) : "a"(p));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void put_unaligned64(u64 val, const void *p)
|
||||
{
|
||||
asm volatile (" stndw .d2t1 %0,*%1\n"
|
||||
: : "a"(val), "b"(p) : "memory");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||
|
||||
#define get_unaligned_le32(p) __swab32(get_unaligned32(p))
|
||||
#define get_unaligned_le64(p) __swab64(get_unaligned64(p))
|
||||
#define get_unaligned_be32(p) get_unaligned32(p)
|
||||
#define get_unaligned_be64(p) get_unaligned64(p)
|
||||
#define put_unaligned_le32(v, p) put_unaligned32(__swab32(v), (p))
|
||||
#define put_unaligned_le64(v, p) put_unaligned64(__swab64(v), (p))
|
||||
#define put_unaligned_be32(v, p) put_unaligned32((v), (p))
|
||||
#define put_unaligned_be64(v, p) put_unaligned64((v), (p))
|
||||
#define get_unaligned __get_unaligned_be
|
||||
#define put_unaligned __put_unaligned_be
|
||||
|
||||
#else
|
||||
|
||||
#define get_unaligned_le32(p) get_unaligned32(p)
|
||||
#define get_unaligned_le64(p) get_unaligned64(p)
|
||||
#define get_unaligned_be32(p) __swab32(get_unaligned32(p))
|
||||
#define get_unaligned_be64(p) __swab64(get_unaligned64(p))
|
||||
#define put_unaligned_le32(v, p) put_unaligned32((v), (p))
|
||||
#define put_unaligned_le64(v, p) put_unaligned64((v), (p))
|
||||
#define put_unaligned_be32(v, p) put_unaligned32(__swab32(v), (p))
|
||||
#define put_unaligned_be64(v, p) put_unaligned64(__swab64(v), (p))
|
||||
#define get_unaligned __get_unaligned_le
|
||||
#define put_unaligned __put_unaligned_le
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Cause a link-time error if we try an unaligned access other than
|
||||
* 1,2,4 or 8 bytes long
|
||||
*/
|
||||
extern int __bad_unaligned_access_size(void);
|
||||
|
||||
#define __get_unaligned_le(ptr) (typeof(*(ptr)))({ \
|
||||
sizeof(*(ptr)) == 1 ? *(ptr) : \
|
||||
(sizeof(*(ptr)) == 2 ? get_unaligned_le16((ptr)) : \
|
||||
(sizeof(*(ptr)) == 4 ? get_unaligned_le32((ptr)) : \
|
||||
(sizeof(*(ptr)) == 8 ? get_unaligned_le64((ptr)) : \
|
||||
__bad_unaligned_access_size()))); \
|
||||
})
|
||||
|
||||
#define __get_unaligned_be(ptr) (__force typeof(*(ptr)))({ \
|
||||
sizeof(*(ptr)) == 1 ? *(ptr) : \
|
||||
(sizeof(*(ptr)) == 2 ? get_unaligned_be16((ptr)) : \
|
||||
(sizeof(*(ptr)) == 4 ? get_unaligned_be32((ptr)) : \
|
||||
(sizeof(*(ptr)) == 8 ? get_unaligned_be64((ptr)) : \
|
||||
__bad_unaligned_access_size()))); \
|
||||
})
|
||||
|
||||
#define __put_unaligned_le(val, ptr) ({ \
|
||||
void *__gu_p = (ptr); \
|
||||
switch (sizeof(*(ptr))) { \
|
||||
case 1: \
|
||||
*(u8 *)__gu_p = (__force u8)(val); \
|
||||
break; \
|
||||
case 2: \
|
||||
put_unaligned_le16((__force u16)(val), __gu_p); \
|
||||
break; \
|
||||
case 4: \
|
||||
put_unaligned_le32((__force u32)(val), __gu_p); \
|
||||
break; \
|
||||
case 8: \
|
||||
put_unaligned_le64((__force u64)(val), __gu_p); \
|
||||
break; \
|
||||
default: \
|
||||
__bad_unaligned_access_size(); \
|
||||
break; \
|
||||
} \
|
||||
(void)0; })
|
||||
|
||||
#define __put_unaligned_be(val, ptr) ({ \
|
||||
void *__gu_p = (ptr); \
|
||||
switch (sizeof(*(ptr))) { \
|
||||
case 1: \
|
||||
*(u8 *)__gu_p = (__force u8)(val); \
|
||||
break; \
|
||||
case 2: \
|
||||
put_unaligned_be16((__force u16)(val), __gu_p); \
|
||||
break; \
|
||||
case 4: \
|
||||
put_unaligned_be32((__force u32)(val), __gu_p); \
|
||||
break; \
|
||||
case 8: \
|
||||
put_unaligned_be64((__force u64)(val), __gu_p); \
|
||||
break; \
|
||||
default: \
|
||||
__bad_unaligned_access_size(); \
|
||||
break; \
|
||||
} \
|
||||
(void)0; })
|
||||
|
||||
#endif /* _ASM_C6X_UNALIGNED_H */
|
Loading…
Reference in a new issue