coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
ide.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <device/device.h>
5 #include <device/pci.h>
6 #include <device/pci_ops.h>
7 #include <device/pci_ids.h>
8 #include "chip.h"
9 #include "i82801gx.h"
10 
11 static void ide_init(struct device *dev)
12 {
13  u16 ideTimingConfig;
14  u32 reg32;
15  u32 enable_primary, enable_secondary;
16 
17  /* Get the chip configuration */
19 
20  printk(BIOS_DEBUG, "i82801gx_ide: initializing...");
21  if (config == NULL) {
22  printk(BIOS_ERR, "\ni82801gx_ide: Not mentioned in devicetree.cb!\n");
23  // Trying to set somewhat safe defaults instead of bailing out.
24  enable_primary = enable_secondary = 1;
25  } else {
26  enable_primary = config->ide_enable_primary;
27  enable_secondary = config->ide_enable_secondary;
28  }
29 
31 
32  /* Native Capable, but not enabled. */
33  pci_write_config8(dev, 0x09, 0x8a);
34 
35  ideTimingConfig = pci_read_config16(dev, IDE_TIM_PRI);
36  ideTimingConfig &= ~IDE_DECODE_ENABLE;
37  ideTimingConfig |= IDE_SITRE;
38  if (enable_primary) {
39  /* Enable primary IDE interface. */
40  ideTimingConfig |= IDE_DECODE_ENABLE;
41  ideTimingConfig |= IDE_ISP_3_CLOCKS;
42  ideTimingConfig |= IDE_RCT_1_CLOCKS;
43  ideTimingConfig |= IDE_IE0;
44  ideTimingConfig |= IDE_TIME0; // TIME0
45  printk(BIOS_DEBUG, " IDE0");
46  }
47  pci_write_config16(dev, IDE_TIM_PRI, ideTimingConfig);
48 
49  ideTimingConfig = pci_read_config16(dev, IDE_TIM_SEC);
50  ideTimingConfig &= ~IDE_DECODE_ENABLE;
51  ideTimingConfig |= IDE_SITRE;
52  if (enable_secondary) {
53  /* Enable secondary IDE interface. */
54  ideTimingConfig |= IDE_DECODE_ENABLE;
55  ideTimingConfig |= IDE_ISP_3_CLOCKS;
56  ideTimingConfig |= IDE_RCT_1_CLOCKS;
57  ideTimingConfig |= IDE_IE0;
58  ideTimingConfig |= IDE_TIME0;
59  printk(BIOS_DEBUG, " IDE1");
60  }
61  pci_write_config16(dev, IDE_TIM_SEC, ideTimingConfig);
62 
63  /* Set IDE I/O Configuration */
64  reg32 = 0;
65  /* FIXME: only set FAST_* for ata/100, only ?CBx for ata/66 */
66  if (enable_primary)
68  if (enable_secondary)
70  pci_write_config32(dev, IDE_CONFIG, reg32);
71 
72  /* Set Interrupt Line */
73  /* Interrupt Pin is set by D31IP.PIP */
74  pci_write_config32(dev, INTR_LN, 0xff); /* Int 15 */
75 
76  printk(BIOS_DEBUG, "\n");
77 }
78 
79 static struct device_operations ide_ops = {
81  .set_resources = pci_dev_set_resources,
82  .enable_resources = pci_dev_enable_resources,
83  .init = ide_init,
84  .enable = i82801gx_enable,
85  .ops_pci = &pci_dev_ops_pci,
86 };
87 
88 /* 82801GB/GR/GDH/GBM/GHM/GU (ICH7/ICH7R/ICH7DH/ICH7-M/ICH7-M DH/ICH7-U) */
89 static const struct pci_driver i82801gx_ide __pci_driver = {
90  .ops = &ide_ops,
91  .vendor = PCI_VID_INTEL,
92  .device = 0x27df,
93 };
#define printk(level,...)
Definition: stdlib.h:16
void i82801gx_enable(struct device *dev)
Definition: i82801gx.c:54
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline void pci_or_config16(const struct device *dev, u16 reg, u16 ormask)
Definition: pci_ops.h:180
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
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_write_config8(const struct device *dev, u16 reg, u8 val)
Definition: pci_ops.h:64
static struct device_operations ide_ops
Definition: ide.c:79
static void ide_init(struct device *dev)
Definition: ide.c:11
static const struct pci_driver i82801gx_ide __pci_driver
Definition: ide.c:89
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
enum board_config config
Definition: memory.c:448
#define PCI_COMMAND_IO
Definition: pci_def.h:11
#define PCI_COMMAND_MASTER
Definition: pci_def.h:13
#define PCI_COMMAND
Definition: pci_def.h:10
void pci_dev_enable_resources(struct device *dev)
Definition: pci_device.c:721
void pci_dev_read_resources(struct device *dev)
Definition: pci_device.c:534
struct pci_operations pci_dev_ops_pci
Default device operation for PCI devices.
Definition: pci_device.c:911
void pci_dev_set_resources(struct device *dev)
Definition: pci_device.c:691
#define PCI_VID_INTEL
Definition: pci_ids.h:2157
#define IDE_TIM_PRI
Definition: sata.h:34
#define SIG_MODE_SEC_NORMAL
Definition: sata.h:63
#define PCB0
Definition: sata.h:76
#define INTR_LN
Definition: sata.h:33
#define IDE_TIME0
Definition: sata.h:51
#define SCB0
Definition: sata.h:74
#define IDE_CONFIG
Definition: sata.h:62
#define PCB1
Definition: sata.h:75
#define IDE_ISP_3_CLOCKS
Definition: sata.h:39
#define SIG_MODE_PRI_NORMAL
Definition: sata.h:66
#define IDE_SITRE
Definition: sata.h:36
#define IDE_RCT_1_CLOCKS
Definition: sata.h:43
#define IDE_TIM_SEC
Definition: sata.h:52
#define IDE_IE0
Definition: sata.h:50
#define IDE_DECODE_ENABLE
Definition: sata.h:35
#define FAST_PCB0
Definition: sata.h:72
#define FAST_SCB1
Definition: sata.h:69
#define FAST_PCB1
Definition: sata.h:71
#define SCB1
Definition: sata.h:73
#define FAST_SCB0
Definition: sata.h:70
#define NULL
Definition: stddef.h:19
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
void(* read_resources)(struct device *dev)
Definition: device.h:39
Definition: device.h:107
DEVTREE_CONST void * chip_info
Definition: device.h:164