sb/intel/lynxpoint: Move IOBP API to its own compilation unit
Change-Id: Icb6114302cebe19bc3c1971929ea4fc085b454be Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/41946 Reviewed-by: Michael Niewöhner Reviewed-by: Felix Held <felix-coreboot@felixheld.de> Reviewed-by: Jonathan Kollasch <jakllsch@kollasch.net> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
19c5cd210d
commit
2178b7286b
|
@ -5,6 +5,7 @@ ifeq ($(CONFIG_SOUTHBRIDGE_INTEL_LYNXPOINT),y)
|
||||||
bootblock-y += bootblock.c
|
bootblock-y += bootblock.c
|
||||||
|
|
||||||
ramstage-y += pch.c
|
ramstage-y += pch.c
|
||||||
|
ramstage-y += iobp.c
|
||||||
ramstage-y += azalia.c
|
ramstage-y += azalia.c
|
||||||
ramstage-y += fadt.c
|
ramstage-y += fadt.c
|
||||||
ramstage-y += lpc.c
|
ramstage-y += lpc.c
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#include <console/console.h>
|
||||||
|
#include <delay.h>
|
||||||
|
#include "pch.h"
|
||||||
|
#include "iobp.h"
|
||||||
|
|
||||||
|
#define IOBP_RETRY 1000
|
||||||
|
|
||||||
|
static inline int iobp_poll(void)
|
||||||
|
{
|
||||||
|
unsigned int try;
|
||||||
|
|
||||||
|
for (try = IOBP_RETRY; try > 0; try--) {
|
||||||
|
u16 status = RCBA16(IOBPS);
|
||||||
|
if ((status & IOBPS_READY) == 0)
|
||||||
|
return 1;
|
||||||
|
udelay(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(BIOS_ERR, "IOBP: timeout waiting for transaction to complete\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 pch_iobp_read(u32 address)
|
||||||
|
{
|
||||||
|
u16 status;
|
||||||
|
|
||||||
|
if (!iobp_poll())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Set the address */
|
||||||
|
RCBA32(IOBPIRI) = address;
|
||||||
|
|
||||||
|
/* READ OPCODE */
|
||||||
|
status = RCBA16(IOBPS);
|
||||||
|
status &= ~IOBPS_MASK;
|
||||||
|
status |= IOBPS_READ;
|
||||||
|
RCBA16(IOBPS) = status;
|
||||||
|
|
||||||
|
/* Undocumented magic */
|
||||||
|
RCBA16(IOBPU) = IOBPU_MAGIC;
|
||||||
|
|
||||||
|
/* Set ready bit */
|
||||||
|
status = RCBA16(IOBPS);
|
||||||
|
status |= IOBPS_READY;
|
||||||
|
RCBA16(IOBPS) = status;
|
||||||
|
|
||||||
|
if (!iobp_poll())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Check for successful transaction */
|
||||||
|
status = RCBA16(IOBPS);
|
||||||
|
if (status & IOBPS_TX_MASK) {
|
||||||
|
printk(BIOS_ERR, "IOBP: read 0x%08x failed\n", address);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read IOBP data */
|
||||||
|
return RCBA32(IOBPD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pch_iobp_write(u32 address, u32 data)
|
||||||
|
{
|
||||||
|
u16 status;
|
||||||
|
|
||||||
|
if (!iobp_poll())
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Set the address */
|
||||||
|
RCBA32(IOBPIRI) = address;
|
||||||
|
|
||||||
|
/* WRITE OPCODE */
|
||||||
|
status = RCBA16(IOBPS);
|
||||||
|
status &= ~IOBPS_MASK;
|
||||||
|
status |= IOBPS_WRITE;
|
||||||
|
RCBA16(IOBPS) = status;
|
||||||
|
|
||||||
|
RCBA32(IOBPD) = data;
|
||||||
|
|
||||||
|
/* Undocumented magic */
|
||||||
|
RCBA16(IOBPU) = IOBPU_MAGIC;
|
||||||
|
|
||||||
|
/* Set ready bit */
|
||||||
|
status = RCBA16(IOBPS);
|
||||||
|
status |= IOBPS_READY;
|
||||||
|
RCBA16(IOBPS) = status;
|
||||||
|
|
||||||
|
if (!iobp_poll())
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Check for successful transaction */
|
||||||
|
status = RCBA16(IOBPS);
|
||||||
|
if (status & IOBPS_TX_MASK) {
|
||||||
|
printk(BIOS_ERR, "IOBP: write 0x%08x failed\n", address);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(BIOS_INFO, "IOBP: set 0x%08x to 0x%08x\n", address, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue)
|
||||||
|
{
|
||||||
|
u32 data = pch_iobp_read(address);
|
||||||
|
|
||||||
|
/* Update the data */
|
||||||
|
data &= andvalue;
|
||||||
|
data |= orvalue;
|
||||||
|
|
||||||
|
pch_iobp_write(address, data);
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#ifndef SOUTHBRIDGE_INTEL_LYNXPOINT_IOBP_H
|
||||||
|
#define SOUTHBRIDGE_INTEL_LYNXPOINT_IOBP_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
u32 pch_iobp_read(u32 address);
|
||||||
|
void pch_iobp_write(u32 address, u32 data);
|
||||||
|
void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue);
|
||||||
|
|
||||||
|
#endif
|
|
@ -16,6 +16,7 @@
|
||||||
#include <cbmem.h>
|
#include <cbmem.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
#include "iobp.h"
|
||||||
#include "nvs.h"
|
#include "nvs.h"
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
#include <acpi/acpigen.h>
|
#include <acpi/acpigen.h>
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
#include <device/pci.h>
|
#include <device/pci.h>
|
||||||
#include <device/pci_def.h>
|
#include <device/pci_def.h>
|
||||||
|
#include "iobp.h"
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
|
|
||||||
#ifdef __SIMPLE_DEVICE__
|
#ifdef __SIMPLE_DEVICE__
|
||||||
|
@ -183,110 +184,6 @@ void pch_disable_devfn(struct device *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define IOBP_RETRY 1000
|
|
||||||
static inline int iobp_poll(void)
|
|
||||||
{
|
|
||||||
unsigned int try;
|
|
||||||
|
|
||||||
for (try = IOBP_RETRY; try > 0; try--) {
|
|
||||||
u16 status = RCBA16(IOBPS);
|
|
||||||
if ((status & IOBPS_READY) == 0)
|
|
||||||
return 1;
|
|
||||||
udelay(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
printk(BIOS_ERR, "IOBP: timeout waiting for transaction to complete\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 pch_iobp_read(u32 address)
|
|
||||||
{
|
|
||||||
u16 status;
|
|
||||||
|
|
||||||
if (!iobp_poll())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Set the address */
|
|
||||||
RCBA32(IOBPIRI) = address;
|
|
||||||
|
|
||||||
/* READ OPCODE */
|
|
||||||
status = RCBA16(IOBPS);
|
|
||||||
status &= ~IOBPS_MASK;
|
|
||||||
status |= IOBPS_READ;
|
|
||||||
RCBA16(IOBPS) = status;
|
|
||||||
|
|
||||||
/* Undocumented magic */
|
|
||||||
RCBA16(IOBPU) = IOBPU_MAGIC;
|
|
||||||
|
|
||||||
/* Set ready bit */
|
|
||||||
status = RCBA16(IOBPS);
|
|
||||||
status |= IOBPS_READY;
|
|
||||||
RCBA16(IOBPS) = status;
|
|
||||||
|
|
||||||
if (!iobp_poll())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Check for successful transaction */
|
|
||||||
status = RCBA16(IOBPS);
|
|
||||||
if (status & IOBPS_TX_MASK) {
|
|
||||||
printk(BIOS_ERR, "IOBP: read 0x%08x failed\n", address);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read IOBP data */
|
|
||||||
return RCBA32(IOBPD);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pch_iobp_write(u32 address, u32 data)
|
|
||||||
{
|
|
||||||
u16 status;
|
|
||||||
|
|
||||||
if (!iobp_poll())
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Set the address */
|
|
||||||
RCBA32(IOBPIRI) = address;
|
|
||||||
|
|
||||||
/* WRITE OPCODE */
|
|
||||||
status = RCBA16(IOBPS);
|
|
||||||
status &= ~IOBPS_MASK;
|
|
||||||
status |= IOBPS_WRITE;
|
|
||||||
RCBA16(IOBPS) = status;
|
|
||||||
|
|
||||||
RCBA32(IOBPD) = data;
|
|
||||||
|
|
||||||
/* Undocumented magic */
|
|
||||||
RCBA16(IOBPU) = IOBPU_MAGIC;
|
|
||||||
|
|
||||||
/* Set ready bit */
|
|
||||||
status = RCBA16(IOBPS);
|
|
||||||
status |= IOBPS_READY;
|
|
||||||
RCBA16(IOBPS) = status;
|
|
||||||
|
|
||||||
if (!iobp_poll())
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Check for successful transaction */
|
|
||||||
status = RCBA16(IOBPS);
|
|
||||||
if (status & IOBPS_TX_MASK) {
|
|
||||||
printk(BIOS_ERR, "IOBP: write 0x%08x failed\n", address);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
printk(BIOS_INFO, "IOBP: set 0x%08x to 0x%08x\n", address, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue)
|
|
||||||
{
|
|
||||||
u32 data = pch_iobp_read(address);
|
|
||||||
|
|
||||||
/* Update the data */
|
|
||||||
data &= andvalue;
|
|
||||||
data |= orvalue;
|
|
||||||
|
|
||||||
pch_iobp_write(address, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pch_enable(struct device *dev)
|
void pch_enable(struct device *dev)
|
||||||
{
|
{
|
||||||
/* PCH PCIe Root Ports are handled in PCIe driver. */
|
/* PCH PCIe Root Ports are handled in PCIe driver. */
|
||||||
|
|
|
@ -115,9 +115,6 @@ void disable_gpe(u32 mask);
|
||||||
|
|
||||||
void pch_enable(struct device *dev);
|
void pch_enable(struct device *dev);
|
||||||
void pch_disable_devfn(struct device *dev);
|
void pch_disable_devfn(struct device *dev);
|
||||||
u32 pch_iobp_read(u32 address);
|
|
||||||
void pch_iobp_write(u32 address, u32 data);
|
|
||||||
void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue);
|
|
||||||
void pch_log_state(void);
|
void pch_log_state(void);
|
||||||
void acpi_create_intel_hpet(acpi_hpet_t * hpet);
|
void acpi_create_intel_hpet(acpi_hpet_t * hpet);
|
||||||
void acpi_create_serialio_ssdt(acpi_header_t *ssdt);
|
void acpi_create_serialio_ssdt(acpi_header_t *ssdt);
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <device/pciexp.h>
|
#include <device/pciexp.h>
|
||||||
#include <device/pci_ids.h>
|
#include <device/pci_ids.h>
|
||||||
#include <device/pci_ops.h>
|
#include <device/pci_ops.h>
|
||||||
|
#include "iobp.h"
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
#include <southbridge/intel/common/gpio.h>
|
#include <southbridge/intel/common/gpio.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <device/pci_ids.h>
|
#include <device/pci_ids.h>
|
||||||
#include <delay.h>
|
#include <delay.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
#include "iobp.h"
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
|
|
||||||
typedef struct southbridge_intel_lynxpoint_config config_t;
|
typedef struct southbridge_intel_lynxpoint_config config_t;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <device/pci.h>
|
#include <device/pci.h>
|
||||||
#include <device/pci_ids.h>
|
#include <device/pci_ids.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
#include "iobp.h"
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
#include "nvs.h"
|
#include "nvs.h"
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <device/pci_ehci.h>
|
#include <device/pci_ehci.h>
|
||||||
#include <device/mmio.h>
|
#include <device/mmio.h>
|
||||||
#include <device/pci_ops.h>
|
#include <device/pci_ops.h>
|
||||||
|
#include "iobp.h"
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
|
|
||||||
#ifdef __SIMPLE_DEVICE__
|
#ifdef __SIMPLE_DEVICE__
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <device/mmio.h>
|
#include <device/mmio.h>
|
||||||
#include <device/pci_ops.h>
|
#include <device/pci_ops.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
#include "iobp.h"
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
|
|
||||||
typedef struct southbridge_intel_lynxpoint_config config_t;
|
typedef struct southbridge_intel_lynxpoint_config config_t;
|
||||||
|
|
Loading…
Reference in New Issue