blob: 318c7a1be0f44312c7100191124206706fc8bbd6 [file] [log] [blame]
Marc Jones734daf62007-05-04 18:58:42 +00001/*
Stefan Reinauer7e61e452008-01-18 10:35:56 +00002 * This file is part of the coreboot project.
Jordan Crouseb29209f2007-05-10 17:57:03 +00003 *
4 * Copyright (C) 2007 Advanced Micro Devices, Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
Jordan Crouseb29209f2007-05-10 17:57:03 +000015 */
Ron Minnich5e9dc232006-07-28 16:06:16 +000016
Christian Gmeiner194ec4d2013-06-04 14:30:50 +020017#include "northbridge.h"
18
Patrick Georgi7dc28642012-07-13 19:06:22 +020019static void pll_reset(void)
Ron Minnich5e9dc232006-07-28 16:06:16 +000020{
21 msr_t msrGlcpSysRstpll;
22
Jordan Crousef8030bd2007-05-10 18:16:03 +000023 msrGlcpSysRstpll = rdmsr(GLCP_SYS_RSTPLL);
24
Stefan Reinauerb9aea892010-04-20 15:49:59 +000025 printk(BIOS_DEBUG, "MSR GLCP_SYS_RSTPLL (%08x) value is %08x:%08x\n",
26 GLCP_SYS_RSTPLL, msrGlcpSysRstpll.hi, msrGlcpSysRstpll.lo);
27
Stefan Reinauer0c781b22010-04-01 09:50:32 +000028 post_code(POST_PLL_INIT);
Jordan Crousef8030bd2007-05-10 18:16:03 +000029
30 if (!(msrGlcpSysRstpll.lo & (1 << RSTPLL_LOWER_SWFLAGS_SHIFT))) {
Stefan Reinauerb9aea892010-04-20 15:49:59 +000031 printk(BIOS_DEBUG, "Configuring PLL.\n");
Patrick Georgi7dc28642012-07-13 19:06:22 +020032 if (CONFIG_PLL_MANUAL_CONFIG) {
Stefan Reinauer0c781b22010-04-01 09:50:32 +000033 post_code(POST_PLL_MANUAL);
Ron Minnich5e9dc232006-07-28 16:06:16 +000034 /* CPU and GLIU mult/div (GLMC_CLK = GLIU_CLK / 2) */
Patrick Georgi7dc28642012-07-13 19:06:22 +020035 msrGlcpSysRstpll.hi = CONFIG_PLLMSRhi;
Ron Minnich5e9dc232006-07-28 16:06:16 +000036
37 /* Hold Count - how long we will sit in reset */
Patrick Georgi7dc28642012-07-13 19:06:22 +020038 msrGlcpSysRstpll.lo = CONFIG_PLLMSRlo;
Jordan Crousef8030bd2007-05-10 18:16:03 +000039 } else {
40 /*automatic configuration (straps) */
Stefan Reinauer0c781b22010-04-01 09:50:32 +000041 post_code(POST_PLL_STRAP);
Jordan Crousef8030bd2007-05-10 18:16:03 +000042 msrGlcpSysRstpll.lo &=
43 ~(0xFF << RSTPPL_LOWER_HOLD_COUNT_SHIFT);
44 msrGlcpSysRstpll.lo |=
45 (0xDE << RSTPPL_LOWER_HOLD_COUNT_SHIFT);
46 msrGlcpSysRstpll.lo &=
47 ~(RSTPPL_LOWER_COREBYPASS_SET |
48 RSTPPL_LOWER_MBBYPASS_SET);
49 msrGlcpSysRstpll.lo |=
50 RSTPPL_LOWER_COREPD_SET | RSTPPL_LOWER_CLPD_SET;
Marc Jones734daf62007-05-04 18:58:42 +000051 }
Jordan Crousef8030bd2007-05-10 18:16:03 +000052 /* Use SWFLAGS to remember: "we've already been here" */
Marc Jones734daf62007-05-04 18:58:42 +000053 msrGlcpSysRstpll.lo |= (1 << RSTPLL_LOWER_SWFLAGS_SHIFT);
Ron Minnich5e9dc232006-07-28 16:06:16 +000054
Jordan Crousef8030bd2007-05-10 18:16:03 +000055 /* "reset the chip" value */
Marc Jones734daf62007-05-04 18:58:42 +000056 msrGlcpSysRstpll.lo |= RSTPPL_LOWER_CHIP_RESET_SET;
Ron Minnich5e9dc232006-07-28 16:06:16 +000057 wrmsr(GLCP_SYS_RSTPLL, msrGlcpSysRstpll);
Marc Jones734daf62007-05-04 18:58:42 +000058
Stefan Reinauerb9aea892010-04-20 15:49:59 +000059 /* You should never get here..... The chip has reset. */
Stefan Reinauer0c781b22010-04-01 09:50:32 +000060 post_code(POST_PLL_RESET_FAIL);
Nils Jacobs8cf54c92010-12-30 19:21:08 +000061 die("CONFIGURING PLL FAILURE\n");
Marc Jones734daf62007-05-04 18:58:42 +000062
63 }
Stefan Reinauerb9aea892010-04-20 15:49:59 +000064 printk(BIOS_DEBUG, "PLL configured.\n");
Marc Jones734daf62007-05-04 18:58:42 +000065 return;
66}
67
Stefan Reinauer720297c2010-04-02 22:11:20 +000068#if 0 // Unused
Jordan Crousef8030bd2007-05-10 18:16:03 +000069static unsigned int CPUSpeed(void)
70{
Marc Jones734daf62007-05-04 18:58:42 +000071 unsigned int speed;
72 msr_t msr;
73
74 msr = rdmsr(GLCP_SYS_RSTPLL);
Jordan Crousef8030bd2007-05-10 18:16:03 +000075 speed = ((((msr.hi >> RSTPLL_UPPER_CPUMULT_SHIFT) & 0x1F) + 1) * 333) / 10;
76 if ((((((msr.hi >> RSTPLL_UPPER_CPUMULT_SHIFT) & 0x1F) + 1) * 333) % 10) > 5) {
Marc Jones734daf62007-05-04 18:58:42 +000077 ++speed;
78 }
Jordan Crousef8030bd2007-05-10 18:16:03 +000079 return (speed);
Marc Jones734daf62007-05-04 18:58:42 +000080}
Stefan Reinauer720297c2010-04-02 22:11:20 +000081#endif
82
Christian Gmeiner194ec4d2013-06-04 14:30:50 +020083unsigned int GeodeLinkSpeed(void)
Jordan Crousef8030bd2007-05-10 18:16:03 +000084{
Marc Jones734daf62007-05-04 18:58:42 +000085 unsigned int speed;
86 msr_t msr;
87
88 msr = rdmsr(GLCP_SYS_RSTPLL);
Jordan Crousef8030bd2007-05-10 18:16:03 +000089 speed = ((((msr.hi >> RSTPLL_UPPER_GLMULT_SHIFT) & 0x1F) + 1) * 333) / 10;
90 if ((((((msr.hi >> RSTPLL_UPPER_GLMULT_SHIFT) & 0x1F) + 1) * 333) % 10) > 5) {
Marc Jones734daf62007-05-04 18:58:42 +000091 ++speed;
92 }
Jordan Crousef8030bd2007-05-10 18:16:03 +000093 return (speed);
Marc Jones734daf62007-05-04 18:58:42 +000094}
Stefan Reinauer720297c2010-04-02 22:11:20 +000095
96#if 0 // Unused
Jordan Crousef8030bd2007-05-10 18:16:03 +000097static unsigned int PCISpeed(void)
98{
Marc Jones734daf62007-05-04 18:58:42 +000099 msr_t msr;
100
101 msr = rdmsr(GLCP_SYS_RSTPLL);
Jordan Crousef8030bd2007-05-10 18:16:03 +0000102 if (msr.hi & (1 << RSTPPL_LOWER_PCISPEED_SHIFT)) {
103 return (66);
104 } else {
105 return (33);
Ron Minnich5e9dc232006-07-28 16:06:16 +0000106 }
107}
Stefan Reinauer720297c2010-04-02 22:11:20 +0000108#endif