blob: 361989b270af5026f75410e5e59032ef3ffb7344 [file] [log] [blame]
Angel Pons182dbde2020-04-02 23:49:05 +02001/* SPDX-License-Identifier: GPL-2.0-only */
WANG Siyuan55f9a732013-12-02 10:18:04 +08002
3#include "imc.h"
Michał Żygowski287ce5f2019-12-01 17:41:23 +01004#include <amdblocks/acpimmio.h>
Kyösti Mälkki13f66502019-03-03 08:01:05 +02005#include <device/mmio.h>
Elyes HAOUAS19f5ba82018-10-14 14:52:06 +02006#include <Porting.h>
7#include <AGESA.h>
Kyösti Mälkki08311f52016-04-19 07:17:59 +03008#include <amdlib.h>
Alexandru Gagniuc01e0adf2014-03-29 17:07:26 -05009#include <Proc/Fch/Fch.h>
10#include <Proc/Fch/Common/FchCommonCfg.h>
11#include <Proc/Fch/FchPlatform.h>
WANG Siyuan55f9a732013-12-02 10:18:04 +080012
13void imc_reg_init(void)
14{
15 /* Init Power Management Block 2 (PM2) Registers.
16 * Check BKDG for AMD Family 16h for details. */
Michał Żygowski287ce5f2019-12-01 17:41:23 +010017 pm2_write8(0, 0x06);
18 pm2_write8(1, 0x06);
19 pm2_write8(2, 0xf7);
20 pm2_write8(3, 0xff);
21 pm2_write8(4, 0xff);
WANG Siyuan55f9a732013-12-02 10:18:04 +080022
Julius Wernercd49cce2019-03-05 16:53:33 -080023#if !CONFIG(SOUTHBRIDGE_AMD_AGESA_YANGTZE)
Michał Żygowski287ce5f2019-12-01 17:41:23 +010024 pm2_write8(0x10, 0x06);
25 pm2_write8(0x11, 0x06);
26 pm2_write8(0x12, 0xf7);
27 pm2_write8(0x13, 0xff);
28 pm2_write8(0x14, 0xff);
WANG Siyuan55f9a732013-12-02 10:18:04 +080029#endif
30
Julius Wernercd49cce2019-03-05 16:53:33 -080031#if CONFIG(SOUTHBRIDGE_AMD_AGESA_YANGTZE)
WANG Siyuan55f9a732013-12-02 10:18:04 +080032 UINT8 PciData;
33 PCI_ADDR PciAddress;
34 AMD_CONFIG_PARAMS StdHeader;
35 PciAddress.AddressValue = MAKE_SBDFO (0, 0, 0x18, 0x3, 0x1E4);
36 LibAmdPciRead(AccessWidth8, PciAddress, &PciData, &StdHeader);
37 PciData &= (UINT8)0x8F;
38 PciData |= 0x10;
39 LibAmdPciWrite(AccessWidth8, PciAddress, &PciData, &StdHeader);
40#endif
41}
42
WANG Siyuan55f9a732013-12-02 10:18:04 +080043void enable_imc_thermal_zone(void)
44{
45 AMD_CONFIG_PARAMS StdHeader;
46 UINT8 FunNum;
Richard Spiegel4195b102017-11-28 06:54:02 -070047 UINT8 regs[10];
WANG Siyuan55f9a732013-12-02 10:18:04 +080048 int i;
49
50 regs[0] = 0;
51 regs[1] = 0;
52 FunNum = Fun_80;
Elyes HAOUASc021ffe2016-09-18 19:18:56 +020053 for (i = 0; i <= 1; i++)
WANG Siyuan55f9a732013-12-02 10:18:04 +080054 WriteECmsg(MSG_REG0 + i, AccessWidth8, &regs[i], &StdHeader);
55 WriteECmsg(MSG_SYS_TO_IMC, AccessWidth8, &FunNum, &StdHeader); // function number
56 WaitForEcLDN9MailboxCmdAck(&StdHeader);
57
Richard Spiegel4195b102017-11-28 06:54:02 -070058 for (i = 2; i < ARRAY_SIZE(regs); i++)
WANG Siyuan55f9a732013-12-02 10:18:04 +080059 ReadECmsg(MSG_REG0 + i, AccessWidth8, &regs[i], &StdHeader);
60
61 /* enable thermal zone 0 */
62 regs[2] |= 1;
63 regs[0] = 0;
64 regs[1] = 0;
65 FunNum = Fun_81;
Richard Spiegel4195b102017-11-28 06:54:02 -070066 for (i = 0; i < ARRAY_SIZE(regs); i++)
WANG Siyuan55f9a732013-12-02 10:18:04 +080067 WriteECmsg(MSG_REG0 + i, AccessWidth8, &regs[i], &StdHeader);
68 WriteECmsg(MSG_SYS_TO_IMC, AccessWidth8, &FunNum, &StdHeader); // function number
69 WaitForEcLDN9MailboxCmdAck(&StdHeader);
70}