sb/intel/bd82x6x/pch.c: Extract common functions
PCH identification functions and `pch_iobp_update` are used in multiple stages. Move them out of `pch.c` to drop some ugly preprocessor usage. Subsequent commits will use `pch_iobp_update` in romstage as well. Change-Id: I8d33338a4f74fd03c8f99f8fcece99b63c28adab Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/79624 Reviewed-by: Naresh <naresh.solanki.2011@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
f733703a61
commit
b44923969c
|
@ -7,6 +7,7 @@ bootblock-y += early_pch.c
|
||||||
|
|
||||||
ramstage-y += pch.c
|
ramstage-y += pch.c
|
||||||
ramstage-y += azalia.c
|
ramstage-y += azalia.c
|
||||||
|
ramstage-y += common.c
|
||||||
ramstage-y += fadt.c
|
ramstage-y += fadt.c
|
||||||
ramstage-y += lpc.c
|
ramstage-y += lpc.c
|
||||||
ramstage-y += pci.c
|
ramstage-y += pci.c
|
||||||
|
@ -24,8 +25,9 @@ ramstage-y += me_status.c
|
||||||
|
|
||||||
ramstage-$(CONFIG_ELOG) += elog.c
|
ramstage-$(CONFIG_ELOG) += elog.c
|
||||||
|
|
||||||
smm-y += smihandler.c me_smm.c pch.c me_common.c
|
smm-y += common.c smihandler.c me_smm.c me_common.c
|
||||||
|
|
||||||
|
romstage-y += common.c
|
||||||
romstage-y += me_status.c
|
romstage-y += me_status.c
|
||||||
romstage-y += early_rcba.c
|
romstage-y += early_rcba.c
|
||||||
romstage-y += early_pch.c
|
romstage-y += early_pch.c
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#define __SIMPLE_DEVICE__
|
||||||
|
|
||||||
|
#include <console/console.h>
|
||||||
|
#include <delay.h>
|
||||||
|
#include <device/pci.h>
|
||||||
|
#include <device/pci_def.h>
|
||||||
|
#include <device/pci_ids.h>
|
||||||
|
#include <device/pci_ops.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "pch.h"
|
||||||
|
|
||||||
|
int pch_silicon_revision(void)
|
||||||
|
{
|
||||||
|
static int pch_revision_id = -1;
|
||||||
|
|
||||||
|
if (pch_revision_id < 0)
|
||||||
|
pch_revision_id = pci_read_config8(PCH_LPC_DEV, PCI_REVISION_ID);
|
||||||
|
|
||||||
|
return pch_revision_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pch_silicon_type(void)
|
||||||
|
{
|
||||||
|
static int pch_type = -1;
|
||||||
|
|
||||||
|
if (pch_type < 0)
|
||||||
|
pch_type = pci_read_config8(PCH_LPC_DEV, PCI_DEVICE_ID + 1);
|
||||||
|
|
||||||
|
return pch_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pch_silicon_supported(int type, int rev)
|
||||||
|
{
|
||||||
|
int cur_type = pch_silicon_type();
|
||||||
|
int cur_rev = pch_silicon_revision();
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case PCH_TYPE_CPT:
|
||||||
|
/* CougarPoint minimum revision */
|
||||||
|
if (cur_type == PCH_TYPE_CPT && cur_rev >= rev)
|
||||||
|
return 1;
|
||||||
|
/* PantherPoint any revision */
|
||||||
|
if (cur_type == PCH_TYPE_PPT)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCH_TYPE_PPT:
|
||||||
|
/* PantherPoint minimum revision */
|
||||||
|
if (cur_type == PCH_TYPE_PPT && cur_rev >= rev)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define IOBP_RETRY 1000
|
||||||
|
static inline int iobp_poll(void)
|
||||||
|
{
|
||||||
|
unsigned int try = IOBP_RETRY;
|
||||||
|
u32 data;
|
||||||
|
|
||||||
|
while (try--) {
|
||||||
|
data = RCBA32(IOBPS);
|
||||||
|
if ((data & 1) == 0)
|
||||||
|
return 1;
|
||||||
|
udelay(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(BIOS_ERR, "IOBP timeout\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue)
|
||||||
|
{
|
||||||
|
u32 data;
|
||||||
|
|
||||||
|
/* Set the address */
|
||||||
|
RCBA32(IOBPIRI) = address;
|
||||||
|
|
||||||
|
/* READ OPCODE */
|
||||||
|
if (pch_silicon_supported(PCH_TYPE_CPT, PCH_STEP_B0))
|
||||||
|
RCBA32(IOBPS) = IOBPS_RW_BX;
|
||||||
|
else
|
||||||
|
RCBA32(IOBPS) = IOBPS_READ_AX;
|
||||||
|
if (!iobp_poll())
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Read IOBP data */
|
||||||
|
data = RCBA32(IOBPD);
|
||||||
|
if (!iobp_poll())
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Check for successful transaction */
|
||||||
|
if ((RCBA32(IOBPS) & 0x6) != 0) {
|
||||||
|
printk(BIOS_ERR, "IOBP read 0x%08x failed\n", address);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update the data */
|
||||||
|
data &= andvalue;
|
||||||
|
data |= orvalue;
|
||||||
|
|
||||||
|
/* WRITE OPCODE */
|
||||||
|
if (pch_silicon_supported(PCH_TYPE_CPT, PCH_STEP_B0))
|
||||||
|
RCBA32(IOBPS) = IOBPS_RW_BX;
|
||||||
|
else
|
||||||
|
RCBA32(IOBPS) = IOBPS_WRITE_AX;
|
||||||
|
if (!iobp_poll())
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Write IOBP data */
|
||||||
|
RCBA32(IOBPD) = data;
|
||||||
|
if (!iobp_poll())
|
||||||
|
return;
|
||||||
|
}
|
|
@ -11,123 +11,6 @@
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
|
|
||||||
int pch_silicon_revision(void)
|
|
||||||
{
|
|
||||||
static int pch_revision_id = -1;
|
|
||||||
|
|
||||||
#ifdef __SIMPLE_DEVICE__
|
|
||||||
pci_devfn_t dev = PCI_DEV(0, 0x1f, 0);
|
|
||||||
#else
|
|
||||||
struct device *dev = pcidev_on_root(0x1f, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (pch_revision_id < 0)
|
|
||||||
pch_revision_id = pci_read_config8(dev, PCI_REVISION_ID);
|
|
||||||
return pch_revision_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pch_silicon_type(void)
|
|
||||||
{
|
|
||||||
static int pch_type = -1;
|
|
||||||
|
|
||||||
#ifdef __SIMPLE_DEVICE__
|
|
||||||
pci_devfn_t dev = PCI_DEV(0, 0x1f, 0);
|
|
||||||
#else
|
|
||||||
struct device *dev = pcidev_on_root(0x1f, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (pch_type < 0)
|
|
||||||
pch_type = pci_read_config8(dev, PCI_DEVICE_ID + 1);
|
|
||||||
return pch_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int pch_silicon_supported(int type, int rev)
|
|
||||||
{
|
|
||||||
int cur_type = pch_silicon_type();
|
|
||||||
int cur_rev = pch_silicon_revision();
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case PCH_TYPE_CPT:
|
|
||||||
/* CougarPoint minimum revision */
|
|
||||||
if (cur_type == PCH_TYPE_CPT && cur_rev >= rev)
|
|
||||||
return 1;
|
|
||||||
/* PantherPoint any revision */
|
|
||||||
if (cur_type == PCH_TYPE_PPT)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCH_TYPE_PPT:
|
|
||||||
/* PantherPoint minimum revision */
|
|
||||||
if (cur_type == PCH_TYPE_PPT && cur_rev >= rev)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define IOBP_RETRY 1000
|
|
||||||
static inline int iobp_poll(void)
|
|
||||||
{
|
|
||||||
unsigned int try = IOBP_RETRY;
|
|
||||||
u32 data;
|
|
||||||
|
|
||||||
while (try--) {
|
|
||||||
data = RCBA32(IOBPS);
|
|
||||||
if ((data & 1) == 0)
|
|
||||||
return 1;
|
|
||||||
udelay(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
printk(BIOS_ERR, "IOBP timeout\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue)
|
|
||||||
{
|
|
||||||
u32 data;
|
|
||||||
|
|
||||||
/* Set the address */
|
|
||||||
RCBA32(IOBPIRI) = address;
|
|
||||||
|
|
||||||
/* READ OPCODE */
|
|
||||||
if (pch_silicon_supported(PCH_TYPE_CPT, PCH_STEP_B0))
|
|
||||||
RCBA32(IOBPS) = IOBPS_RW_BX;
|
|
||||||
else
|
|
||||||
RCBA32(IOBPS) = IOBPS_READ_AX;
|
|
||||||
if (!iobp_poll())
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Read IOBP data */
|
|
||||||
data = RCBA32(IOBPD);
|
|
||||||
if (!iobp_poll())
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Check for successful transaction */
|
|
||||||
if ((RCBA32(IOBPS) & 0x6) != 0) {
|
|
||||||
printk(BIOS_ERR, "IOBP read 0x%08x failed\n", address);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update the data */
|
|
||||||
data &= andvalue;
|
|
||||||
data |= orvalue;
|
|
||||||
|
|
||||||
/* WRITE OPCODE */
|
|
||||||
if (pch_silicon_supported(PCH_TYPE_CPT, PCH_STEP_B0))
|
|
||||||
RCBA32(IOBPS) = IOBPS_RW_BX;
|
|
||||||
else
|
|
||||||
RCBA32(IOBPS) = IOBPS_WRITE_AX;
|
|
||||||
if (!iobp_poll())
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Write IOBP data */
|
|
||||||
RCBA32(IOBPD) = data;
|
|
||||||
if (!iobp_poll())
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef __SIMPLE_DEVICE__
|
|
||||||
/* Set bit in function disable register to hide this device */
|
/* Set bit in function disable register to hide this device */
|
||||||
static void pch_hide_devfn(unsigned int devfn)
|
static void pch_hide_devfn(unsigned int devfn)
|
||||||
{
|
{
|
||||||
|
@ -478,4 +361,3 @@ struct chip_operations southbridge_intel_bd82x6x_ops = {
|
||||||
CHIP_NAME("Intel Series 6/7 (Cougar Point/Panther Point) Southbridge")
|
CHIP_NAME("Intel Series 6/7 (Cougar Point/Panther Point) Southbridge")
|
||||||
.enable_dev = pch_enable,
|
.enable_dev = pch_enable,
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
int pch_silicon_revision(void);
|
int pch_silicon_revision(void);
|
||||||
int pch_silicon_type(void);
|
int pch_silicon_type(void);
|
||||||
|
int pch_silicon_supported(int type, int rev);
|
||||||
void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue);
|
void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue);
|
||||||
|
|
||||||
void enable_usb_bar(void);
|
void enable_usb_bar(void);
|
||||||
|
|
Loading…
Reference in New Issue