linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] MIPS: Loongson64: Add Loongson-2K1000 reset support
@ 2021-04-14  1:26 Qing Zhang
  2021-04-14 12:17 ` Jiaxun Yang
  0 siblings, 1 reply; 3+ messages in thread
From: Qing Zhang @ 2021-04-14  1:26 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Jiaxun Yang, Huacai Chen; +Cc: linux-mips, linux-kernel

Add power management register operations to support reboot and poweroff.

Signed-off-by: Qing Zhang <zhangqing@loongson.cn>
---
 .../include/asm/mach-loongson64/loongson.h    |  8 ++++++
 arch/mips/loongson64/reset.c                  | 28 ++++++++++++++++---
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/arch/mips/include/asm/mach-loongson64/loongson.h b/arch/mips/include/asm/mach-loongson64/loongson.h
index f7c3ab6d724e..9d254a7b438a 100644
--- a/arch/mips/include/asm/mach-loongson64/loongson.h
+++ b/arch/mips/include/asm/mach-loongson64/loongson.h
@@ -263,4 +263,12 @@ extern u64 loongson_freqctrl[MAX_PACKAGES];
 #define LOONGSON_PCIMAP_WIN(WIN, ADDR)	\
 	((((ADDR)>>26) & LOONGSON_PCIMAP_PCIMAP_LO0) << ((WIN)*6))
 
+/* Loongson-2K1000 Power management related registers */
+#define	PM1_STS         0x0C /* Power Management1 Status Register */
+#define	PM1_CNT         0x14 /* Power Management 1 Control Register */
+#define	RST_CNT         0x30 /* Reset Control Register */
+#define	SLP_TYP		GENMASK(12, 10) /* Sleep Enable */
+#define	SLP_EN          BIT(13) /* Soft Off */
+#define	ACPI_OFF        0x7000
+
 #endif /* __ASM_MACH_LOONGSON64_LOONGSON_H */
diff --git a/arch/mips/loongson64/reset.c b/arch/mips/loongson64/reset.c
index 3bb8a1ed9348..b4348bf50538 100644
--- a/arch/mips/loongson64/reset.c
+++ b/arch/mips/loongson64/reset.c
@@ -18,9 +18,16 @@
 static void loongson_restart(char *command)
 {
 
-	void (*fw_restart)(void) = (void *)loongson_sysconf.restart_addr;
+	if ((read_c0_prid() & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64R) {
+		unsigned long base;
 
-	fw_restart();
+		base = CKSEG1ADDR(LOONGSON_REG_BASE) + ACPI_OFF;
+		writel(1, (void *)(base + RST_CNT));
+	} else {
+		void (*fw_restart)(void) = (void *)loongson_sysconf.restart_addr;
+
+		fw_restart();
+	}
 	while (1) {
 		if (cpu_wait)
 			cpu_wait();
@@ -29,9 +36,22 @@ static void loongson_restart(char *command)
 
 static void loongson_poweroff(void)
 {
-	void (*fw_poweroff)(void) = (void *)loongson_sysconf.poweroff_addr;
 
-	fw_poweroff();
+	if ((read_c0_prid() & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64R) {
+		unsigned long base;
+		unsigned int acpi_ctrl;
+
+		base = CKSEG1ADDR(LOONGSON_REG_BASE) + ACPI_OFF;
+		acpi_ctrl = readl((void *)(base + PM1_STS));
+		acpi_ctrl &= 0xffffffff;
+		writel(acpi_ctrl, (void *)(base + PM1_STS));
+		acpi_ctrl = SLP_EN | SLP_TYP;
+		writel(acpi_ctrl, (void *)(base + PM1_CNT));
+	} else {
+		void (*fw_poweroff)(void) = (void *)loongson_sysconf.poweroff_addr;
+
+		fw_poweroff();
+	}
 	while (1) {
 		if (cpu_wait)
 			cpu_wait();
-- 
2.31.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] MIPS: Loongson64: Add Loongson-2K1000 reset support
  2021-04-14  1:26 [PATCH] MIPS: Loongson64: Add Loongson-2K1000 reset support Qing Zhang
@ 2021-04-14 12:17 ` Jiaxun Yang
  2021-04-15  1:14   ` zhangqing
  0 siblings, 1 reply; 3+ messages in thread
From: Jiaxun Yang @ 2021-04-14 12:17 UTC (permalink / raw)
  To: Qing Zhang, Thomas Bogendoerfer, Huacai Chen; +Cc: linux-mips, linux-kernel



On Wed, Apr 14, 2021, at 9:26 AM, Qing Zhang wrote:
> Add power management register operations to support reboot and poweroff.
> 
> Signed-off-by: Qing Zhang <zhangqing@loongson.cn>

No that's not what we intended to do.
Please add a devicetree node for pm block.

Thanks



> ---
>  .../include/asm/mach-loongson64/loongson.h    |  8 ++++++
>  arch/mips/loongson64/reset.c                  | 28 ++++++++++++++++---
>  2 files changed, 32 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/mips/include/asm/mach-loongson64/loongson.h 
> b/arch/mips/include/asm/mach-loongson64/loongson.h
> index f7c3ab6d724e..9d254a7b438a 100644
> --- a/arch/mips/include/asm/mach-loongson64/loongson.h
> +++ b/arch/mips/include/asm/mach-loongson64/loongson.h
> @@ -263,4 +263,12 @@ extern u64 loongson_freqctrl[MAX_PACKAGES];
>  #define LOONGSON_PCIMAP_WIN(WIN, ADDR)	\
>  	((((ADDR)>>26) & LOONGSON_PCIMAP_PCIMAP_LO0) << ((WIN)*6))
>  
> +/* Loongson-2K1000 Power management related registers */
> +#define	PM1_STS         0x0C /* Power Management1 Status Register */
> +#define	PM1_CNT         0x14 /* Power Management 1 Control Register */
> +#define	RST_CNT         0x30 /* Reset Control Register */
> +#define	SLP_TYP		GENMASK(12, 10) /* Sleep Enable */
> +#define	SLP_EN          BIT(13) /* Soft Off */
> +#define	ACPI_OFF        0x7000
> +
>  #endif /* __ASM_MACH_LOONGSON64_LOONGSON_H */
> diff --git a/arch/mips/loongson64/reset.c b/arch/mips/loongson64/reset.c
> index 3bb8a1ed9348..b4348bf50538 100644
> --- a/arch/mips/loongson64/reset.c
> +++ b/arch/mips/loongson64/reset.c
> @@ -18,9 +18,16 @@
>  static void loongson_restart(char *command)
>  {
>  
> -	void (*fw_restart)(void) = (void *)loongson_sysconf.restart_addr;
> +	if ((read_c0_prid() & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64R) {
> +		unsigned long base;
>  
> -	fw_restart();
> +		base = CKSEG1ADDR(LOONGSON_REG_BASE) + ACPI_OFF;
> +		writel(1, (void *)(base + RST_CNT));
> +	} else {
> +		void (*fw_restart)(void) = (void *)loongson_sysconf.restart_addr;
> +
> +		fw_restart();
> +	}
>  	while (1) {
>  		if (cpu_wait)
>  			cpu_wait();
> @@ -29,9 +36,22 @@ static void loongson_restart(char *command)
>  
>  static void loongson_poweroff(void)
>  {
> -	void (*fw_poweroff)(void) = (void *)loongson_sysconf.poweroff_addr;
>  
> -	fw_poweroff();
> +	if ((read_c0_prid() & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64R) {
> +		unsigned long base;
> +		unsigned int acpi_ctrl;
> +
> +		base = CKSEG1ADDR(LOONGSON_REG_BASE) + ACPI_OFF;
> +		acpi_ctrl = readl((void *)(base + PM1_STS));
> +		acpi_ctrl &= 0xffffffff;
> +		writel(acpi_ctrl, (void *)(base + PM1_STS));
> +		acpi_ctrl = SLP_EN | SLP_TYP;
> +		writel(acpi_ctrl, (void *)(base + PM1_CNT));
> +	} else {
> +		void (*fw_poweroff)(void) = (void *)loongson_sysconf.poweroff_addr;
> +
> +		fw_poweroff();
> +	}
>  	while (1) {
>  		if (cpu_wait)
>  			cpu_wait();
> -- 
> 2.31.0
> 
> 


-- 
- Jiaxun

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] MIPS: Loongson64: Add Loongson-2K1000 reset support
  2021-04-14 12:17 ` Jiaxun Yang
@ 2021-04-15  1:14   ` zhangqing
  0 siblings, 0 replies; 3+ messages in thread
From: zhangqing @ 2021-04-15  1:14 UTC (permalink / raw)
  To: Jiaxun Yang, Thomas Bogendoerfer, Huacai Chen; +Cc: linux-mips, linux-kernel



On 04/14/2021 08:17 PM, Jiaxun Yang wrote:
>
> On Wed, Apr 14, 2021, at 9:26 AM, Qing Zhang wrote:
>> Add power management register operations to support reboot and poweroff.
>>
>> Signed-off-by: Qing Zhang <zhangqing@loongson.cn>
> No that's not what we intended to do.
> Please add a devicetree node for pm block.
Hi, jiaxun

Thanks for your reply, I will do it and send v2 .

-Qing


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-04-15  1:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-14  1:26 [PATCH] MIPS: Loongson64: Add Loongson-2K1000 reset support Qing Zhang
2021-04-14 12:17 ` Jiaxun Yang
2021-04-15  1:14   ` zhangqing

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).