lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <147e72c9-8177-9c03-8baf-df7362143cd6@loongson.cn>
Date: Sat, 14 Sep 2024 16:56:40 +0800
From: maobibo <maobibo@...ngson.cn>
To: Jiaxun Yang <jiaxun.yang@...goat.com>, Huacai Chen
 <chenhuacai@...nel.org>, WANG Xuerui <kernel@...0n.name>,
 "Rafael J. Wysocki" <rafael@...nel.org>,
 Viresh Kumar <viresh.kumar@...aro.org>, Thomas Gleixner
 <tglx@...utronix.de>, Thomas Bogendoerfer <tsbogend@...ha.franken.de>
Cc: loongarch@...ts.linux.dev, linux-kernel@...r.kernel.org,
 linux-pm@...r.kernel.org, linux-mips@...r.kernel.org, kvm@...r.kernel.org
Subject: Re: [PATCH v3 3/4] LoongArch: Extract IOCSR definitions to standalone
 header

Hi jiaxun,

On 2024/9/14 上午4:32, Jiaxun Yang wrote:
> As IOCSR is not a part of architecture specification, it is not
> really appropriate to define those stuff in loongarch.h.
IOCSR address is somewhat strange compared with generic mmio bus,
neither fdt nor acpi does not support IOCSR address space. I do not know 
the future about IOCSR, since I do not know the advantage of it compared 
to MMIO address space, except it can only  be accessed in supervisor mode.

Sharing the same code with multiple architecture is welcome.
> 
> Extract those definitions to include/linux/loongson/iocsr.h, so
> that they can be shared with MIPS based Loongson systems as well.
> 
> Signed-off-by: Jiaxun Yang <jiaxun.yang@...goat.com>
> ---
>   MAINTAINERS                             |   1 +
>   arch/loongarch/include/asm/loongarch.h  |  90 --------------------------
>   arch/loongarch/kernel/cpu-probe.c       |   7 +-
>   arch/loongarch/kernel/relocate_kernel.S |   5 +-
>   arch/loongarch/kernel/smp.c             |  23 +++----
>   drivers/cpufreq/loongson3_cpufreq.c     |  11 ++--
>   drivers/irqchip/irq-loongarch-avec.c    |   5 +-
>   drivers/irqchip/irq-loongson-eiointc.c  |   5 +-
>   include/linux/loongson/iocsr.h          | 110 ++++++++++++++++++++++++++++++++
>   9 files changed, 142 insertions(+), 115 deletions(-)
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 0a3d9e17295a..f0f4c427e9a3 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -13305,6 +13305,7 @@ F:	Documentation/translations/zh_CN/arch/loongarch/
>   F:	arch/loongarch/
>   F:	drivers/*/*loongarch*
>   F:	drivers/cpufreq/loongson3_cpufreq.c
> +F:	include/linux/loongson
>   
>   LOONGSON GPIO DRIVER
>   M:	Yinbo Zhu <zhuyinbo@...ngson.cn>
> diff --git a/arch/loongarch/include/asm/loongarch.h b/arch/loongarch/include/asm/loongarch.h
> index 23af28f00c3c..4ac228230720 100644
> --- a/arch/loongarch/include/asm/loongarch.h
> +++ b/arch/loongarch/include/asm/loongarch.h
> @@ -1048,84 +1048,6 @@
>   
>   #define ESTATF_IP		0x00003fff
>   
> -#define LOONGARCH_IOCSR_FEATURES	0x8
> -#define  IOCSRF_TEMP			BIT_ULL(0)
> -#define  IOCSRF_NODECNT			BIT_ULL(1)
> -#define  IOCSRF_MSI			BIT_ULL(2)
> -#define  IOCSRF_EXTIOI			BIT_ULL(3)
> -#define  IOCSRF_CSRIPI			BIT_ULL(4)
> -#define  IOCSRF_FREQCSR			BIT_ULL(5)
> -#define  IOCSRF_FREQSCALE		BIT_ULL(6)
> -#define  IOCSRF_DVFSV1			BIT_ULL(7)
> -#define  IOCSRF_EIODECODE		BIT_ULL(9)
> -#define  IOCSRF_FLATMODE		BIT_ULL(10)
> -#define  IOCSRF_VM			BIT_ULL(11)
> -#define  IOCSRF_AVEC			BIT_ULL(15)
> -
> -#define LOONGARCH_IOCSR_VENDOR		0x10
> -
> -#define LOONGARCH_IOCSR_CPUNAME		0x20
> -
> -#define LOONGARCH_IOCSR_NODECNT		0x408
> -
> -#define LOONGARCH_IOCSR_MISC_FUNC	0x420
> -#define  IOCSR_MISC_FUNC_SOFT_INT	BIT_ULL(10)
> -#define  IOCSR_MISC_FUNC_TIMER_RESET	BIT_ULL(21)
> -#define  IOCSR_MISC_FUNC_EXT_IOI_EN	BIT_ULL(48)
> -#define  IOCSR_MISC_FUNC_AVEC_EN	BIT_ULL(51)
> -
> -#define LOONGARCH_IOCSR_CPUTEMP		0x428
> -
> -#define LOONGARCH_IOCSR_SMCMBX		0x51c
> -
> -/* PerCore CSR, only accessible by local cores */
> -#define LOONGARCH_IOCSR_IPI_STATUS	0x1000
> -#define LOONGARCH_IOCSR_IPI_EN		0x1004
> -#define LOONGARCH_IOCSR_IPI_SET		0x1008
> -#define LOONGARCH_IOCSR_IPI_CLEAR	0x100c
> -#define LOONGARCH_IOCSR_MBUF0		0x1020
> -#define LOONGARCH_IOCSR_MBUF1		0x1028
> -#define LOONGARCH_IOCSR_MBUF2		0x1030
> -#define LOONGARCH_IOCSR_MBUF3		0x1038
> -
> -#define LOONGARCH_IOCSR_IPI_SEND	0x1040
> -#define  IOCSR_IPI_SEND_IP_SHIFT	0
> -#define  IOCSR_IPI_SEND_CPU_SHIFT	16
> -#define  IOCSR_IPI_SEND_BLOCKING	BIT(31)
> -
> -#define LOONGARCH_IOCSR_MBUF_SEND	0x1048
> -#define  IOCSR_MBUF_SEND_BLOCKING	BIT_ULL(31)
> -#define  IOCSR_MBUF_SEND_BOX_SHIFT	2
> -#define  IOCSR_MBUF_SEND_BOX_LO(box)	(box << 1)
> -#define  IOCSR_MBUF_SEND_BOX_HI(box)	((box << 1) + 1)
> -#define  IOCSR_MBUF_SEND_CPU_SHIFT	16
> -#define  IOCSR_MBUF_SEND_BUF_SHIFT	32
> -#define  IOCSR_MBUF_SEND_H32_MASK	0xFFFFFFFF00000000ULL
> -
> -#define LOONGARCH_IOCSR_ANY_SEND	0x1158
> -#define  IOCSR_ANY_SEND_BLOCKING	BIT_ULL(31)
> -#define  IOCSR_ANY_SEND_CPU_SHIFT	16
> -#define  IOCSR_ANY_SEND_MASK_SHIFT	27
> -#define  IOCSR_ANY_SEND_BUF_SHIFT	32
> -#define  IOCSR_ANY_SEND_H32_MASK	0xFFFFFFFF00000000ULL
> -
> -/* Register offset and bit definition for CSR access */
> -#define LOONGARCH_IOCSR_TIMER_CFG       0x1060
> -#define LOONGARCH_IOCSR_TIMER_TICK      0x1070
> -#define  IOCSR_TIMER_CFG_RESERVED       (_ULCAST_(1) << 63)
> -#define  IOCSR_TIMER_CFG_PERIODIC       (_ULCAST_(1) << 62)
> -#define  IOCSR_TIMER_CFG_EN             (_ULCAST_(1) << 61)
> -#define  IOCSR_TIMER_MASK		0x0ffffffffffffULL
> -#define  IOCSR_TIMER_INITVAL_RST        (_ULCAST_(0xffff) << 48)
> -
> -#define LOONGARCH_IOCSR_EXTIOI_NODEMAP_BASE	0x14a0
> -#define LOONGARCH_IOCSR_EXTIOI_IPMAP_BASE	0x14c0
> -#define LOONGARCH_IOCSR_EXTIOI_EN_BASE		0x1600
> -#define LOONGARCH_IOCSR_EXTIOI_BOUNCE_BASE	0x1680
> -#define LOONGARCH_IOCSR_EXTIOI_ISR_BASE		0x1800
> -#define LOONGARCH_IOCSR_EXTIOI_ROUTE_BASE	0x1c00
> -#define IOCSR_EXTIOI_VECTOR_NUM			256
> -
>   #ifndef __ASSEMBLY__
>   
>   static __always_inline u64 drdtime(void)
> @@ -1145,18 +1067,6 @@ static inline unsigned int get_csr_cpuid(void)
>   	return csr_read32(LOONGARCH_CSR_CPUID);
>   }
>   
> -static inline void csr_any_send(unsigned int addr, unsigned int data,
> -				unsigned int data_mask, unsigned int cpu)
> -{
> -	uint64_t val = 0;
> -
> -	val = IOCSR_ANY_SEND_BLOCKING | addr;
> -	val |= (cpu << IOCSR_ANY_SEND_CPU_SHIFT);
> -	val |= (data_mask << IOCSR_ANY_SEND_MASK_SHIFT);
> -	val |= ((uint64_t)data << IOCSR_ANY_SEND_BUF_SHIFT);
> -	iocsr_write64(val, LOONGARCH_IOCSR_ANY_SEND);
> -}
> -
>   static inline unsigned int read_csr_excode(void)
>   {
>   	return (csr_read32(LOONGARCH_CSR_ESTAT) & CSR_ESTAT_EXC) >> CSR_ESTAT_EXC_SHIFT;
> diff --git a/arch/loongarch/kernel/cpu-probe.c b/arch/loongarch/kernel/cpu-probe.c
> index 8a868a10df9c..07b68f93ccdc 100644
> --- a/arch/loongarch/kernel/cpu-probe.c
> +++ b/arch/loongarch/kernel/cpu-probe.c
> @@ -6,6 +6,7 @@
>    */
>   #include <linux/init.h>
>   #include <linux/kernel.h>
> +#include <linux/loongson/iocsr.h>
>   #include <linux/ptrace.h>
>   #include <linux/smp.h>
>   #include <linux/stddef.h>
> @@ -267,13 +268,13 @@ static inline void cpu_probe_loongson(struct cpuinfo_loongarch *c, unsigned int
>   	if (!(c->options & LOONGARCH_CPU_IOCSR))
>   		return;
>   
> -	*vendor = iocsr_read64(LOONGARCH_IOCSR_VENDOR);
> -	*cpuname = iocsr_read64(LOONGARCH_IOCSR_CPUNAME);
> +	*vendor = iocsr_read64(LOONGSON_IOCSR_VENDOR);
> +	*cpuname = iocsr_read64(LOONGSON_IOCSR_CPUNAME);
>   
>   	if (!__cpu_full_name[cpu])
>   		__cpu_full_name[cpu] = cpu_full_name;
>   
> -	config = iocsr_read32(LOONGARCH_IOCSR_FEATURES);
> +	config = iocsr_read32(LOONGSON_IOCSR_FEATURES);
>   	if (config & IOCSRF_CSRIPI)
>   		c->options |= LOONGARCH_CPU_CSRIPI;
>   	if (config & IOCSRF_EXTIOI)
> diff --git a/arch/loongarch/kernel/relocate_kernel.S b/arch/loongarch/kernel/relocate_kernel.S
> index 84e6de2fd973..ce40ba6b5975 100644
> --- a/arch/loongarch/kernel/relocate_kernel.S
> +++ b/arch/loongarch/kernel/relocate_kernel.S
> @@ -5,6 +5,7 @@
>    * Copyright (C) 2022 Loongson Technology Corporation Limited
>    */
>   
> +#include <linux/loongson/iocsr.h>
>   #include <linux/kexec.h>
>   
>   #include <asm/asm.h>
> @@ -88,14 +89,14 @@ SYM_CODE_END(relocate_new_kernel)
>   #ifdef CONFIG_SMP
>   /*
>    * Other CPUs should wait until code is relocated and
> - * then start at the entry point from LOONGARCH_IOCSR_MBUF0.
> + * then start at the entry point from LOONGSON_IOCSR_MBUF0.
>    */
>   SYM_CODE_START(kexec_smp_wait)
>   	UNWIND_HINT_UNDEFINED
>   1:	li.w		t0, 0x100			/* wait for init loop */
>   2:	addi.w		t0, t0, -1			/* limit mailbox access */
>   	bnez		t0, 2b
> -	li.w		t1, LOONGARCH_IOCSR_MBUF0
> +	li.w		t1, LOONGSON_IOCSR_MBUF0
>   	iocsrrd.w	s0, t1				/* check PC as an indicator */
>   	beqz		s0, 1b
>   	iocsrrd.d	s0, t1				/* get PC via mailbox */
> diff --git a/arch/loongarch/kernel/smp.c b/arch/loongarch/kernel/smp.c
> index 4adbbef3450a..120865985376 100644
> --- a/arch/loongarch/kernel/smp.c
> +++ b/arch/loongarch/kernel/smp.c
> @@ -14,6 +14,7 @@
>   #include <linux/init.h>
>   #include <linux/interrupt.h>
>   #include <linux/irq_work.h>
> +#include <linux/loongson/iocsr.h>
>   #include <linux/profile.h>
>   #include <linux/seq_file.h>
>   #include <linux/smp.h>
> @@ -164,14 +165,14 @@ static void csr_mail_send(uint64_t data, int cpu, int mailbox)
>   	val |= (IOCSR_MBUF_SEND_BOX_HI(mailbox) << IOCSR_MBUF_SEND_BOX_SHIFT);
>   	val |= (cpu << IOCSR_MBUF_SEND_CPU_SHIFT);
>   	val |= (data & IOCSR_MBUF_SEND_H32_MASK);
> -	iocsr_write64(val, LOONGARCH_IOCSR_MBUF_SEND);
> +	iocsr_write64(val, LOONGSON_IOCSR_MBUF_SEND);
>   
>   	/* Send low 32 bits */
>   	val = IOCSR_MBUF_SEND_BLOCKING;
>   	val |= (IOCSR_MBUF_SEND_BOX_LO(mailbox) << IOCSR_MBUF_SEND_BOX_SHIFT);
>   	val |= (cpu << IOCSR_MBUF_SEND_CPU_SHIFT);
>   	val |= (data << IOCSR_MBUF_SEND_BUF_SHIFT);
> -	iocsr_write64(val, LOONGARCH_IOCSR_MBUF_SEND);
> +	iocsr_write64(val, LOONGSON_IOCSR_MBUF_SEND);
>   };
>   
>   static u32 ipi_read_clear(int cpu)
> @@ -179,9 +180,9 @@ static u32 ipi_read_clear(int cpu)
>   	u32 action;
>   
>   	/* Load the ipi register to figure out what we're supposed to do */
> -	action = iocsr_read32(LOONGARCH_IOCSR_IPI_STATUS);
> +	action = iocsr_read32(LOONGSON_IOCSR_IPI_STATUS);
>   	/* Clear the ipi register to clear the interrupt */
> -	iocsr_write32(action, LOONGARCH_IOCSR_IPI_CLEAR);
> +	iocsr_write32(action, LOONGSON_IOCSR_IPI_CLEAR);
>   	wbflush();
>   
>   	return action;
> @@ -193,7 +194,7 @@ static void ipi_write_action(int cpu, u32 action)
>   
>   	val = IOCSR_IPI_SEND_BLOCKING | action;
>   	val |= (cpu << IOCSR_IPI_SEND_CPU_SHIFT);
> -	iocsr_write32(val, LOONGARCH_IOCSR_IPI_SEND);
> +	iocsr_write32(val, LOONGSON_IOCSR_IPI_SEND);
>   }
>   
>   static void loongson_send_ipi_single(int cpu, unsigned int action)
> @@ -322,7 +323,7 @@ void __init loongson_smp_setup(void)
>   	cpu_data[0].package = cpu_logical_map(0) / loongson_sysconf.cores_per_package;
>   
>   	pv_ipi_init();
> -	iocsr_write32(0xffffffff, LOONGARCH_IOCSR_IPI_EN);
> +	iocsr_write32(0xffffffff, LOONGSON_IOCSR_IPI_EN);
>   	pr_info("Detected %i available CPU(s)\n", loongson_sysconf.nr_cpus);
>   }
>   
> @@ -370,7 +371,7 @@ void loongson_init_secondary(void)
>   
>   	change_csr_ecfg(ECFG0_IM, imask);
>   
> -	iocsr_write32(0xffffffff, LOONGARCH_IOCSR_IPI_EN);
> +	iocsr_write32(0xffffffff, LOONGSON_IOCSR_IPI_EN);
>   
>   #ifdef CONFIG_NUMA
>   	numa_add_cpu(cpu);
> @@ -385,7 +386,7 @@ void loongson_init_secondary(void)
>   void loongson_smp_finish(void)
>   {
>   	local_irq_enable();
> -	iocsr_write64(0, LOONGARCH_IOCSR_MBUF0);
> +	iocsr_write64(0, LOONGSON_IOCSR_MBUF0);
>   	pr_info("CPU#%d finished\n", smp_processor_id());
>   }
>   
> @@ -435,12 +436,12 @@ void __noreturn arch_cpu_idle_dead(void)
>   	__smp_mb();
>   	do {
>   		__asm__ __volatile__("idle 0\n\t");
> -		addr = iocsr_read64(LOONGARCH_IOCSR_MBUF0);
> +		addr = iocsr_read64(LOONGSON_IOCSR_MBUF0);
>   	} while (addr == 0);
>   
>   	local_irq_disable();
>   	init_fn = (void *)TO_CACHE(addr);
> -	iocsr_write32(0xffffffff, LOONGARCH_IOCSR_IPI_CLEAR);
> +	iocsr_write32(0xffffffff, LOONGSON_IOCSR_IPI_CLEAR);
>   
>   	init_fn();
>   	BUG();
> @@ -460,7 +461,7 @@ static int loongson_ipi_suspend(void)
>   
>   static void loongson_ipi_resume(void)
>   {
> -	iocsr_write32(0xffffffff, LOONGARCH_IOCSR_IPI_EN);
> +	iocsr_write32(0xffffffff, LOONGSON_IOCSR_IPI_EN);
>   }
>   
>   static struct syscore_ops loongson_ipi_syscore_ops = {
> diff --git a/drivers/cpufreq/loongson3_cpufreq.c b/drivers/cpufreq/loongson3_cpufreq.c
> index 6b5e6798d9a2..11d5f1ba3040 100644
> --- a/drivers/cpufreq/loongson3_cpufreq.c
> +++ b/drivers/cpufreq/loongson3_cpufreq.c
> @@ -10,6 +10,7 @@
>   #include <linux/cpufreq.h>
>   #include <linux/delay.h>
>   #include <linux/module.h>
> +#include <linux/loongson/iocsr.h>
>   #include <linux/platform_device.h>
>   #include <linux/units.h>
>   
> @@ -182,7 +183,7 @@ static inline int do_service_request(u32 id, u32 info, u32 cmd, u32 val, u32 ext
>   
>   	mutex_lock(&cpufreq_mutex[package]);
>   
> -	last.value = iocsr_read32(LOONGARCH_IOCSR_SMCMBX);
> +	last.value = iocsr_read32(LOONGSON_IOCSR_SMCMBX);
>   	if (!last.complete) {
>   		mutex_unlock(&cpufreq_mutex[package]);
>   		return -EPERM;
> @@ -195,12 +196,12 @@ static inline int do_service_request(u32 id, u32 info, u32 cmd, u32 val, u32 ext
>   	msg.extra	= extra;
>   	msg.complete	= 0;
>   
> -	iocsr_write32(msg.value, LOONGARCH_IOCSR_SMCMBX);
> -	iocsr_write32(iocsr_read32(LOONGARCH_IOCSR_MISC_FUNC) | IOCSR_MISC_FUNC_SOFT_INT,
> -		      LOONGARCH_IOCSR_MISC_FUNC);
> +	iocsr_write32(msg.value, LOONGSON_IOCSR_SMCMBX);
> +	iocsr_write32(iocsr_read32(LOONGSON_IOCSR_MISC_FUNC) | IOCSR_MISC_FUNC_SOFT_INT,
> +		      LOONGSON_IOCSR_MISC_FUNC);
>   
>   	for (retries = 0; retries < 10000; retries++) {
> -		msg.value = iocsr_read32(LOONGARCH_IOCSR_SMCMBX);
> +		msg.value = iocsr_read32(LOONGSON_IOCSR_SMCMBX);
>   		if (msg.complete)
>   			break;
>   
> diff --git a/drivers/irqchip/irq-loongarch-avec.c b/drivers/irqchip/irq-loongarch-avec.c
> index 0f6e465dd309..2452c6cc0aa1 100644
> --- a/drivers/irqchip/irq-loongarch-avec.c
> +++ b/drivers/irqchip/irq-loongarch-avec.c
> @@ -10,6 +10,7 @@
>   #include <linux/irqchip.h>
>   #include <linux/irqchip/chained_irq.h>
>   #include <linux/irqdomain.h>
> +#include <linux/loongson/iocsr.h>
>   #include <linux/kernel.h>
>   #include <linux/msi.h>
>   #include <linux/radix-tree.h>
> @@ -378,9 +379,9 @@ static int __init avecintc_init(struct irq_domain *parent)
>   				  "irqchip/loongarch/avecintc:starting",
>   				  avecintc_cpu_online, avecintc_cpu_offline);
>   #endif
> -	value = iocsr_read64(LOONGARCH_IOCSR_MISC_FUNC);
> +	value = iocsr_read64(LOONGSON_IOCSR_MISC_FUNC);
>   	value |= IOCSR_MISC_FUNC_AVEC_EN;
> -	iocsr_write64(value, LOONGARCH_IOCSR_MISC_FUNC);
> +	iocsr_write64(value, LOONGSON_IOCSR_MISC_FUNC);
>   
>   	return ret;
>   
> diff --git a/drivers/irqchip/irq-loongson-eiointc.c b/drivers/irqchip/irq-loongson-eiointc.c
> index e24db71a8783..6e81bf27914f 100644
> --- a/drivers/irqchip/irq-loongson-eiointc.c
> +++ b/drivers/irqchip/irq-loongson-eiointc.c
> @@ -13,6 +13,7 @@
>   #include <linux/irqchip.h>
>   #include <linux/irqdomain.h>
>   #include <linux/irqchip/chained_irq.h>
> +#include <linux/loongson/iocsr.h>
>   #include <linux/kernel.h>
>   #include <linux/syscore_ops.h>
>   #include <asm/numa.h>
> @@ -52,9 +53,9 @@ static void eiointc_enable(void)
>   {
>   	uint64_t misc;
>   
> -	misc = iocsr_read64(LOONGARCH_IOCSR_MISC_FUNC);
> +	misc = iocsr_read64(LOONGSON_IOCSR_MISC_FUNC);
>   	misc |= IOCSR_MISC_FUNC_EXT_IOI_EN;
> -	iocsr_write64(misc, LOONGARCH_IOCSR_MISC_FUNC);
> +	iocsr_write64(misc, LOONGSON_IOCSR_MISC_FUNC);
>   }
>   
>   static int cpu_to_eio_node(int cpu)
> diff --git a/include/linux/loongson/iocsr.h b/include/linux/loongson/iocsr.h
> new file mode 100644
> index 000000000000..6654a904bcbe
> --- /dev/null
> +++ b/include/linux/loongson/iocsr.h
> @@ -0,0 +1,110 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
> + * Copyright (C) 2024, Jiaxun Yang <jiaxun.yang@...goat.com>
> + */
> +
> +#ifndef _LOONGSON_IOCSR_H
> +#define _LOONGSON_IOCSR_H
> +
> +#include <linux/bits.h>
> +#include <linux/types.h>
> +
> +#ifdef CONFIG_LOONGARCH
> +#include <asm/loongarch.h>
> +#endif
> +
> +#define LOONGSON_IOCSR_FEATURES	0x8
> +#define  IOCSRF_TEMP			BIT_ULL(0)
> +#define  IOCSRF_NODECNT			BIT_ULL(1)
> +#define  IOCSRF_MSI			BIT_ULL(2)
> +#define  IOCSRF_EXTIOI			BIT_ULL(3)
> +#define  IOCSRF_CSRIPI			BIT_ULL(4)
> +#define  IOCSRF_FREQCSR			BIT_ULL(5)
> +#define  IOCSRF_FREQSCALE		BIT_ULL(6)
> +#define  IOCSRF_DVFSV1			BIT_ULL(7)
> +#define  IOCSRF_EIODECODE		BIT_ULL(9)
> +#define  IOCSRF_FLATMODE		BIT_ULL(10)
> +#define  IOCSRF_VM			BIT_ULL(11)
> +#define  IOCSRF_AVEC			BIT_ULL(15)
Is these definiton the same between Loongson3 mips and LoongArch machine 
such as IOCSRF_FLATMODE/IOCSRF_AVEC?

> +
> +#define LOONGSON_IOCSR_VENDOR		0x10
> +
> +#define LOONGSON_IOCSR_CPUNAME		0x20
> +
> +#define LOONGSON_IOCSR_NODECNT		0x408
> +
> +#define LOONGSON_IOCSR_MISC_FUNC	0x420
> +#define  IOCSR_MISC_FUNC_SOFT_INT	BIT_ULL(10)
> +#define  IOCSR_MISC_FUNC_TIMER_RESET	BIT_ULL(21)
> +#define  IOCSR_MISC_FUNC_EXT_IOI_EN	BIT_ULL(48)
> +#define  IOCSR_MISC_FUNC_AVEC_EN	BIT_ULL(51)
> +
> +#define LOONGSON_IOCSR_CPUTEMP		0x428
> +
> +#define LOONGSON_IOCSR_SMCMBX		0x51c
> +
> +/* PerCore CSR, only accessible by local cores */
> +#define LOONGSON_IOCSR_IPI_STATUS	0x1000
> +#define LOONGSON_IOCSR_IPI_EN		0x1004
> +#define LOONGSON_IOCSR_IPI_SET		0x1008
> +#define LOONGSON_IOCSR_IPI_CLEAR	0x100c
> +#define LOONGSON_IOCSR_MBUF0		0x1020
> +#define LOONGSON_IOCSR_MBUF1		0x1028
> +#define LOONGSON_IOCSR_MBUF2		0x1030
> +#define LOONGSON_IOCSR_MBUF3		0x1038
It seems that it is only used with arch/loongarch/kernel/smp.c,
and file smp.c is arch specific. No generic driver uses this.

> +
> +#define LOONGSON_IOCSR_IPI_SEND	0x1040
> +#define  IOCSR_IPI_SEND_IP_SHIFT	0
> +#define  IOCSR_IPI_SEND_CPU_SHIFT	16
> +#define  IOCSR_IPI_SEND_BLOCKING	BIT(31)
> +
> +#define LOONGSON_IOCSR_MBUF_SEND	0x1048
> +#define  IOCSR_MBUF_SEND_BLOCKING	BIT_ULL(31)
> +#define  IOCSR_MBUF_SEND_BOX_SHIFT	2
> +#define  IOCSR_MBUF_SEND_BOX_LO(box)	(box << 1)
> +#define  IOCSR_MBUF_SEND_BOX_HI(box)	((box << 1) + 1)
> +#define  IOCSR_MBUF_SEND_CPU_SHIFT	16
> +#define  IOCSR_MBUF_SEND_BUF_SHIFT	32
> +#define  IOCSR_MBUF_SEND_H32_MASK	0xFFFFFFFF00000000ULL
> +
> +#define LOONGSON_IOCSR_ANY_SEND	0x1158
> +#define  IOCSR_ANY_SEND_BLOCKING	BIT_ULL(31)
> +#define  IOCSR_ANY_SEND_CPU_SHIFT	16
> +#define  IOCSR_ANY_SEND_MASK_SHIFT	27
> +#define  IOCSR_ANY_SEND_BUF_SHIFT	32
> +#define  IOCSR_ANY_SEND_H32_MASK	0xFFFFFFFF00000000ULL
> +
> +/* Register offset and bit definition for CSR access */
> +#define LOONGSON_IOCSR_TIMER_CFG       0x1060
> +#define LOONGSON_IOCSR_TIMER_TICK      0x1070
> +#define  IOCSR_TIMER_CFG_RESERVED       (_ULCAST_(1) << 63)
> +#define  IOCSR_TIMER_CFG_PERIODIC       (_ULCAST_(1) << 62)
> +#define  IOCSR_TIMER_CFG_EN             (_ULCAST_(1) << 61)
> +#define  IOCSR_TIMER_MASK		0x0ffffffffffffULL
> +#define  IOCSR_TIMER_INITVAL_RST        (_ULCAST_(0xffff) << 48)
I do not find any use about IOCSR_TIMER macro, which does ip driver use 
this?

> +
> +#define LOONGSON_IOCSR_EXTIOI_NODEMAP_BASE	0x14a0
> +#define LOONGSON_IOCSR_EXTIOI_IPMAP_BASE	0x14c0
> +#define LOONGSON_IOCSR_EXTIOI_EN_BASE		0x1600
> +#define LOONGSON_IOCSR_EXTIOI_BOUNCE_BASE	0x1680
> +#define LOONGSON_IOCSR_EXTIOI_ISR_BASE		0x1800
> +#define LOONGSON_IOCSR_EXTIOI_ROUTE_BASE	0x1c00
> +#define IOCSR_EXTIOI_VECTOR_NUM			256
Is it better to define these macro in common header file or in extioi 
driver?  It seems that only extioi use it.

Regards
Bibo Mao

> +
> +#ifndef __ASSEMBLY__
> +static inline void csr_any_send(unsigned int addr, unsigned int data,
> +				unsigned int data_mask, unsigned int cpu)
> +{
> +	uint64_t val = 0;
> +
> +	val = IOCSR_ANY_SEND_BLOCKING | addr;
> +	val |= (cpu << IOCSR_ANY_SEND_CPU_SHIFT);
> +	val |= (data_mask << IOCSR_ANY_SEND_MASK_SHIFT);
> +	val |= ((uint64_t)data << IOCSR_ANY_SEND_BUF_SHIFT);
> +	iocsr_write64(val, LOONGSON_IOCSR_ANY_SEND);
> +}
> +#endif
> +
> +#endif
> +
> 


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ