coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
data_fabric_helper.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
4 #include <amdblocks/pci_devs.h>
5 #include <console/console.h>
6 #include <device/pci_ops.h>
7 #include <soc/data_fabric.h>
8 #include <soc/pci_devs.h>
9 #include <types.h>
10 #include "data_fabric_def.h"
11 
12 static void data_fabric_set_indirect_address(uint8_t func, uint16_t reg, uint8_t instance_id)
13 {
14  uint32_t fabric_indirect_access_reg = DF_IND_CFG_INST_ACC_EN;
15  /* Register offset field [10:2] in this register corresponds to [10:2] of the
16  requested offset. */
17  fabric_indirect_access_reg |= reg & DF_IND_CFG_ACC_REG_MASK;
18  fabric_indirect_access_reg |=
20  fabric_indirect_access_reg |= instance_id << DF_IND_CFG_INST_ID_SHIFT;
21  pci_write_config32(SOC_DF_F4_DEV, DF_FICAA_BIOS, fabric_indirect_access_reg);
22 }
23 
24 uint32_t data_fabric_read32(uint8_t function, uint16_t reg, uint8_t instance_id)
25 {
26  /* Broadcast reads might return unexpected results when a register has different
27  contents in the different instances. */
28  if (instance_id == BROADCAST_FABRIC_ID)
29  return data_fabric_broadcast_read32(function, reg);
30 
31  /* non-broadcast data fabric accesses need to be done via indirect access */
32  data_fabric_set_indirect_address(function, reg, instance_id);
34 }
35 
36 void data_fabric_write32(uint8_t function, uint16_t reg, uint8_t instance_id, uint32_t data)
37 {
38  if (instance_id == BROADCAST_FABRIC_ID) {
39  data_fabric_broadcast_write32(function, reg, data);
40  return;
41  }
42 
43  /* non-broadcast data fabric accesses need to be done via indirect access */
44  data_fabric_set_indirect_address(function, reg, instance_id);
46 }
47 
49 {
51  "=== Data Fabric MMIO configuration registers ===\n"
52  "Addresses are shifted to the right by 16 bits.\n"
53  "idx control base limit\n");
54  for (unsigned int i = 0; i < NUM_NB_MMIO_REGS; i++) {
55  printk(BIOS_SPEW, " %2u %8x %8x %8x\n",
56  i,
60  }
61 }
62 
63 void data_fabric_disable_mmio_reg(unsigned int reg)
64 {
69 }
70 
71 static bool is_mmio_reg_disabled(unsigned int reg)
72 {
74  return !(val & (DF_MMIO_WE | DF_MMIO_RE));
75 }
76 
78 {
79  for (unsigned int i = 0; i < NUM_NB_MMIO_REGS; i++) {
80  if (is_mmio_reg_disabled(i))
81  return i;
82  }
83  return -1;
84 }
#define NUM_NB_MMIO_REGS
Definition: data_fabric.h:13
#define IOMS0_FABRIC_ID
Definition: data_fabric.h:11
#define NB_MMIO_CONTROL(reg)
Definition: data_fabric.h:26
#define NB_MMIO_BASE(reg)
Definition: data_fabric.h:24
static __always_inline uint32_t data_fabric_broadcast_read32(uint8_t function, uint16_t reg)
Definition: data_fabric.h:32
static __always_inline void data_fabric_broadcast_write32(uint8_t function, uint16_t reg, uint32_t data)
Definition: data_fabric.h:39
#define DF_MMIO_DST_FABRIC_ID_SHIFT
Definition: data_fabric.h:19
#define BROADCAST_FABRIC_ID
Definition: data_fabric.h:11
#define DF_MMIO_RE
Definition: data_fabric.h:21
#define DF_MMIO_WE
Definition: data_fabric.h:20
#define NB_MMIO_LIMIT(reg)
Definition: data_fabric.h:25
#define printk(level,...)
Definition: stdlib.h:16
#define DF_IND_CFG_ACC_FUN_SHIFT
#define DF_IND_CFG_INST_ACC_EN
#define DF_IND_CFG_INST_ID_SHIFT
#define DF_IND_CFG_ACC_REG_MASK
#define DF_FICAA_BIOS
#define DF_IND_CFG_ACC_FUN_MASK
#define DF_FICAD_LO
static void data_fabric_set_indirect_address(uint8_t func, uint16_t reg, uint8_t instance_id)
void data_fabric_print_mmio_conf(void)
void data_fabric_disable_mmio_reg(unsigned int reg)
int data_fabric_find_unused_mmio_reg(void)
static bool is_mmio_reg_disabled(unsigned int reg)
void data_fabric_write32(uint8_t function, uint16_t reg, uint8_t instance_id, uint32_t data)
uint32_t data_fabric_read32(uint8_t function, uint16_t reg, uint8_t instance_id)
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline u32 pci_read_config32(const struct device *dev, u16 reg)
Definition: pci_ops.h:58
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
Definition: loglevel.h:142
#define SOC_DF_F4_DEV
Definition: pci_devs.h:142
unsigned short uint16_t
Definition: stdint.h:11
unsigned int uint32_t
Definition: stdint.h:14
unsigned char uint8_t
Definition: stdint.h:8
u8 val
Definition: sys.c:300