coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
pcix_device.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/pcix.h>
8 
9 static void pcix_tune_dev(struct device *dev)
10 {
11  u32 status;
12  u16 orig_cmd, cmd;
13  unsigned int cap, max_read, max_tran;
14 
15  if (dev->hdr_type != PCI_HEADER_TYPE_NORMAL)
16  return;
17 
19  if (!cap)
20  return;
21 
22  printk(BIOS_DEBUG, "%s PCI-X tuning\n", dev_path(dev));
23 
24  status = pci_read_config32(dev, cap + PCI_X_STATUS);
25  orig_cmd = cmd = pci_read_config16(dev, cap + PCI_X_CMD);
26 
27  max_read = (status & PCI_X_STATUS_MAX_READ) >> 21;
28  max_tran = (status & PCI_X_STATUS_MAX_SPLIT) >> 23;
29  if (max_read != ((cmd & PCI_X_CMD_MAX_READ) >> 2)) {
30  cmd &= ~PCI_X_CMD_MAX_READ;
31  cmd |= max_read << 2;
32  }
33  if (max_tran != ((cmd & PCI_X_CMD_MAX_SPLIT) >> 4)) {
34  cmd &= ~PCI_X_CMD_MAX_SPLIT;
35  cmd |= max_tran << 4;
36  }
37 
38  /* Don't attempt to handle PCI-X errors. */
39  cmd &= ~PCI_X_CMD_DPERR_E;
40 
41  /* Enable relaxed ordering. */
42  cmd |= PCI_X_CMD_ERO;
43 
44  if (orig_cmd != cmd)
45  pci_write_config16(dev, cap + PCI_X_CMD, cmd);
46 }
47 
48 static void pcix_tune_bus(struct bus *bus)
49 {
50  struct device *child;
51 
52  for (child = bus->children; child; child = child->sibling)
53  pcix_tune_dev(child);
54 }
55 
56 const char *pcix_speed(u16 sstatus)
57 {
58  static const char conventional[] = "Conventional PCI";
59  static const char pcix_66mhz[] = "66MHz PCI-X";
60  static const char pcix_100mhz[] = "100MHz PCI-X";
61  static const char pcix_133mhz[] = "133MHz PCI-X";
62  static const char pcix_266mhz[] = "266MHz PCI-X";
63  static const char pcix_533mhz[] = "533MHZ PCI-X";
64  static const char unknown[] = "Unknown";
65  const char *result;
66 
67  result = unknown;
68 
69  switch (PCI_X_SSTATUS_MFREQ(sstatus)) {
71  result = conventional;
72  break;
74  result = pcix_66mhz;
75  break;
77  result = pcix_100mhz;
78  break;
80  result = pcix_133mhz;
81  break;
85  result = pcix_266mhz;
86  break;
90  result = pcix_533mhz;
91  break;
92  }
93 
94  return result;
95 }
96 
97 void pcix_scan_bridge(struct device *dev)
98 {
99  unsigned int pos;
100  u16 sstatus;
101 
103 
104  /* Find the PCI-X capability. */
106  sstatus = pci_read_config16(dev, pos + PCI_X_SEC_STATUS);
107 
109  pcix_tune_bus(dev->link_list);
110 
111  /* Print the PCI-X bus speed. */
112  printk(BIOS_DEBUG, "PCI: %02x: %s\n", dev->link_list->secondary,
113  pcix_speed(sstatus));
114 }
115 
116 /** Default device operations for PCI-X bridges */
117 static struct pci_operations pcix_bus_ops_pci = {
118  .set_subsystem = 0,
119 };
120 
123  .set_resources = pci_dev_set_resources,
124  .enable_resources = pci_bus_enable_resources,
125  .scan_bus = pcix_scan_bridge,
126  .reset_bus = pci_bus_reset,
127  .ops_pci = &pcix_bus_ops_pci,
128 };
#define printk(level,...)
Definition: stdlib.h:16
const char * dev_path(const struct device *dev)
Definition: device_util.c:149
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
static __always_inline u16 pci_find_capability(const struct device *dev, u16 cap)
Definition: pci_ops.h:207
static __always_inline u32 pci_read_config32(const struct device *dev, u16 reg)
Definition: pci_ops.h:58
static __always_inline void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Definition: pci_ops.h:70
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
result
Definition: mrc_cache.c:35
#define PCI_X_CMD
Definition: pci_def.h:324
#define PCI_X_SSTATUS_MODE1_100MHZ
Definition: pci_def.h:362
#define PCI_X_SEC_STATUS
Definition: pci_def.h:349
#define PCI_CAP_ID_PCIX
Definition: pci_def.h:197
#define PCI_X_SSTATUS_MODE1_133MHZ
Definition: pci_def.h:363
#define PCI_X_SSTATUS_MODE2_533MHZ_REF_100MHZ
Definition: pci_def.h:368
#define PCI_X_SSTATUS_MODE2_533MHZ_REF_66MHZ
Definition: pci_def.h:367
#define PCI_X_STATUS_MAX_READ
Definition: pci_def.h:340
#define PCI_X_SSTATUS_CONVENTIONAL_PCI
Definition: pci_def.h:360
#define PCI_X_CMD_DPERR_E
Definition: pci_def.h:325
#define PCI_X_SSTATUS_MFREQ(x)
Definition: pci_def.h:359
#define PCI_X_SSTATUS_MODE2_266MHZ_REF_100MHZ
Definition: pci_def.h:365
#define PCI_HEADER_TYPE_NORMAL
Definition: pci_def.h:48
#define PCI_X_SSTATUS_MODE2_266MHZ_REF_133MHZ
Definition: pci_def.h:366
#define PCI_X_STATUS_MAX_SPLIT
Definition: pci_def.h:342
#define PCI_X_SSTATUS_MODE2_533MHZ_REF_133MHZ
Definition: pci_def.h:369
#define PCI_X_SSTATUS_MODE2_266MHZ_REF_66MHZ
Definition: pci_def.h:364
#define PCI_X_CMD_MAX_SPLIT
Definition: pci_def.h:328
#define PCI_X_CMD_MAX_READ
Definition: pci_def.h:327
#define PCI_X_CMD_ERO
Definition: pci_def.h:326
#define PCI_X_STATUS
Definition: pci_def.h:330
#define PCI_X_SSTATUS_MODE1_66MHZ
Definition: pci_def.h:361
void pci_scan_bus(struct bus *bus, unsigned int min_devfn, unsigned int max_devfn)
Scan a PCI bus.
Definition: pci_device.c:1379
void pci_bus_enable_resources(struct device *dev)
Definition: pci_device.c:758
void pci_bus_read_resources(struct device *dev)
Definition: pci_device.c:540
void pci_bus_reset(struct bus *bus)
Definition: pci_device.c:777
void do_pci_scan_bridge(struct device *dev, void(*do_scan_bus)(struct bus *bus, unsigned int min_devfn, unsigned int max_devfn))
Scan a PCI bridge and the buses behind the bridge.
Definition: pci_device.c:1558
void pci_dev_set_resources(struct device *dev)
Definition: pci_device.c:691
static void pcix_tune_dev(struct device *dev)
Definition: pcix_device.c:9
struct device_operations default_pcix_ops_bus
Definition: pcix_device.c:121
const char * pcix_speed(u16 sstatus)
Definition: pcix_device.c:56
static void pcix_tune_bus(struct bus *bus)
Definition: pcix_device.c:48
void pcix_scan_bridge(struct device *dev)
Definition: pcix_device.c:97
static struct pci_operations pcix_bus_ops_pci
Default device operations for PCI-X bridges.
Definition: pcix_device.c:117
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
Definition: device.h:76
DEVTREE_CONST struct device * children
Definition: device.h:79
uint16_t secondary
Definition: device.h:84
void(* read_resources)(struct device *dev)
Definition: device.h:39
Definition: device.h:107
DEVTREE_CONST struct device * sibling
Definition: device.h:111
unsigned int hdr_type
Definition: device.h:121
DEVTREE_CONST struct bus * link_list
Definition: device.h:139