coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
power.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <assert.h>
5 #include <console/console.h>
6 #include <soc/addressmap.h>
7 #include <soc/pmc.h>
8 #include <soc/power.h>
9 
10 static struct tegra_pmc_regs * const pmc = (void *)TEGRA_PMC_BASE;
11 
12 enum {
15 };
16 
17 static int partition_powered(int id)
18 {
19  if (read32(&pmc->pwrgate_status) & (0x1 << id))
20  return POWER_UNGATE;
21 
22  return POWER_GATE;
23 }
24 
25 static const char *const power_gate_string[] = {
26  [POWER_GATE] = "Gat",
27  [POWER_UNGATE] = "Ungat",
28 };
29 
30 static void power_gate_toggle_request(uint32_t id, int request)
31 {
32  printk(BIOS_INFO, "%sing power partition %d.\n",
33  power_gate_string[request], id);
34 
35  int part_powered = partition_powered(id);
36 
37  if (request == part_powered) {
38  printk(BIOS_INFO, "Partition %d already %sed.\n", id,
39  power_gate_string[request]);
40  return;
41  }
42 
48 
49  // Wait for the request to be accepted.
51  ;
52  printk(BIOS_INFO, "Power gate toggle request accepted.\n");
53 
54  while (1) {
55  part_powered = partition_powered(id);
56  if (request == part_powered) {
57  printk(BIOS_INFO, "Partition %d %sed.\n", id,
58  power_gate_string[request]);
59  return;
60  }
61  }
62 }
63 
65 {
67 }
68 
70 {
72 }
73 
75 {
77 }
78 
80  [PMC_RST_STATUS_SOURCE_POR] = "POR",
81  [PMC_RST_STATUS_SOURCE_WATCHDOG] = "Watchdog",
82  [PMC_RST_STATUS_SOURCE_SENSOR] = "Sensor",
83  [PMC_RST_STATUS_SOURCE_SW_MAIN] = "SW Main",
84  [PMC_RST_STATUS_SOURCE_LP0] = "LP0",
85 };
86 
88 {
91  printk(BIOS_INFO, "PMC Reset Status: %s\n",
93 }
94 
95 static int partition_clamp_on(int id)
96 {
97  return read32(&pmc->clamp_status) & (1 << id);
98 }
99 
100 void remove_clamps(int id)
101 {
102  if (!partition_clamp_on(id))
103  return;
104 
105  /* Remove clamp */
106  write32(&pmc->remove_clamping_cmd, (1 << id));
107 
108  /* Wait for clamp off */
109  while (partition_clamp_on(id))
110  ;
111 }
112 
114 {
116  val &= ~bits;
117  val |= (override & bits);
119 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define assert(statement)
Definition: assert.h:74
#define printk(level,...)
Definition: stdlib.h:16
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
@ PMC_PWRGATE_TOGGLE_PARTID_SHIFT
Definition: pmc.h:306
@ PMC_PWRGATE_TOGGLE_START
Definition: pmc.h:307
@ PMC_PWRGATE_TOGGLE_PARTID_MASK
Definition: pmc.h:305
@ PMC_RST_STATUS_SOURCE_LP0
Definition: pmc.h:591
@ PMC_RST_STATUS_NUM_SOURCES
Definition: pmc.h:592
@ PMC_RST_STATUS_SOURCE_POR
Definition: pmc.h:587
@ PMC_RST_STATUS_SOURCE_MASK
Definition: pmc.h:586
@ PMC_RST_STATUS_SOURCE_SW_MAIN
Definition: pmc.h:590
@ PMC_RST_STATUS_SOURCE_WATCHDOG
Definition: pmc.h:588
@ PMC_RST_STATUS_SOURCE_SENSOR
Definition: pmc.h:589
@ POWER_GATE
Definition: power.c:13
@ POWER_UNGATE
Definition: power.c:14
void pmc_override_pwr_det(uint32_t bits, uint32_t override)
Definition: power.c:113
static struct tegra_pmc_regs *const pmc
Definition: power.c:10
void pmc_print_rst_status(void)
Definition: power.c:87
static int partition_powered(int id)
Definition: power.c:17
static const char *const power_gate_string[]
Definition: power.c:25
uint8_t pmc_rst_status(void)
Definition: power.c:74
void power_gate_partition(uint32_t id)
Definition: power.c:64
static const char * pmc_rst_status_str[PMC_RST_STATUS_NUM_SOURCES]
Definition: power.c:79
static int partition_clamp_on(int id)
Definition: power.c:95
static void power_gate_toggle_request(uint32_t id, int request)
Definition: power.c:30
void power_ungate_partition(uint32_t id)
Definition: power.c:69
void remove_clamps(int id)
Definition: power.c:100
@ TEGRA_PMC_BASE
Definition: addressmap.h:51
unsigned int uint32_t
Definition: stdint.h:14
unsigned char uint8_t
Definition: stdint.h:8
u32 remove_clamping_cmd
Definition: pmc.h:44
u32 pwr_det_val
Definition: pmc.h:88
u32 rst_status
Definition: pmc.h:132
u32 clamp_status
Definition: pmc.h:42
u32 pwrgate_toggle
Definition: pmc.h:43
u32 pwrgate_status
Definition: pmc.h:45
u8 val
Definition: sys.c:300