intel/e7505,i82801dx: Refactor raminit

Avoid direct enable_smbus() call from northbridge code.

Change-Id: I077e455242db9fc0f86432bd1afab75cb6fb6f4c
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/38267
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
Kyösti Mälkki 2020-01-07 11:16:35 +02:00
parent 61af679838
commit d1141ab5a4
5 changed files with 43 additions and 46 deletions

View File

@ -1740,28 +1740,38 @@ static void sdram_set_registers(const struct mem_controller *ctrl)
d060_control(D060_CMD_1);
}
/**
*
*
*/
void e7505_mch_init(const struct mem_controller *memctrl)
{
timestamp_add_now(TS_BEFORE_INITRAM);
sdram_set_registers(memctrl);
sdram_set_spd_registers(memctrl);
sdram_enable(memctrl);
}
void e7505_mch_done(const struct mem_controller *memctrl)
{
sdram_post_ecc(memctrl);
timestamp_add_now(TS_AFTER_INITRAM);
}
int e7505_mch_is_ready(void)
static int e7505_mch_is_ready(void)
{
uint32_t dword = pci_read_config32(MCHDEV, DRC);
return !!(dword & DRC_DONE);
}
void sdram_initialize(void)
{
static const struct mem_controller memctrl[] = {
{
.d0 = PCI_DEV(0, 0, 0),
.d0f1 = PCI_DEV(0, 0, 1),
.channel0 = { 0x50, 0x52, 0, 0 },
.channel1 = { 0x51, 0x53, 0, 0 },
},
};
/* If this is a warm boot, some initialisation can be skipped */
if (!e7505_mch_is_ready()) {
/* The real MCH initialisation. */
timestamp_add_now(TS_BEFORE_INITRAM);
sdram_set_registers(memctrl);
sdram_set_spd_registers(memctrl);
sdram_enable(memctrl);
/* Hook for post ECC scrub settings and debug. */
sdram_post_ecc(memctrl);
timestamp_add_now(TS_AFTER_INITRAM);
}
printk(BIOS_DEBUG, "SDRAM is up.\n");
}

View File

@ -30,8 +30,6 @@ struct mem_controller {
uint16_t channel1[MAX_DIMM_SOCKETS_PER_CHANNEL];
};
void e7505_mch_init(const struct mem_controller *memctrl);
void e7505_mch_done(const struct mem_controller *memctrl);
int e7505_mch_is_ready(void);
void sdram_initialize(void);
#endif /* RAMINIT_H */

View File

@ -13,9 +13,7 @@
* GNU General Public License for more details.
*/
#include <stdint.h>
#include <cbmem.h>
#include <console/console.h>
#include <arch/romstage.h>
#include <southbridge/intel/i82801dx/i82801dx.h>
@ -23,27 +21,12 @@
void mainboard_romstage_entry(void)
{
static const struct mem_controller memctrl[] = {
{
.d0 = PCI_DEV(0, 0, 0),
.d0f1 = PCI_DEV(0, 0, 1),
.channel0 = { 0x50, 0x52, 0, 0 },
.channel1 = { 0x51, 0x53, 0, 0 },
},
};
/* Perform some early chipset initialization required
* before RAM initialization can work
*/
i82801dx_early_init();
/* If this is a warm boot, some initialization can be skipped */
if (!e7505_mch_is_ready()) {
enable_smbus();
/* The real MCH initialisation. */
e7505_mch_init(memctrl);
/* Hook for post ECC scrub settings and debug. */
e7505_mch_done(memctrl);
}
printk(BIOS_DEBUG, "SDRAM is up.\n");
sdram_initialize();
cbmem_recovery(0);
}

View File

@ -21,6 +21,11 @@
#include "i82801dx.h"
void i82801dx_early_init(void)
{
enable_smbus();
}
void enable_smbus(void)
{
pci_devfn_t dev = PCI_DEV(0x0, 0x1f, 0x3);

View File

@ -35,6 +35,7 @@
#include "chip.h"
void i82801dx_enable(struct device *dev);
void i82801dx_early_init(void);
void enable_smbus(void);
int smbus_read_byte(unsigned int device, unsigned int address);
void aseg_smm_lock(void);