blob: 454795f51968a76c96cbdafb3739fbc55171727d [file] [log] [blame]
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +02001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2004 Linux Networx
5 * (Written by Eric Biederman <ebiederman@lnxi.com> for Linux Networx)
6 * Copyright (C) 2009 coresystems GmbH
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; version 2 of the License.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 */
17
Eric Biederman5899fd82003-04-24 06:25:08 +000018#ifndef PCI_OPS_H
19#define PCI_OPS_H
20
21#include <stdint.h>
Eric Biederman7a5416a2003-06-12 19:23:51 +000022#include <device/device.h>
Kyösti Mälkki3e6913b2019-03-02 16:26:10 +020023#include <device/pci_type.h>
Eric Biederman018d8dd2004-11-04 11:04:33 +000024#include <arch/pci_ops.h>
Eric Biederman5899fd82003-04-24 06:25:08 +000025
Kyösti Mälkki92b52962019-03-01 08:08:28 +020026#ifdef __SIMPLE_DEVICE__
27
28/* Avoid name collisions as different stages have different signature
29 * for these functions. The _s_ stands for simple, fundamental IO or
30 * MMIO variant.
31 */
32#define pci_read_config8 pci_s_read_config8
33#define pci_read_config16 pci_s_read_config16
34#define pci_read_config32 pci_s_read_config32
35#define pci_write_config8 pci_s_write_config8
36#define pci_write_config16 pci_s_write_config16
37#define pci_write_config32 pci_s_write_config32
38#else
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020039
40#include <device/pci.h>
41
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020042void __noreturn pcidev_die(void);
43
Kyösti Mälkki34cf5612019-03-11 20:34:26 +020044static __always_inline pci_devfn_t pcidev_bdf(const struct device *dev)
45{
46 return (dev->path.pci.devfn << 12) | (dev->bus->secondary << 20);
47}
48
49static __always_inline pci_devfn_t pcidev_assert(const struct device *dev)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020050{
51 if (!dev)
52 pcidev_die();
Kyösti Mälkki34cf5612019-03-11 20:34:26 +020053 return pcidev_bdf(dev);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020054}
55
56static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020057u8 pci_read_config8(const struct device *dev, u16 reg)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020058{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020059 return pci_s_read_config8(PCI_BDF(dev), reg);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020060}
61
62static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020063u16 pci_read_config16(const struct device *dev, u16 reg)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020064{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020065 return pci_s_read_config16(PCI_BDF(dev), reg);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020066}
67
68static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020069u32 pci_read_config32(const struct device *dev, u16 reg)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020070{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020071 return pci_s_read_config32(PCI_BDF(dev), reg);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020072}
73
74static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020075void pci_write_config8(const struct device *dev, u16 reg, u8 val)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020076{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020077 pci_s_write_config8(PCI_BDF(dev), reg, val);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020078}
79
80static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020081void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020082{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020083 pci_s_write_config16(PCI_BDF(dev), reg, val);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020084}
85
86static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020087void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020088{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020089 pci_s_write_config32(PCI_BDF(dev), reg, val);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020090}
91
Stefan Reinauer24d1d4b2013-03-21 11:51:41 -070092#endif
Stefan Reinauer43b29cf2009-03-06 19:11:52 +000093
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +010094#ifdef __SIMPLE_DEVICE__
Aaron Durbin75a62e72018-09-13 02:10:45 -060095static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020096void pci_or_config8(pci_devfn_t dev, u16 reg, u8 ormask)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +010097#else
98static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020099void pci_or_config8(const struct device *dev, u16 reg, u8 ormask)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100100#endif
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200101{
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200102 u8 value = pci_read_config8(dev, reg);
103 pci_write_config8(dev, reg, value | ormask);
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200104}
105
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100106#ifdef __SIMPLE_DEVICE__
Aaron Durbin75a62e72018-09-13 02:10:45 -0600107static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200108void pci_or_config16(pci_devfn_t dev, u16 reg, u16 ormask)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100109#else
110static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200111void pci_or_config16(const struct device *dev, u16 reg, u16 ormask)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100112#endif
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200113{
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200114 u16 value = pci_read_config16(dev, reg);
115 pci_write_config16(dev, reg, value | ormask);
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200116}
117
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100118#ifdef __SIMPLE_DEVICE__
Aaron Durbin75a62e72018-09-13 02:10:45 -0600119static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200120void pci_or_config32(pci_devfn_t dev, u16 reg, u32 ormask)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100121#else
122static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200123void pci_or_config32(const struct device *dev, u16 reg, u32 ormask)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100124#endif
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200125{
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200126 u32 value = pci_read_config32(dev, reg);
127 pci_write_config32(dev, reg, value | ormask);
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200128}
129
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100130#ifdef __SIMPLE_DEVICE__
Aaron Durbin75a62e72018-09-13 02:10:45 -0600131static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200132void pci_update_config8(pci_devfn_t dev, u16 reg, u8 mask, u8 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100133#else
134static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200135void pci_update_config8(const struct device *dev, u16 reg, u8 mask, u8 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100136#endif
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200137{
138 u8 reg8;
139
140 reg8 = pci_read_config8(dev, reg);
141 reg8 &= mask;
142 reg8 |= or;
143 pci_write_config8(dev, reg, reg8);
144}
145
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100146#ifdef __SIMPLE_DEVICE__
Aaron Durbin75a62e72018-09-13 02:10:45 -0600147static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200148void pci_update_config16(pci_devfn_t dev, u16 reg, u16 mask, u16 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100149#else
150static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200151void pci_update_config16(const struct device *dev, u16 reg, u16 mask, u16 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100152#endif
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200153{
154 u16 reg16;
155
156 reg16 = pci_read_config16(dev, reg);
157 reg16 &= mask;
158 reg16 |= or;
159 pci_write_config16(dev, reg, reg16);
160}
161
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100162#ifdef __SIMPLE_DEVICE__
Aaron Durbin75a62e72018-09-13 02:10:45 -0600163static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200164void pci_update_config32(pci_devfn_t dev, u16 reg, u32 mask, u32 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100165#else
166static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200167void pci_update_config32(const struct device *dev, u16 reg, u32 mask, u32 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100168#endif
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200169{
170 u32 reg32;
171
172 reg32 = pci_read_config32(dev, reg);
173 reg32 &= mask;
174 reg32 |= or;
175 pci_write_config32(dev, reg, reg32);
176}
177
Eric Biederman5899fd82003-04-24 06:25:08 +0000178#endif /* PCI_OPS_H */