coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
early_init.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <bootblock_common.h>
4 #include <stdint.h>
5 #include <arch/io.h>
6 #include <cf9_reset.h>
7 #include <device/pnp_ops.h>
8 #include <device/pci_ops.h>
9 #include <device/pci_def.h>
10 #include <option.h>
14 
15 /* Override the default lpc decode ranges */
17 {
18  int lpt_en = 0;
19 
20  if (get_uint_option("lpt", 0))
21  lpt_en = LPT_LPC_EN; /* enable LPT */
22 
23  pci_write_config16(PCI_DEV(0, 0x1f, 0), LPC_IO_DEC, 0x0007);
24 
25  pci_update_config16(PCI_DEV(0, 0x1f, 0), LPC_EN, ~LPT_LPC_EN, lpt_en);
26 }
27 
28 /* This box has two superios, so enabling serial becomes slightly excessive.
29  * We disable a lot of stuff to make sure that there are no conflicts between
30  * the two. Also set up the GPIOs from the beginning. This is the "no schematic
31  * but safe anyways" method.
32  */
33 
35 {
36  const pnp_devfn_t dev = PNP_DEV(0x2e, 0x00);
37 
39  pnp_write_config(dev, 0x01, 0x94); /* Extended Parport modes */
40  pnp_write_config(dev, 0x02, 0x88); /* UART power on */
41  pnp_write_config(dev, 0x03, 0x72); /* Floppy */
42  pnp_write_config(dev, 0x04, 0x01); /* EPP + SPP */
43  pnp_write_config(dev, 0x14, 0x03); /* Floppy */
44  pnp_write_config(dev, 0x20, (0x3f0 >> 2)); /* Floppy */
45  pnp_write_config(dev, 0x23, (0x378 >> 2)); /* PP base */
46  pnp_write_config(dev, 0x24, (0x3f8 >> 2)); /* UART1 base */
47  pnp_write_config(dev, 0x25, (0x2f8 >> 2)); /* UART2 base */
48  pnp_write_config(dev, 0x26, (2 << 4) | 0); /* FDC + PP DMA */
49  pnp_write_config(dev, 0x27, (6 << 4) | 7); /* FDC + PP DMA */
50  pnp_write_config(dev, 0x28, (4 << 4) | 3); /* UART1,2 IRQ */
51  /* These are the SMI status registers in the SIO: */
52  pnp_write_config(dev, 0x30, (0x600 >> 4)); /* Runtime Register Block Base */
53 
54  pnp_write_config(dev, 0x31, 0x00); /* GPIO1 DIR */
55  pnp_write_config(dev, 0x32, 0x00); /* GPIO1 POL */
56  pnp_write_config(dev, 0x33, 0x40); /* GPIO2 DIR */
57  pnp_write_config(dev, 0x34, 0x00); /* GPIO2 POL */
58  pnp_write_config(dev, 0x35, 0xff); /* GPIO3 DIR */
59  pnp_write_config(dev, 0x36, 0x00); /* GPIO3 POL */
60  pnp_write_config(dev, 0x37, 0xe0); /* GPIO4 DIR */
61  pnp_write_config(dev, 0x38, 0x00); /* GPIO4 POL */
62  pnp_write_config(dev, 0x39, 0x80); /* GPIO4 POL */
63 
65 }
66 
68 {
69  /* Device 1f interrupt pin register */
70  RCBA32(D31IP) = 0x00042220;
71 
72  /* dev irq route register */
73  RCBA16(D31IR) = 0x0232;
74  RCBA16(D30IR) = 0x3246;
75  RCBA16(D29IR) = 0x0237;
76  RCBA16(D28IR) = 0x3201;
77  RCBA16(D27IR) = 0x3216;
78 
79  /* Disable unused devices */
80  RCBA32(FD) |= FD_INTLAN;
81 
82  /* This should probably go into the ACPI OS Init trap */
83 
84  /* Set up I/O Trap #0 for 0xfe00 (SMIC) */
85  RCBA32(0x1e84) = 0x00020001;
86  RCBA32(0x1e80) = 0x0000fe01;
87 
88  /* Set up I/O Trap #3 for 0x800-0x80c (Trap) */
89  RCBA32(0x1e9c) = 0x000200f0;
90  RCBA32(0x1e98) = 0x000c0801;
91 }
92 
93 static void init_artec_dongle(void)
94 {
95  /* Enable 4MB decoding */
96  outb(0xf1, 0x88);
97  outb(0xf4, 0x88);
98 }
99 
100 void mainboard_pre_raminit_config(int s3_resume)
101 {
103 }
void outb(u8 val, u16 port)
#define FD_INTLAN
Definition: i82801gx.h:248
static __always_inline void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Definition: pci_ops.h:70
static __always_inline void pci_update_config16(const struct device *dev, u16 reg, u16 mask, u16 or)
Definition: pci_ops.h:104
void bootblock_mainboard_early_init(void)
Definition: early_init.c:11
void mainboard_late_rcba_config(void)
Definition: early_init.c:6
void mainboard_pre_raminit_config(int s3_resume)
Definition: early_init.c:85
void mainboard_lpc_decode(void)
Definition: early_init.c:34
static void init_artec_dongle(void)
Definition: early_init.c:93
unsigned int get_uint_option(const char *name, const unsigned int fallback)
Definition: option.c:116
#define PCI_DEV(SEGBUS, DEV, FN)
Definition: pci_type.h:14
void pnp_write_config(struct device *dev, u8 reg, u8 value)
Definition: pnp_device.c:38
#define PNP_DEV(PORT, FUNC)
Definition: pnp_type.h:10
u32 pnp_devfn_t
Definition: pnp_type.h:8
#define LPT_LPC_EN
Definition: lpc.h:44
#define LPC_IO_DEC
Definition: lpc.h:35
#define LPC_EN
Definition: lpc.h:36
#define D31IR
Definition: rcba.h:87
#define D30IR
Definition: rcba.h:88
#define D28IR
Definition: rcba.h:90
#define D31IP
Definition: rcba.h:56
#define D29IR
Definition: rcba.h:89
#define FD
Definition: rcba.h:125
#define D27IR
Definition: rcba.h:91
#define RCBA16(x)
Definition: rcba.h:13
#define RCBA32(x)
Definition: rcba.h:14
void pnp_exit_conf_state(pnp_devfn_t dev)
Definition: early_init.c:40
void pnp_enter_conf_state(pnp_devfn_t dev)
Definition: early_init.c:32