summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/pci/glxpcib.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/sys/dev/pci/glxpcib.c b/sys/dev/pci/glxpcib.c
index d55d0cadd87..5b93c115c99 100644
--- a/sys/dev/pci/glxpcib.c
+++ b/sys/dev/pci/glxpcib.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: glxpcib.c,v 1.9 2013/01/16 07:17:59 pirofti Exp $ */
+/* $OpenBSD: glxpcib.c,v 1.10 2013/03/17 19:09:03 miod Exp $ */
/*
* Copyright (c) 2007 Marc Balmer <mbalmer@openbsd.org>
@@ -166,6 +166,15 @@
#define AMD5536_SMB_CTL2_FREQ 0x78 /* 100 kHz */
#define AMD5536_SMB_CTL3 0x06 /* control 3 */
+/* PMS */
+#define MSR_LBAR_PMS DIVIL_LBAR_PMS
+#define MSR_PMS_SIZE 0x80
+#define MSR_PMS_ADDR_MASK 0xff80
+#define AMD5536_PMS_SSC 0x54
+#define AMD5536_PMS_SSC_PI 0x00040000
+#define AMD5536_PMS_SSC_CLR_PI 0x00020000
+#define AMD5536_PMS_SSC_SET_PI 0x00010000
+
/*
* MSR registers we want to preserve accross suspend/resume
*/
@@ -275,6 +284,7 @@ glxpcib_attach(struct device *parent, struct device *self, void *aux)
u_int64_t sa;
struct i2cbus_attach_args iba;
int i2c = 0;
+ bus_space_handle_t tmpioh;
#endif
tc->tc_get_timecount = glxpcib_get_timecount;
tc->tc_counter_mask = 0xffffffff;
@@ -384,6 +394,18 @@ glxpcib_attach(struct device *parent, struct device *self, void *aux)
iba.iba_tag = &sc->sc_smb_ic;
i2c = 1;
}
+
+ /* Map PMS I/O space and enable the ``Power Immediate'' feature */
+ sa = rdmsr(MSR_LBAR_PMS);
+ if (sa & MSR_LBAR_ENABLE &&
+ !bus_space_map(pa->pa_iot, sa & MSR_PMS_ADDR_MASK,
+ MSR_PMS_SIZE, 0, &tmpioh)) {
+ bus_space_write_4(pa->pa_iot, tmpioh, AMD5536_PMS_SSC,
+ AMD5536_PMS_SSC_SET_PI);
+ bus_space_barrier(pa->pa_iot, tmpioh, AMD5536_PMS_SSC, 4,
+ BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+ bus_space_unmap(pa->pa_iot, tmpioh, MSR_PMS_SIZE);
+ }
#endif /* SMALL_KERNEL */
pcibattach(parent, self, aux);