1 // SPDX-License-Identifier: GPL-2.0-only
3 * Intel Atom SoC Power Management Controller Driver
4 * Copyright (c) 2014-2015,2017,2022 Intel Corporation.
7 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9 #include <linux/acpi.h>
10 #include <linux/debugfs.h>
11 #include <linux/device.h>
12 #include <linux/dmi.h>
13 #include <linux/init.h>
15 #include <linux/platform_data/x86/clk-pmc-atom.h>
16 #include <linux/platform_data/x86/pmc_atom.h>
17 #include <linux/platform_data/x86/simatic-ipc.h>
18 #include <linux/platform_device.h>
19 #include <linux/pci.h>
20 #include <linux/seq_file.h>
21 #include <linux/suspend.h>
29 const struct pmc_bit_map
*d3_sts_0
;
30 const struct pmc_bit_map
*d3_sts_1
;
31 const struct pmc_bit_map
*func_dis
;
32 const struct pmc_bit_map
*func_dis_2
;
33 const struct pmc_bit_map
*pss
;
37 const struct pmc_reg_map
*map
;
38 const struct pmc_clk
*clks
;
44 const struct pmc_reg_map
*map
;
45 #ifdef CONFIG_DEBUG_FS
46 struct dentry
*dbgfs_dir
;
47 #endif /* CONFIG_DEBUG_FS */
51 static struct pmc_dev pmc_device
;
52 static u32 acpi_base_addr
;
54 static const struct pmc_clk byt_clks
[] = {
63 .parent_name
= "xtal",
68 static const struct pmc_clk cht_clks
[] = {
77 static const struct pmc_bit_map d3_sts_0_map
[] = {
78 {"LPSS1_F0_DMA", BIT_LPSS1_F0_DMA
},
79 {"LPSS1_F1_PWM1", BIT_LPSS1_F1_PWM1
},
80 {"LPSS1_F2_PWM2", BIT_LPSS1_F2_PWM2
},
81 {"LPSS1_F3_HSUART1", BIT_LPSS1_F3_HSUART1
},
82 {"LPSS1_F4_HSUART2", BIT_LPSS1_F4_HSUART2
},
83 {"LPSS1_F5_SPI", BIT_LPSS1_F5_SPI
},
84 {"LPSS1_F6_Reserved", BIT_LPSS1_F6_XXX
},
85 {"LPSS1_F7_Reserved", BIT_LPSS1_F7_XXX
},
86 {"SCC_EMMC", BIT_SCC_EMMC
},
87 {"SCC_SDIO", BIT_SCC_SDIO
},
88 {"SCC_SDCARD", BIT_SCC_SDCARD
},
89 {"SCC_MIPI", BIT_SCC_MIPI
},
96 {"USB_EHCI", BIT_USB_EHCI
},
98 {"PCIE_PORT0", BIT_PCIE_PORT0
},
99 {"PCIE_PORT1", BIT_PCIE_PORT1
},
100 {"PCIE_PORT2", BIT_PCIE_PORT2
},
101 {"PCIE_PORT3", BIT_PCIE_PORT3
},
102 {"LPSS2_F0_DMA", BIT_LPSS2_F0_DMA
},
103 {"LPSS2_F1_I2C1", BIT_LPSS2_F1_I2C1
},
104 {"LPSS2_F2_I2C2", BIT_LPSS2_F2_I2C2
},
105 {"LPSS2_F3_I2C3", BIT_LPSS2_F3_I2C3
},
106 {"LPSS2_F3_I2C4", BIT_LPSS2_F4_I2C4
},
107 {"LPSS2_F5_I2C5", BIT_LPSS2_F5_I2C5
},
108 {"LPSS2_F6_I2C6", BIT_LPSS2_F6_I2C6
},
109 {"LPSS2_F7_I2C7", BIT_LPSS2_F7_I2C7
},
113 static struct pmc_bit_map byt_d3_sts_1_map
[] = {
115 {"OTG_SS_PHY", BIT_OTG_SS_PHY
},
116 {"USH_SS_PHY", BIT_USH_SS_PHY
},
121 static struct pmc_bit_map cht_d3_sts_1_map
[] = {
123 {"GMM", BIT_STS_GMM
},
124 {"ISH", BIT_STS_ISH
},
128 static struct pmc_bit_map cht_func_dis_2_map
[] = {
135 static const struct pmc_bit_map byt_pss_map
[] = {
136 {"GBE", PMC_PSS_BIT_GBE
},
137 {"SATA", PMC_PSS_BIT_SATA
},
138 {"HDA", PMC_PSS_BIT_HDA
},
139 {"SEC", PMC_PSS_BIT_SEC
},
140 {"PCIE", PMC_PSS_BIT_PCIE
},
141 {"LPSS", PMC_PSS_BIT_LPSS
},
142 {"LPE", PMC_PSS_BIT_LPE
},
143 {"DFX", PMC_PSS_BIT_DFX
},
144 {"USH_CTRL", PMC_PSS_BIT_USH_CTRL
},
145 {"USH_SUS", PMC_PSS_BIT_USH_SUS
},
146 {"USH_VCCS", PMC_PSS_BIT_USH_VCCS
},
147 {"USH_VCCA", PMC_PSS_BIT_USH_VCCA
},
148 {"OTG_CTRL", PMC_PSS_BIT_OTG_CTRL
},
149 {"OTG_VCCS", PMC_PSS_BIT_OTG_VCCS
},
150 {"OTG_VCCA_CLK", PMC_PSS_BIT_OTG_VCCA_CLK
},
151 {"OTG_VCCA", PMC_PSS_BIT_OTG_VCCA
},
152 {"USB", PMC_PSS_BIT_USB
},
153 {"USB_SUS", PMC_PSS_BIT_USB_SUS
},
157 static const struct pmc_bit_map cht_pss_map
[] = {
158 {"SATA", PMC_PSS_BIT_SATA
},
159 {"HDA", PMC_PSS_BIT_HDA
},
160 {"SEC", PMC_PSS_BIT_SEC
},
161 {"PCIE", PMC_PSS_BIT_PCIE
},
162 {"LPSS", PMC_PSS_BIT_LPSS
},
163 {"LPE", PMC_PSS_BIT_LPE
},
164 {"UFS", PMC_PSS_BIT_CHT_UFS
},
165 {"UXD", PMC_PSS_BIT_CHT_UXD
},
166 {"UXD_FD", PMC_PSS_BIT_CHT_UXD_FD
},
167 {"UX_ENG", PMC_PSS_BIT_CHT_UX_ENG
},
168 {"USB_SUS", PMC_PSS_BIT_CHT_USB_SUS
},
169 {"GMM", PMC_PSS_BIT_CHT_GMM
},
170 {"ISH", PMC_PSS_BIT_CHT_ISH
},
171 {"DFX_MASTER", PMC_PSS_BIT_CHT_DFX_MASTER
},
172 {"DFX_CLUSTER1", PMC_PSS_BIT_CHT_DFX_CLUSTER1
},
173 {"DFX_CLUSTER2", PMC_PSS_BIT_CHT_DFX_CLUSTER2
},
174 {"DFX_CLUSTER3", PMC_PSS_BIT_CHT_DFX_CLUSTER3
},
175 {"DFX_CLUSTER4", PMC_PSS_BIT_CHT_DFX_CLUSTER4
},
176 {"DFX_CLUSTER5", PMC_PSS_BIT_CHT_DFX_CLUSTER5
},
180 static const struct pmc_reg_map byt_reg_map
= {
181 .d3_sts_0
= d3_sts_0_map
,
182 .d3_sts_1
= byt_d3_sts_1_map
,
183 .func_dis
= d3_sts_0_map
,
184 .func_dis_2
= byt_d3_sts_1_map
,
188 static const struct pmc_reg_map cht_reg_map
= {
189 .d3_sts_0
= d3_sts_0_map
,
190 .d3_sts_1
= cht_d3_sts_1_map
,
191 .func_dis
= d3_sts_0_map
,
192 .func_dis_2
= cht_func_dis_2_map
,
196 static const struct pmc_data byt_data
= {
201 static const struct pmc_data cht_data
= {
206 static inline u32
pmc_reg_read(struct pmc_dev
*pmc
, int reg_offset
)
208 return readl(pmc
->regmap
+ reg_offset
);
211 static inline void pmc_reg_write(struct pmc_dev
*pmc
, int reg_offset
, u32 val
)
213 writel(val
, pmc
->regmap
+ reg_offset
);
216 int pmc_atom_read(int offset
, u32
*value
)
218 struct pmc_dev
*pmc
= &pmc_device
;
223 *value
= pmc_reg_read(pmc
, offset
);
227 static void pmc_power_off(void)
232 pr_info("Preparing to enter system sleep state S5\n");
234 pm1_cnt_port
= acpi_base_addr
+ PM1_CNT
;
236 pm1_cnt_value
= inl(pm1_cnt_port
);
237 pm1_cnt_value
&= ~SLEEP_TYPE_MASK
;
238 pm1_cnt_value
|= SLEEP_TYPE_S5
;
239 pm1_cnt_value
|= SLEEP_ENABLE
;
241 outl(pm1_cnt_value
, pm1_cnt_port
);
244 static void pmc_hw_reg_setup(struct pmc_dev
*pmc
)
247 * Disable PMC S0IX_WAKE_EN events coming from:
249 * - GPIO_SUS ored dedicated IRQs
250 * - GPIO_SCORE ored dedicated IRQs
251 * - GPIO_SUS shared IRQ
252 * - GPIO_SCORE shared IRQ
254 pmc_reg_write(pmc
, PMC_S0IX_WAKE_EN
, (u32
)PMC_WAKE_EN_SETTING
);
257 #ifdef CONFIG_DEBUG_FS
258 static void pmc_dev_state_print(struct seq_file
*s
, int reg_index
,
259 u32 sts
, const struct pmc_bit_map
*sts_map
,
260 u32 fd
, const struct pmc_bit_map
*fd_map
)
262 int offset
= PMC_REG_BIT_WIDTH
* reg_index
;
265 for (index
= 0; sts_map
[index
].name
; index
++) {
266 seq_printf(s
, "Dev: %-2d - %-32s\tState: %s [%s]\n",
267 offset
+ index
, sts_map
[index
].name
,
268 fd_map
[index
].bit_mask
& fd
? "Disabled" : "Enabled ",
269 sts_map
[index
].bit_mask
& sts
? "D3" : "D0");
273 static int pmc_dev_state_show(struct seq_file
*s
, void *unused
)
275 struct pmc_dev
*pmc
= s
->private;
276 const struct pmc_reg_map
*m
= pmc
->map
;
277 u32 func_dis
, func_dis_2
;
278 u32 d3_sts_0
, d3_sts_1
;
280 func_dis
= pmc_reg_read(pmc
, PMC_FUNC_DIS
);
281 func_dis_2
= pmc_reg_read(pmc
, PMC_FUNC_DIS_2
);
282 d3_sts_0
= pmc_reg_read(pmc
, PMC_D3_STS_0
);
283 d3_sts_1
= pmc_reg_read(pmc
, PMC_D3_STS_1
);
286 pmc_dev_state_print(s
, 0, d3_sts_0
, m
->d3_sts_0
, func_dis
, m
->func_dis
);
289 pmc_dev_state_print(s
, 1, d3_sts_1
, m
->d3_sts_1
, func_dis_2
, m
->func_dis_2
);
294 DEFINE_SHOW_ATTRIBUTE(pmc_dev_state
);
296 static int pmc_pss_state_show(struct seq_file
*s
, void *unused
)
298 struct pmc_dev
*pmc
= s
->private;
299 const struct pmc_bit_map
*map
= pmc
->map
->pss
;
300 u32 pss
= pmc_reg_read(pmc
, PMC_PSS
);
303 for (index
= 0; map
[index
].name
; index
++) {
304 seq_printf(s
, "Island: %-2d - %-32s\tState: %s\n",
305 index
, map
[index
].name
,
306 map
[index
].bit_mask
& pss
? "Off" : "On");
311 DEFINE_SHOW_ATTRIBUTE(pmc_pss_state
);
313 static int pmc_sleep_tmr_show(struct seq_file
*s
, void *unused
)
315 struct pmc_dev
*pmc
= s
->private;
316 u64 s0ir_tmr
, s0i1_tmr
, s0i2_tmr
, s0i3_tmr
, s0_tmr
;
318 s0ir_tmr
= (u64
)pmc_reg_read(pmc
, PMC_S0IR_TMR
) << PMC_TMR_SHIFT
;
319 s0i1_tmr
= (u64
)pmc_reg_read(pmc
, PMC_S0I1_TMR
) << PMC_TMR_SHIFT
;
320 s0i2_tmr
= (u64
)pmc_reg_read(pmc
, PMC_S0I2_TMR
) << PMC_TMR_SHIFT
;
321 s0i3_tmr
= (u64
)pmc_reg_read(pmc
, PMC_S0I3_TMR
) << PMC_TMR_SHIFT
;
322 s0_tmr
= (u64
)pmc_reg_read(pmc
, PMC_S0_TMR
) << PMC_TMR_SHIFT
;
324 seq_printf(s
, "S0IR Residency:\t%lldus\n", s0ir_tmr
);
325 seq_printf(s
, "S0I1 Residency:\t%lldus\n", s0i1_tmr
);
326 seq_printf(s
, "S0I2 Residency:\t%lldus\n", s0i2_tmr
);
327 seq_printf(s
, "S0I3 Residency:\t%lldus\n", s0i3_tmr
);
328 seq_printf(s
, "S0 Residency:\t%lldus\n", s0_tmr
);
332 DEFINE_SHOW_ATTRIBUTE(pmc_sleep_tmr
);
334 static void pmc_dbgfs_register(struct pmc_dev
*pmc
)
338 dir
= debugfs_create_dir("pmc_atom", NULL
);
340 pmc
->dbgfs_dir
= dir
;
342 debugfs_create_file("dev_state", S_IFREG
| S_IRUGO
, dir
, pmc
,
343 &pmc_dev_state_fops
);
344 debugfs_create_file("pss_state", S_IFREG
| S_IRUGO
, dir
, pmc
,
345 &pmc_pss_state_fops
);
346 debugfs_create_file("sleep_state", S_IFREG
| S_IRUGO
, dir
, pmc
,
347 &pmc_sleep_tmr_fops
);
350 static void pmc_dbgfs_register(struct pmc_dev
*pmc
)
353 #endif /* CONFIG_DEBUG_FS */
355 static bool pmc_clk_is_critical
= true;
357 static int dmi_callback(const struct dmi_system_id
*d
)
359 pr_info("%s: PMC critical clocks quirk enabled\n", d
->ident
);
364 static int dmi_callback_siemens(const struct dmi_system_id
*d
)
368 if (dmi_walk(simatic_ipc_find_dmi_entry_helper
, &st_id
))
371 if (st_id
== SIMATIC_IPC_IPC227E
|| st_id
== SIMATIC_IPC_IPC277E
)
372 return dmi_callback(d
);
375 pmc_clk_is_critical
= false;
380 * Some systems need one or more of their pmc_plt_clks to be
381 * marked as critical.
383 static const struct dmi_system_id critclk_systems
[] = {
385 /* pmc_plt_clk0 is used for an external HSIC USB HUB */
386 .ident
= "MPL CEC1x",
387 .callback
= dmi_callback
,
389 DMI_MATCH(DMI_SYS_VENDOR
, "MPL AG"),
390 DMI_MATCH(DMI_PRODUCT_NAME
, "CEC10 Family"),
395 * Lex System / Lex Computech Co. makes a lot of Bay Trail
396 * based embedded boards which often come with multiple
397 * ethernet controllers using multiple pmc_plt_clks. See:
398 * https://www.lex.com.tw/products/embedded-ipc-board/
400 .ident
= "Lex BayTrail",
401 .callback
= dmi_callback
,
403 DMI_MATCH(DMI_SYS_VENDOR
, "Lex BayTrail"),
407 /* pmc_plt_clk* - are used for ethernet controllers */
408 .ident
= "Beckhoff Baytrail",
409 .callback
= dmi_callback
,
411 DMI_MATCH(DMI_SYS_VENDOR
, "Beckhoff Automation"),
412 DMI_MATCH(DMI_PRODUCT_FAMILY
, "CBxx63"),
416 .ident
= "SIEMENS AG",
417 .callback
= dmi_callback_siemens
,
419 DMI_MATCH(DMI_SYS_VENDOR
, "SIEMENS AG"),
425 static int pmc_setup_clks(struct pci_dev
*pdev
, void __iomem
*pmc_regmap
,
426 const struct pmc_data
*pmc_data
)
428 struct platform_device
*clkdev
;
429 struct pmc_clk_data
*clk_data
;
431 clk_data
= kzalloc(sizeof(*clk_data
), GFP_KERNEL
);
435 clk_data
->base
= pmc_regmap
; /* offset is added by client */
436 clk_data
->clks
= pmc_data
->clks
;
437 if (dmi_check_system(critclk_systems
))
438 clk_data
->critical
= pmc_clk_is_critical
;
440 clkdev
= platform_device_register_data(&pdev
->dev
, "clk-pmc-atom",
442 clk_data
, sizeof(*clk_data
));
443 if (IS_ERR(clkdev
)) {
445 return PTR_ERR(clkdev
);
453 #ifdef CONFIG_SUSPEND
454 static void pmc_dev_state_check(u32 sts
, const struct pmc_bit_map
*sts_map
,
455 u32 fd
, const struct pmc_bit_map
*fd_map
,
456 u32 sts_possible_false_pos
)
460 for (index
= 0; sts_map
[index
].name
; index
++) {
461 if (!(fd_map
[index
].bit_mask
& fd
) &&
462 !(sts_map
[index
].bit_mask
& sts
)) {
463 if (sts_map
[index
].bit_mask
& sts_possible_false_pos
)
464 pm_pr_dbg("%s is in D0 prior to s2idle\n",
465 sts_map
[index
].name
);
467 pr_err("%s is in D0 prior to s2idle\n",
468 sts_map
[index
].name
);
473 static void pmc_s2idle_check(void)
475 struct pmc_dev
*pmc
= &pmc_device
;
476 const struct pmc_reg_map
*m
= pmc
->map
;
477 u32 func_dis
, func_dis_2
;
478 u32 d3_sts_0
, d3_sts_1
;
479 u32 false_pos_sts_0
, false_pos_sts_1
;
482 func_dis
= pmc_reg_read(pmc
, PMC_FUNC_DIS
);
483 func_dis_2
= pmc_reg_read(pmc
, PMC_FUNC_DIS_2
);
484 d3_sts_0
= pmc_reg_read(pmc
, PMC_D3_STS_0
);
485 d3_sts_1
= pmc_reg_read(pmc
, PMC_D3_STS_1
);
488 * Some blocks are not used on lower-featured versions of the SoC and
489 * always report D0, add these to false_pos mask to log at debug level.
491 if (m
->d3_sts_1
== byt_d3_sts_1_map
) {
493 false_pos_sts_0
= BIT_GBE
| BIT_SATA
| BIT_PCIE_PORT0
|
494 BIT_PCIE_PORT1
| BIT_PCIE_PORT2
| BIT_PCIE_PORT3
|
496 false_pos_sts_1
= BIT_SMB
| BIT_USH_SS_PHY
| BIT_DFX
;
499 false_pos_sts_0
= BIT_GBE
| BIT_SATA
| BIT_LPSS2_F7_I2C7
;
500 false_pos_sts_1
= BIT_SMB
| BIT_STS_ISH
;
503 pmc_dev_state_check(d3_sts_0
, m
->d3_sts_0
, func_dis
, m
->func_dis
, false_pos_sts_0
);
504 pmc_dev_state_check(d3_sts_1
, m
->d3_sts_1
, func_dis_2
, m
->func_dis_2
, false_pos_sts_1
);
506 /* Forced-on PMC clocks prevent S0i3 */
507 for (i
= 0; i
< PMC_CLK_NUM
; i
++) {
508 u32 ctl
= pmc_reg_read(pmc
, PMC_CLK_CTL_OFFSET
+ 4 * i
);
510 if ((ctl
& PMC_MASK_CLK_CTL
) != PMC_CLK_CTL_FORCE_ON
)
513 pr_err("clock %d is ON prior to freeze (ctl 0x%08x)\n", i
, ctl
);
517 static struct acpi_s2idle_dev_ops pmc_s2idle_ops
= {
518 .check
= pmc_s2idle_check
,
521 static void pmc_s2idle_check_register(void)
523 acpi_register_lps0_dev(&pmc_s2idle_ops
);
526 static void pmc_s2idle_check_register(void) {}
529 static int pmc_setup_dev(struct pci_dev
*pdev
, const struct pci_device_id
*ent
)
531 struct pmc_dev
*pmc
= &pmc_device
;
532 const struct pmc_data
*data
= (struct pmc_data
*)ent
->driver_data
;
533 const struct pmc_reg_map
*map
= data
->map
;
536 /* Obtain ACPI base address */
537 pci_read_config_dword(pdev
, ACPI_BASE_ADDR_OFFSET
, &acpi_base_addr
);
538 acpi_base_addr
&= ACPI_BASE_ADDR_MASK
;
540 /* Install power off function */
541 if (acpi_base_addr
!= 0 && pm_power_off
== NULL
)
542 pm_power_off
= pmc_power_off
;
544 pci_read_config_dword(pdev
, PMC_BASE_ADDR_OFFSET
, &pmc
->base_addr
);
545 pmc
->base_addr
&= PMC_BASE_ADDR_MASK
;
547 pmc
->regmap
= ioremap(pmc
->base_addr
, PMC_MMIO_REG_LEN
);
549 dev_err(&pdev
->dev
, "error: ioremap failed\n");
555 /* PMC hardware registers setup */
556 pmc_hw_reg_setup(pmc
);
558 pmc_dbgfs_register(pmc
);
560 /* Register platform clocks - PMC_PLT_CLK [0..5] */
561 ret
= pmc_setup_clks(pdev
, pmc
->regmap
, data
);
563 dev_warn(&pdev
->dev
, "platform clocks register failed: %d\n",
566 pmc_s2idle_check_register();
571 /* Data for PCI driver interface used by pci_match_id() call below */
572 static const struct pci_device_id pmc_pci_ids
[] = {
573 { PCI_VDEVICE(INTEL
, PCI_DEVICE_ID_VLV_PMC
), (kernel_ulong_t
)&byt_data
},
574 { PCI_VDEVICE(INTEL
, PCI_DEVICE_ID_CHT_PMC
), (kernel_ulong_t
)&cht_data
},
578 static int __init
pmc_atom_init(void)
580 struct pci_dev
*pdev
= NULL
;
581 const struct pci_device_id
*ent
;
584 * We look for our device - PCU PMC.
585 * We assume that there is maximum one device.
587 * We can't use plain pci_driver mechanism,
588 * as the device is really a multiple function device,
589 * main driver that binds to the pci_device is lpc_ich
590 * and have to find & bind to the device this way.
592 for_each_pci_dev(pdev
) {
593 ent
= pci_match_id(pmc_pci_ids
, pdev
);
595 return pmc_setup_dev(pdev
, ent
);
597 /* Device not found */
601 device_initcall(pmc_atom_init
);
604 MODULE_AUTHOR("Aubrey Li <aubrey.li@linux.intel.com>");
605 MODULE_DESCRIPTION("Intel Atom SoC Power Management Controller Interface");
606 MODULE_LICENSE("GPL v2");