404

[ Avaa Bypassed ]




Upload:

Command:

botdev@3.144.37.229: ~ $
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __M32R_LOCAL_H
#define __M32R_LOCAL_H

/*
 *  linux/include/asm-m32r/local.h
 *
 *  M32R version:
 *    Copyright (C) 2001, 2002  Hitoshi Yamamoto
 *    Copyright (C) 2004  Hirokazu Takata <takata at linux-m32r.org>
 *    Copyright (C) 2007  Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
 */

#include <linux/percpu.h>
#include <asm/assembler.h>
#include <asm/local.h>

/*
 * Atomic operations that C can't guarantee us.  Useful for
 * resource counting etc..
 */

/*
 * Make sure gcc doesn't try to be clever and move things around
 * on us. We need to use _exactly_ the address the user gave us,
 * not some alias that contains the same information.
 */
typedef struct { volatile int counter; } local_t;

#define LOCAL_INIT(i)	{ (i) }

/**
 * local_read - read local variable
 * @l: pointer of type local_t
 *
 * Atomically reads the value of @l.
 */
#define local_read(l)	((l)->counter)

/**
 * local_set - set local variable
 * @l: pointer of type local_t
 * @i: required value
 *
 * Atomically sets the value of @l to @i.
 */
#define local_set(l, i)	(((l)->counter) = (i))

/**
 * local_add_return - add long to local variable and return it
 * @i: long value to add
 * @l: pointer of type local_t
 *
 * Atomically adds @i to @l and return (@i + @l).
 */
static inline long local_add_return(long i, local_t *l)
{
	unsigned long flags;
	long result;

	local_irq_save(flags);
	__asm__ __volatile__ (
		"# local_add_return		\n\t"
		DCACHE_CLEAR("%0", "r4", "%1")
		"ld %0, @%1;			\n\t"
		"add	%0, %2;			\n\t"
		"st %0, @%1;			\n\t"
		: "=&r" (result)
		: "r" (&l->counter), "r" (i)
		: "memory"
#ifdef CONFIG_CHIP_M32700_TS1
		, "r4"
#endif	/* CONFIG_CHIP_M32700_TS1 */
	);
	local_irq_restore(flags);

	return result;
}

/**
 * local_sub_return - subtract long from local variable and return it
 * @i: long value to subtract
 * @l: pointer of type local_t
 *
 * Atomically subtracts @i from @l and return (@l - @i).
 */
static inline long local_sub_return(long i, local_t *l)
{
	unsigned long flags;
	long result;

	local_irq_save(flags);
	__asm__ __volatile__ (
		"# local_sub_return		\n\t"
		DCACHE_CLEAR("%0", "r4", "%1")
		"ld %0, @%1;			\n\t"
		"sub	%0, %2;			\n\t"
		"st %0, @%1;			\n\t"
		: "=&r" (result)
		: "r" (&l->counter), "r" (i)
		: "memory"
#ifdef CONFIG_CHIP_M32700_TS1
		, "r4"
#endif	/* CONFIG_CHIP_M32700_TS1 */
	);
	local_irq_restore(flags);

	return result;
}

/**
 * local_add - add long to local variable
 * @i: long value to add
 * @l: pointer of type local_t
 *
 * Atomically adds @i to @l.
 */
#define local_add(i, l) ((void) local_add_return((i), (l)))

/**
 * local_sub - subtract the local variable
 * @i: long value to subtract
 * @l: pointer of type local_t
 *
 * Atomically subtracts @i from @l.
 */
#define local_sub(i, l) ((void) local_sub_return((i), (l)))

/**
 * local_sub_and_test - subtract value from variable and test result
 * @i: integer value to subtract
 * @l: pointer of type local_t
 *
 * Atomically subtracts @i from @l and returns
 * true if the result is zero, or false for all
 * other cases.
 */
#define local_sub_and_test(i, l) (local_sub_return((i), (l)) == 0)

/**
 * local_inc_return - increment local variable and return it
 * @l: pointer of type local_t
 *
 * Atomically increments @l by 1 and returns the result.
 */
static inline long local_inc_return(local_t *l)
{
	unsigned long flags;
	long result;

	local_irq_save(flags);
	__asm__ __volatile__ (
		"# local_inc_return		\n\t"
		DCACHE_CLEAR("%0", "r4", "%1")
		"ld %0, @%1;			\n\t"
		"addi	%0, #1;			\n\t"
		"st %0, @%1;			\n\t"
		: "=&r" (result)
		: "r" (&l->counter)
		: "memory"
#ifdef CONFIG_CHIP_M32700_TS1
		, "r4"
#endif	/* CONFIG_CHIP_M32700_TS1 */
	);
	local_irq_restore(flags);

	return result;
}

/**
 * local_dec_return - decrement local variable and return it
 * @l: pointer of type local_t
 *
 * Atomically decrements @l by 1 and returns the result.
 */
static inline long local_dec_return(local_t *l)
{
	unsigned long flags;
	long result;

	local_irq_save(flags);
	__asm__ __volatile__ (
		"# local_dec_return		\n\t"
		DCACHE_CLEAR("%0", "r4", "%1")
		"ld %0, @%1;			\n\t"
		"addi	%0, #-1;		\n\t"
		"st %0, @%1;			\n\t"
		: "=&r" (result)
		: "r" (&l->counter)
		: "memory"
#ifdef CONFIG_CHIP_M32700_TS1
		, "r4"
#endif	/* CONFIG_CHIP_M32700_TS1 */
	);
	local_irq_restore(flags);

	return result;
}

/**
 * local_inc - increment local variable
 * @l: pointer of type local_t
 *
 * Atomically increments @l by 1.
 */
#define local_inc(l) ((void)local_inc_return(l))

/**
 * local_dec - decrement local variable
 * @l: pointer of type local_t
 *
 * Atomically decrements @l by 1.
 */
#define local_dec(l) ((void)local_dec_return(l))

/**
 * local_inc_and_test - increment and test
 * @l: pointer of type local_t
 *
 * Atomically increments @l by 1
 * and returns true if the result is zero, or false for all
 * other cases.
 */
#define local_inc_and_test(l) (local_inc_return(l) == 0)

/**
 * local_dec_and_test - decrement and test
 * @l: pointer of type local_t
 *
 * Atomically decrements @l by 1 and
 * returns true if the result is 0, or false for all
 * other cases.
 */
#define local_dec_and_test(l) (local_dec_return(l) == 0)

/**
 * local_add_negative - add and test if negative
 * @l: pointer of type local_t
 * @i: integer value to add
 *
 * Atomically adds @i to @l and returns true
 * if the result is negative, or false when
 * result is greater than or equal to zero.
 */
#define local_add_negative(i, l) (local_add_return((i), (l)) < 0)

#define local_cmpxchg(l, o, n) (cmpxchg_local(&((l)->counter), (o), (n)))
#define local_xchg(v, new) (xchg_local(&((l)->counter), new))

/**
 * local_add_unless - add unless the number is a given value
 * @l: pointer of type local_t
 * @a: the amount to add to l...
 * @u: ...unless l is equal to u.
 *
 * Atomically adds @a to @l, so long as it was not @u.
 * Returns non-zero if @l was not @u, and zero otherwise.
 */
static inline int local_add_unless(local_t *l, long a, long u)
{
	long c, old;
	c = local_read(l);
	for (;;) {
		if (unlikely(c == (u)))
			break;
		old = local_cmpxchg((l), c, c + (a));
		if (likely(old == c))
			break;
		c = old;
	}
	return c != (u);
}

#define local_inc_not_zero(l) local_add_unless((l), 1, 0)

static inline void local_clear_mask(unsigned long  mask, local_t *addr)
{
	unsigned long flags;
	unsigned long tmp;

	local_irq_save(flags);
	__asm__ __volatile__ (
		"# local_clear_mask		\n\t"
		DCACHE_CLEAR("%0", "r5", "%1")
		"ld %0, @%1;			\n\t"
		"and	%0, %2;			\n\t"
		"st %0, @%1;			\n\t"
		: "=&r" (tmp)
		: "r" (addr), "r" (~mask)
		: "memory"
#ifdef CONFIG_CHIP_M32700_TS1
		, "r5"
#endif	/* CONFIG_CHIP_M32700_TS1 */
	);
	local_irq_restore(flags);
}

static inline void local_set_mask(unsigned long  mask, local_t *addr)
{
	unsigned long flags;
	unsigned long tmp;

	local_irq_save(flags);
	__asm__ __volatile__ (
		"# local_set_mask		\n\t"
		DCACHE_CLEAR("%0", "r5", "%1")
		"ld %0, @%1;			\n\t"
		"or	%0, %2;			\n\t"
		"st %0, @%1;			\n\t"
		: "=&r" (tmp)
		: "r" (addr), "r" (mask)
		: "memory"
#ifdef CONFIG_CHIP_M32700_TS1
		, "r5"
#endif	/* CONFIG_CHIP_M32700_TS1 */
	);
	local_irq_restore(flags);
}

/* Atomic operations are already serializing on m32r */
#define smp_mb__before_local_dec()	barrier()
#define smp_mb__after_local_dec()	barrier()
#define smp_mb__before_local_inc()	barrier()
#define smp_mb__after_local_inc()	barrier()

/* Use these for per-cpu local_t variables: on some archs they are
 * much more efficient than these naive implementations.  Note they take
 * a variable, not an address.
 */

#define __local_inc(l)		((l)->a.counter++)
#define __local_dec(l)		((l)->a.counter++)
#define __local_add(i, l)	((l)->a.counter += (i))
#define __local_sub(i, l)	((l)->a.counter -= (i))

/* Use these for per-cpu local_t variables: on some archs they are
 * much more efficient than these naive implementations.  Note they take
 * a variable, not an address.
 */

#endif /* __M32R_LOCAL_H */

Filemanager

Name Type Size Permission Actions
m32104ut Folder 0755
m32700ut Folder 0755
mappi2 Folder 0755
mappi3 Folder 0755
opsput Folder 0755
Kbuild File 318 B 0644
addrspace.h File 1.67 KB 0644
asm-offsets.h File 35 B 0644
assembler.h File 4.2 KB 0644
atomic.h File 6.29 KB 0644
barrier.h File 506 B 0644
bitops.h File 6.23 KB 0644
bug.h File 115 B 0644
bugs.h File 410 B 0644
cache.h File 222 B 0644
cachectl.h File 739 B 0644
cacheflush.h File 3.2 KB 0644
checksum.h File 4.83 KB 0644
cmpxchg.h File 4.86 KB 0644
dcache_clear.h File 1.01 KB 0644
delay.h File 31 B 0644
device.h File 148 B 0644
div64.h File 31 B 0644
dma-mapping.h File 570 B 0644
dma.h File 281 B 0644
elf.h File 3.64 KB 0644
emergency-restart.h File 188 B 0644
fb.h File 414 B 0644
flat.h File 4.2 KB 0644
ftrace.h File 12 B 0644
futex.h File 82 B 0644
hardirq.h File 214 B 0644
hw_irq.h File 87 B 0644
io.h File 6.44 KB 0644
irq.h File 2.94 KB 0644
irq_regs.h File 34 B 0644
irqflags.h File 2.24 KB 0644
kdebug.h File 32 B 0644
kmap_types.h File 251 B 0644
linkage.h File 177 B 0644
local.h File 7.8 KB 0644
local64.h File 33 B 0644
m32102.h File 14.71 KB 0644
m32r.h File 5.7 KB 0644
m32r_mp_fpga.h File 14.89 KB 0644
mc146818rtc.h File 671 B 0644
mmu.h File 403 B 0644
mmu_context.h File 4.23 KB 0644
mmzone.h File 1.29 KB 0644
page.h File 2.62 KB 0644
pci.h File 147 B 0644
percpu.h File 165 B 0644
pgalloc.h File 1.84 KB 0644
pgtable-2level.h File 2.31 KB 0644
pgtable.h File 9.7 KB 0644
processor.h File 2.93 KB 0644
ptrace.h File 1.3 KB 0644
rtc.h File 1.99 KB 0644
s1d13806.h File 9.84 KB 0644
segment.h File 228 B 0644
serial.h File 187 B 0644
setup.h File 1022 B 0644
shmparam.h File 197 B 0644
signal.h File 561 B 0644
smp.h File 3.5 KB 0644
spinlock.h File 7.15 KB 0644
spinlock_types.h File 520 B 0644
string.h File 378 B 0644
switch_to.h File 1.48 KB 0644
syscall.h File 252 B 0644
termios.h File 1.74 KB 0644
thread_info.h File 3.71 KB 0644
timex.h File 581 B 0644
tlb.h File 483 B 0644
tlbflush.h File 2.94 KB 0644
topology.h File 167 B 0644
types.h File 258 B 0644
uaccess.h File 15.3 KB 0644
ucontext.h File 321 B 0644
unaligned.h File 592 B 0644
unistd.h File 1.23 KB 0644
user.h File 2.1 KB 0644
vga.h File 436 B 0644
xor.h File 148 B 0644