<p>Patrick Rudolph would like Patrick Rudolph to <strong>review</strong> this change.</p><p><a href="https://review.coreboot.org/27278">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sb/intel/common: Add functions to manipulate PMBASE<br><br>Get rid of duplicated get_pmbase and use the new common function.<br>TODO: Use the new functions to manipulate register in PMBASE.<br><br>Change-Id: I3b454434ade560fb056b1fc0afe9541df93e14dd<br>Signed-off-by: Patrick Rudolph <siro@das-labor.org><br>---<br>M src/southbridge/intel/common/Makefile.inc<br>A src/southbridge/intel/common/pmbase.c<br>A src/southbridge/intel/common/pmbase.h<br>M src/southbridge/intel/common/pmutil.c<br>M src/southbridge/intel/common/pmutil.h<br>M src/southbridge/intel/common/smi.c<br>M src/southbridge/intel/common/smihandler.c<br>M src/southbridge/intel/lynxpoint/pch.c<br>M src/southbridge/intel/lynxpoint/pch.h<br>M src/southbridge/intel/lynxpoint/pmutil.c<br>10 files changed, 112 insertions(+), 25 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/78/27278/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/southbridge/intel/common/Makefile.inc b/src/southbridge/intel/common/Makefile.inc</span><br><span>index bf3a86e..961b71b 100644</span><br><span>--- a/src/southbridge/intel/common/Makefile.inc</span><br><span>+++ b/src/southbridge/intel/common/Makefile.inc</span><br><span>@@ -18,6 +18,11 @@</span><br><span> </span><br><span> ifeq ($(CONFIG_SOUTHBRIDGE_INTEL_COMMON),y)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+romstage-y += pmbase.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-y += pmbase.c</span><br><span style="color: hsl(120, 100%, 40%);">+postcar-y += pmbase.c</span><br><span style="color: hsl(120, 100%, 40%);">+smm-y += pmbase.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> romstage-$(CONFIG_USBDEBUG_IN_ROMSTAGE) += usb_debug.c</span><br><span> ramstage-$(CONFIG_USBDEBUG) += usb_debug.c</span><br><span> </span><br><span>diff --git a/src/southbridge/intel/common/pmbase.c b/src/southbridge/intel/common/pmbase.c</span><br><span>new file mode 100644</span><br><span>index 0000000..ecdd1c5</span><br><span>--- /dev/null</span><br><span>+++ b/src/southbridge/intel/common/pmbase.c</span><br><span>@@ -0,0 +1,79 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2018 Patrick Rudolph <siro@das-labor.org></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/io.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <device/device.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <device/pci.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/early_variables.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "pmbase.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* LPC PM Base Address Register */</span><br><span style="color: hsl(120, 100%, 40%);">+#define PMBASE         0x40</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* PCI Configuration Space (D31:F0): LPC */</span><br><span style="color: hsl(120, 100%, 40%);">+#if defined(__SIMPLE_DEVICE__)</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCH_LPC_DEV        PCI_DEV(0, 0x1f, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCH_LPC_DEV dev_find_slot(0, PCI_DEVFN(0x1f, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+u16 get_pmbase(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+#if defined(__SMM__)</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Don't assume PMBASE is still the same */</span><br><span style="color: hsl(120, 100%, 40%);">+       return pci_read_config16(PCH_LPC_DEV, PMBASE) & 0xfffc;</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+    static u16 pmbase CAR_GLOBAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (pmbase)</span><br><span style="color: hsl(120, 100%, 40%);">+           return pmbase;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      pmbase = pci_read_config16(PCH_LPC_DEV, PMBASE) & 0xfffc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return pmbase;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void write_pmbase32(const u16 addr, const u32 val)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    outl(val, get_pmbase() | addr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void write_pmbase16(const u16 addr, const u16 val)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   outw(val, get_pmbase() | addr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void write_pmbase8(const u16 addr, const u8 val)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     outb(val, get_pmbase() | addr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+u32 read_pmbase32(const u16 addr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return inl(get_pmbase() | addr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+u16 read_pmbase16(const u16 addr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return inw(get_pmbase() | addr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+u8 read_pmbase8(const u16 addr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return inb(get_pmbase() | addr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/southbridge/intel/common/pmbase.h b/src/southbridge/intel/common/pmbase.h</span><br><span>new file mode 100644</span><br><span>index 0000000..27ad68a</span><br><span>--- /dev/null</span><br><span>+++ b/src/southbridge/intel/common/pmbase.h</span><br><span>@@ -0,0 +1,24 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2018 Patrick Rudolph <siro@das-labor.org></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+u16 get_pmbase(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void write_pmbase32(const u16 addr, const u32 val);</span><br><span style="color: hsl(120, 100%, 40%);">+void write_pmbase16(const u16 addr, const u16 val);</span><br><span style="color: hsl(120, 100%, 40%);">+void write_pmbase8(const u16 addr, const u8 val);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+u32 read_pmbase32(const u16 addr);</span><br><span style="color: hsl(120, 100%, 40%);">+u16 read_pmbase16(const u16 addr);</span><br><span style="color: hsl(120, 100%, 40%);">+u8 read_pmbase8(const u16 addr);</span><br><span>diff --git a/src/southbridge/intel/common/pmutil.c b/src/southbridge/intel/common/pmutil.c</span><br><span>index 97df201..03ae473 100644</span><br><span>--- a/src/southbridge/intel/common/pmutil.c</span><br><span>+++ b/src/southbridge/intel/common/pmutil.c</span><br><span>@@ -22,7 +22,7 @@</span><br><span> #include <cpu/x86/smm.h></span><br><span> #include <elog.h></span><br><span> #include <pc80/mc146818rtc.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#include <southbridge/intel/common/pmbase.h></span><br><span> #include <southbridge/intel/common/gpio.h></span><br><span> </span><br><span> #include "pmutil.h"</span><br><span>diff --git a/src/southbridge/intel/common/pmutil.h b/src/southbridge/intel/common/pmutil.h</span><br><span>index e2b6e58..9393ef4 100644</span><br><span>--- a/src/southbridge/intel/common/pmutil.h</span><br><span>+++ b/src/southbridge/intel/common/pmutil.h</span><br><span>@@ -101,8 +101,6 @@</span><br><span> #define   TCO_LOCK  (1 << 12)</span><br><span> #define TCO2_CNT     0x6a</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-u16 get_pmbase(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> u16 reset_pm1_status(void);</span><br><span> void dump_pm1_status(u16 pm1_sts);</span><br><span> void dump_tco_status(u32 tco_sts);</span><br><span>diff --git a/src/southbridge/intel/common/smi.c b/src/southbridge/intel/common/smi.c</span><br><span>index deaecb2..eaae8f2 100644</span><br><span>--- a/src/southbridge/intel/common/smi.c</span><br><span>+++ b/src/southbridge/intel/common/smi.c</span><br><span>@@ -23,18 +23,13 @@</span><br><span> #include <cpu/x86/cache.h></span><br><span> #include <cpu/x86/smm.h></span><br><span> #include <cpu/intel/smm/gen1/smi.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#include "pmbase.h"</span><br><span> #include "pmutil.h"</span><br><span> </span><br><span> #define DEBUG_PERIODIC_SMIS 0</span><br><span> </span><br><span> static u16 pmbase;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-u16 get_pmbase(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return pmbase;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> void southbridge_smm_init(void)</span><br><span> {</span><br><span>      u32 smi_en;</span><br><span>diff --git a/src/southbridge/intel/common/smihandler.c b/src/southbridge/intel/common/smihandler.c</span><br><span>index 65a1b96..234a1c5 100644</span><br><span>--- a/src/southbridge/intel/common/smihandler.c</span><br><span>+++ b/src/southbridge/intel/common/smihandler.c</span><br><span>@@ -26,16 +26,12 @@</span><br><span> #include <halt.h></span><br><span> #include <pc80/mc146818rtc.h></span><br><span> #include "pmutil.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "pmbase.h"</span><br><span> </span><br><span> static int smm_initialized = 0;</span><br><span> </span><br><span> static u16 pmbase;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-u16 get_pmbase(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return pmbase;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Defined in <cpu/x86/smm.h> which is used outside of common code*/</span><br><span> u16 smm_get_pmbase(void)</span><br><span> {</span><br><span>diff --git a/src/southbridge/intel/lynxpoint/pch.c b/src/southbridge/intel/lynxpoint/pch.c</span><br><span>index 1a390cc..762347e 100644</span><br><span>--- a/src/southbridge/intel/lynxpoint/pch.c</span><br><span>+++ b/src/southbridge/intel/lynxpoint/pch.c</span><br><span>@@ -57,16 +57,6 @@</span><br><span>         return pch_silicon_type() == PCH_TYPE_LPT_LP;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-u16 get_pmbase(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     static u16 pmbase;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!pmbase)</span><br><span style="color: hsl(0, 100%, 40%);">-            pmbase = pci_read_config16(pch_get_lpc_device(),</span><br><span style="color: hsl(0, 100%, 40%);">-                                           PMBASE) & 0xfffc;</span><br><span style="color: hsl(0, 100%, 40%);">-        return pmbase;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> u16 get_gpiobase(void)</span><br><span> {</span><br><span>       static u16 gpiobase;</span><br><span>diff --git a/src/southbridge/intel/lynxpoint/pch.h b/src/southbridge/intel/lynxpoint/pch.h</span><br><span>index ae996e8..f38c1dc 100644</span><br><span>--- a/src/southbridge/intel/lynxpoint/pch.h</span><br><span>+++ b/src/southbridge/intel/lynxpoint/pch.h</span><br><span>@@ -144,7 +144,6 @@</span><br><span> int pch_silicon_revision(void);</span><br><span> int pch_silicon_type(void);</span><br><span> int pch_is_lp(void);</span><br><span style="color: hsl(0, 100%, 40%);">-u16 get_pmbase(void);</span><br><span> u16 get_gpiobase(void);</span><br><span> </span><br><span> /* Power Management register handling in pmutil.c */</span><br><span>diff --git a/src/southbridge/intel/lynxpoint/pmutil.c b/src/southbridge/intel/lynxpoint/pmutil.c</span><br><span>index e96d683..30ef9aa 100644</span><br><span>--- a/src/southbridge/intel/lynxpoint/pmutil.c</span><br><span>+++ b/src/southbridge/intel/lynxpoint/pmutil.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> #include <device/pci_def.h></span><br><span> #include <console/console.h></span><br><span> #include <security/vboot/vbnv.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <common/pmbase.h></span><br><span> #include "pch.h"</span><br><span> </span><br><span> #if IS_ENABLED(CONFIG_INTEL_LYNXPOINT_LP)</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/27278">change 27278</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/27278"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I3b454434ade560fb056b1fc0afe9541df93e14dd </div>
<div style="display:none"> Gerrit-Change-Number: 27278 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <patrick.rudolph@9elements.com> </div>
<div style="display:none"> Gerrit-Reviewer: Patrick Rudolph <siro@das-labor.org> </div>