aboutsummaryrefslogtreecommitdiff
path: root/src/southbridge/amd/pi/hudson/hudson.h
blob: 6e3157dd14a224770f0d83e2193d5f1808ba8f1e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2010 Advanced Micro Devices, Inc.
 * Copyright (C) 2014 Sage Electronic Engineering, LLC
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef HUDSON_H
#define HUDSON_H

#include <types.h>
#include <device/pci_ids.h>
#include <device/device.h>
#include "chip.h"

/* Power management index/data registers */
#define BIOSRAM_INDEX	0xcd4
#define BIOSRAM_DATA	0xcd5
#define PM_INDEX	0xcd6
#define PM_DATA		0xcd7
#define PM2_INDEX	0xcd0
#define PM2_DATA	0xcd1

#define HUDSON_ACPI_IO_BASE 0x800

#define ACPI_PM_EVT_BLK		(HUDSON_ACPI_IO_BASE + 0x00) /* 4 bytes */
#define ACPI_PM1_CNT_BLK	(HUDSON_ACPI_IO_BASE + 0x04) /* 2 bytes */
#define ACPI_PM_TMR_BLK		(HUDSON_ACPI_IO_BASE + 0x18) /* 4 bytes */
#define ACPI_GPE0_BLK		(HUDSON_ACPI_IO_BASE + 0x10) /* 8 bytes */
#define ACPI_CPU_CONTROL	(HUDSON_ACPI_IO_BASE + 0x08) /* 6 bytes */

#define ACPI_SMI_CTL_PORT		0xb2
#define ACPI_SMI_CMD_CST_CONTROL	0xde
#define ACPI_SMI_CMD_PST_CONTROL	0xad
#define ACPI_SMI_CMD_DISABLE		0xbe
#define ACPI_SMI_CMD_ENABLE		0xef
#define ACPI_SMI_CMD_S4_REQ		0xc0

#define REV_HUDSON_A11	0x11
#define REV_HUDSON_A12	0x12

#define SPIROM_BASE_ADDRESS_REGISTER  0xA0
#define SPI_ROM_ENABLE                0x02
#define SPI_BASE_ADDRESS              0xFEC10000

#define LPC_IO_PORT_DECODE_ENABLE     0x44
#define DECODE_ENABLE_PARALLEL_PORT0  BIT(0)
#define DECODE_ENABLE_PARALLEL_PORT1  BIT(1)
#define DECODE_ENABLE_PARALLEL_PORT2  BIT(2)
#define DECODE_ENABLE_PARALLEL_PORT3  BIT(3)
#define DECODE_ENABLE_PARALLEL_PORT4  BIT(4)
#define DECODE_ENABLE_PARALLEL_PORT5  BIT(5)
#define DECODE_ENABLE_SERIAL_PORT0    BIT(6)
#define DECODE_ENABLE_SERIAL_PORT1    BIT(7)
#define DECODE_ENABLE_SERIAL_PORT2    BIT(8)
#define DECODE_ENABLE_SERIAL_PORT3    BIT(9)
#define DECODE_ENABLE_SERIAL_PORT4    BIT(10)
#define DECODE_ENABLE_SERIAL_PORT5    BIT(11)
#define DECODE_ENABLE_SERIAL_PORT6    BIT(12)
#define DECODE_ENABLE_SERIAL_PORT7    BIT(13)
#define DECODE_ENABLE_AUDIO_PORT0     BIT(14)
#define DECODE_ENABLE_AUDIO_PORT1     BIT(15)
#define DECODE_ENABLE_AUDIO_PORT2     BIT(16)
#define DECODE_ENABLE_AUDIO_PORT3     BIT(17)
#define DECODE_ENABLE_MIDI_PORT0      BIT(18)
#define DECODE_ENABLE_MIDI_PORT1      BIT(19)
#define DECODE_ENABLE_MIDI_PORT2      BIT(20)
#define DECODE_ENABLE_MIDI_PORT3      BIT(21)
#define DECODE_ENABLE_MSS_PORT0       BIT(22)
#define DECODE_ENABLE_MSS_PORT1       BIT(23)
#define DECODE_ENABLE_MSS_PORT2       BIT(24)
#define DECODE_ENABLE_MSS_PORT3       BIT(25)
#define DECODE_ENABLE_FDC_PORT0       BIT(26)
#define DECODE_ENABLE_FDC_PORT1       BIT(27)
#define DECODE_ENABLE_GAME_PORT       BIT(28)
#define DECODE_ENABLE_KBC_PORT        BIT(29)
#define DECODE_ENABLE_ACPIUC_PORT     BIT(30)
#define DECODE_ENABLE_ADLIB_PORT      BIT(31)

#define SPI_CNTRL0                    0x00
#define SPI_READ_MODE_MASK            (BIT(30) | BIT(29) | BIT(18))
/* Nominal is 16.7MHz on older devices, 33MHz on newer */
#define SPI_READ_MODE_NOM             0x00000000
#define SPI_READ_MODE_DUAL112         (          BIT(29)          )
#define SPI_READ_MODE_QUAD114         (          BIT(29) | BIT(18))
#define SPI_READ_MODE_DUAL122         (BIT(30)                    )
#define SPI_READ_MODE_QUAD144         (BIT(30) |           BIT(18))
#define SPI_READ_MODE_NORMAL66        (BIT(30) | BIT(29)          )
/* Nominal and SPI_READ_MODE_FAST_HUDSON1 are the only valid choices for H1 */
#define SPI_READ_MODE_FAST_HUDSON1    (                    BIT(18))
#define SPI_READ_MODE_FAST            (BIT(30) | BIT(29) | BIT(18))
#define SPI_ARB_ENABLE                BIT(19)

#define SPI_CNTRL1                    0x0c
/* Use SPI_SPEED_16M-SPI_SPEED_66M below for hudson and bolton */
#define SPI_CNTRL1_SPEED_MASK         (BIT(15) | BIT(14) | BIT(13) | BIT(12))
#define SPI_NORM_SPEED_SH             12
#define SPI_FAST_SPEED_SH             8

#define SPI100_ENABLE                 0x20
#define SPI_USE_SPI100                BIT(0)

#define SPI100_SPEED_CONFIG           0x22
#define SPI_SPEED_66M                 (0x0)
#define SPI_SPEED_33M                 (                  BIT(0))
#define SPI_SPEED_22M                 (         BIT(1)         )
#define SPI_SPEED_16M                 (         BIT(1) | BIT(0))
#define SPI_SPEED_100M                (BIT(2)                  )
#define SPI_SPEED_800K                (BIT(2) |          BIT(0))
#define SPI_NORM_SPEED_NEW_SH         12
#define SPI_FAST_SPEED_NEW_SH         8
#define SPI_ALT_SPEED_NEW_SH          4
#define SPI_TPM_SPEED_NEW_SH          0

#define SPI100_HOST_PREF_CONFIG       0x2c
#define SPI_RD4DW_EN_HOST             BIT(15)

static inline int hudson_sata_enable(void)
{
	/* True if IDE or AHCI. */
	return (CONFIG_HUDSON_SATA_MODE == 0) || (CONFIG_HUDSON_SATA_MODE == 2);
}

static inline int hudson_ide_enable(void)
{
	/* True if IDE or LEGACY IDE. */
	return (CONFIG_HUDSON_SATA_MODE == 0) || (CONFIG_HUDSON_SATA_MODE == 3);
}

#ifndef __SMM__

void pm_write8(u8 reg, u8 value);
u8 pm_read8(u8 reg);
void pm_write16(u8 reg, u16 value);
u16 pm_read16(u16 reg);

#ifdef __PRE_RAM__
void hudson_lpc_port80(void);
void hudson_lpc_decode(void);
void hudson_pci_port80(void);
void hudson_clk_output_48Mhz(void);
void hudson_read_mode(u32 mode);
void hudson_set_spi100(u16 norm, u16 fast, u16 alt, u16 tpm);
void hudson_disable_4dw_burst(void);
void hudson_set_readspeed(u16 norm, u16 fast);

int s3_save_nvram_early(u32 dword, int size, int  nvram_pos);
int s3_load_nvram_early(int size, u32 *old_dword, int nvram_pos);
#if IS_ENABLED(CONFIG_HUDSON_UART)
void configure_hudson_uart(void);
#endif

#else
void hudson_enable(device_t dev);
void s3_resume_init_data(void *FchParams);

#endif /* __PRE_RAM__ */
#endif /* __SMM__ */

#endif /* HUDSON_H */