blob: cdf02d6a56430820841ba07fb8f86a6d5d7a847f [file] [log] [blame]
Angel Pons32859fc2020-04-02 23:48:27 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +02002
Eric Biederman5899fd82003-04-24 06:25:08 +00003#ifndef PCI_OPS_H
4#define PCI_OPS_H
5
6#include <stdint.h>
Eric Biederman7a5416a2003-06-12 19:23:51 +00007#include <device/device.h>
Kyösti Mälkki3e6913b2019-03-02 16:26:10 +02008#include <device/pci_type.h>
Eric Biederman018d8dd2004-11-04 11:04:33 +00009#include <arch/pci_ops.h>
Eric Biederman5899fd82003-04-24 06:25:08 +000010
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020011void __noreturn pcidev_die(void);
12
Kyösti Mälkki34cf5612019-03-11 20:34:26 +020013static __always_inline pci_devfn_t pcidev_bdf(const struct device *dev)
14{
15 return (dev->path.pci.devfn << 12) | (dev->bus->secondary << 20);
16}
17
18static __always_inline pci_devfn_t pcidev_assert(const struct device *dev)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020019{
20 if (!dev)
21 pcidev_die();
Kyösti Mälkki34cf5612019-03-11 20:34:26 +020022 return pcidev_bdf(dev);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020023}
Kyösti Mälkki3f98d412019-07-29 16:38:14 +030024
Kyösti Mälkki9d5af5b2019-09-27 12:01:15 +030025#if defined(__SIMPLE_DEVICE__)
26#define ENV_PCI_SIMPLE_DEVICE 1
27#else
28#define ENV_PCI_SIMPLE_DEVICE 0
29#endif
30
31#if ENV_PCI_SIMPLE_DEVICE
Kyösti Mälkki3f98d412019-07-29 16:38:14 +030032
33/* Avoid name collisions as different stages have different signature
34 * for these functions. The _s_ stands for simple, fundamental IO or
35 * MMIO variant.
36 */
37#define pci_read_config8 pci_s_read_config8
38#define pci_read_config16 pci_s_read_config16
39#define pci_read_config32 pci_s_read_config32
40#define pci_write_config8 pci_s_write_config8
41#define pci_write_config16 pci_s_write_config16
42#define pci_write_config32 pci_s_write_config32
43#else
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020044
45static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020046u8 pci_read_config8(const struct device *dev, u16 reg)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020047{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020048 return pci_s_read_config8(PCI_BDF(dev), reg);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020049}
50
51static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020052u16 pci_read_config16(const struct device *dev, u16 reg)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020053{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020054 return pci_s_read_config16(PCI_BDF(dev), reg);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020055}
56
57static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020058u32 pci_read_config32(const struct device *dev, u16 reg)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020059{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020060 return pci_s_read_config32(PCI_BDF(dev), reg);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020061}
62
63static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020064void pci_write_config8(const struct device *dev, u16 reg, u8 val)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020065{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020066 pci_s_write_config8(PCI_BDF(dev), reg, val);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020067}
68
69static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020070void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020071{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020072 pci_s_write_config16(PCI_BDF(dev), reg, val);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020073}
74
75static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020076void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020077{
Kyösti Mälkki4663f452019-03-07 14:18:28 +020078 pci_s_write_config32(PCI_BDF(dev), reg, val);
Kyösti Mälkkie079e5c2019-01-23 16:15:48 +020079}
80
Stefan Reinauer24d1d4b2013-03-21 11:51:41 -070081#endif
Stefan Reinauer43b29cf2009-03-06 19:11:52 +000082
Kyösti Mälkki9d5af5b2019-09-27 12:01:15 +030083#if ENV_PCI_SIMPLE_DEVICE
Aaron Durbin75a62e72018-09-13 02:10:45 -060084static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +020085void pci_update_config8(pci_devfn_t dev, u16 reg, u8 mask, u8 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +010086#else
87static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +020088void pci_update_config8(const struct device *dev, u16 reg, u8 mask, u8 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +010089#endif
Patrick Rudolphe56189c2018-04-18 10:11:59 +020090{
91 u8 reg8;
92
93 reg8 = pci_read_config8(dev, reg);
94 reg8 &= mask;
95 reg8 |= or;
96 pci_write_config8(dev, reg, reg8);
97}
98
Kyösti Mälkki9d5af5b2019-09-27 12:01:15 +030099#if ENV_PCI_SIMPLE_DEVICE
Aaron Durbin75a62e72018-09-13 02:10:45 -0600100static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200101void pci_update_config16(pci_devfn_t dev, u16 reg, u16 mask, u16 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100102#else
103static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200104void pci_update_config16(const struct device *dev, u16 reg, u16 mask, u16 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100105#endif
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200106{
107 u16 reg16;
108
109 reg16 = pci_read_config16(dev, reg);
110 reg16 &= mask;
111 reg16 |= or;
112 pci_write_config16(dev, reg, reg16);
113}
114
Kyösti Mälkki9d5af5b2019-09-27 12:01:15 +0300115#if ENV_PCI_SIMPLE_DEVICE
Aaron Durbin75a62e72018-09-13 02:10:45 -0600116static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200117void pci_update_config32(pci_devfn_t dev, u16 reg, u32 mask, u32 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100118#else
119static __always_inline
Kyösti Mälkki55172462019-03-07 11:13:29 +0200120void pci_update_config32(const struct device *dev, u16 reg, u32 mask, u32 or)
Elyes HAOUASf9e47cc2018-12-05 11:03:36 +0100121#endif
Patrick Rudolphe56189c2018-04-18 10:11:59 +0200122{
123 u32 reg32;
124
125 reg32 = pci_read_config32(dev, reg);
126 reg32 &= mask;
127 reg32 |= or;
128 pci_write_config32(dev, reg, reg32);
129}
130
Angel Pons2f3456a2020-06-07 18:31:33 +0200131#if ENV_PCI_SIMPLE_DEVICE
132static __always_inline
133void pci_and_config8(pci_devfn_t dev, u16 reg, u8 andmask)
134#else
135static __always_inline
136void pci_and_config8(const struct device *dev, u16 reg, u8 andmask)
137#endif
138{
139 pci_update_config8(dev, reg, andmask, 0);
140}
141
142#if ENV_PCI_SIMPLE_DEVICE
143static __always_inline
144void pci_and_config16(pci_devfn_t dev, u16 reg, u16 andmask)
145#else
146static __always_inline
147void pci_and_config16(const struct device *dev, u16 reg, u16 andmask)
148#endif
149{
150 pci_update_config16(dev, reg, andmask, 0);
151}
152
153#if ENV_PCI_SIMPLE_DEVICE
154static __always_inline
155void pci_and_config32(pci_devfn_t dev, u16 reg, u32 andmask)
156#else
157static __always_inline
158void pci_and_config32(const struct device *dev, u16 reg, u32 andmask)
159#endif
160{
161 pci_update_config32(dev, reg, andmask, 0);
162}
163
164#if ENV_PCI_SIMPLE_DEVICE
165static __always_inline
166void pci_or_config8(pci_devfn_t dev, u16 reg, u8 ormask)
167#else
168static __always_inline
169void pci_or_config8(const struct device *dev, u16 reg, u8 ormask)
170#endif
171{
172 pci_update_config8(dev, reg, 0xff, ormask);
173}
174
175#if ENV_PCI_SIMPLE_DEVICE
176static __always_inline
177void pci_or_config16(pci_devfn_t dev, u16 reg, u16 ormask)
178#else
179static __always_inline
180void pci_or_config16(const struct device *dev, u16 reg, u16 ormask)
181#endif
182{
183 pci_update_config16(dev, reg, 0xffff, ormask);
184}
185
186#if ENV_PCI_SIMPLE_DEVICE
187static __always_inline
188void pci_or_config32(pci_devfn_t dev, u16 reg, u32 ormask)
189#else
190static __always_inline
191void pci_or_config32(const struct device *dev, u16 reg, u32 ormask)
192#endif
193{
194 pci_update_config32(dev, reg, 0xffffffff, ormask);
195}
196
Kyösti Mälkki9c0e14e2019-01-23 16:46:35 +0200197u16 pci_s_find_next_capability(pci_devfn_t dev, u16 cap, u16 last);
198u16 pci_s_find_capability(pci_devfn_t dev, u16 cap);
199
Kyösti Mälkki9c0e14e2019-01-23 16:46:35 +0200200static __always_inline
201u16 pci_find_next_capability(const struct device *dev, u16 cap, u16 last)
202{
203 return pci_s_find_next_capability(PCI_BDF(dev), cap, last);
204}
205
206static __always_inline
207u16 pci_find_capability(const struct device *dev, u16 cap)
208{
209 return pci_s_find_capability(PCI_BDF(dev), cap);
210}
Kyösti Mälkki9c0e14e2019-01-23 16:46:35 +0200211
Eric Biederman5899fd82003-04-24 06:25:08 +0000212#endif /* PCI_OPS_H */