blob: e7019151aa8a9638deb62ea077d1b0a1fa16a642 [file] [log] [blame]
Stefan Reinauer00636b02012-04-04 00:08:51 +02001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2007-2009 coresystems GmbH
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Stefan Reinauer00636b02012-04-04 00:08:51 +020014 */
15
Kyösti Mälkki54d6abd2013-06-19 23:05:00 +030016#ifndef _PCI_MMIO_CFG_H
17#define _PCI_MMIO_CFG_H
18
Kyösti Mälkki8fd78a62019-01-23 15:59:38 +020019#include <stdint.h>
Kyösti Mälkki13f66502019-03-03 08:01:05 +020020#include <device/mmio.h>
Kyösti Mälkki8fd78a62019-01-23 15:59:38 +020021#include <device/pci_type.h>
Kyösti Mälkki54d6abd2013-06-19 23:05:00 +030022
Stefan Reinauer00636b02012-04-04 00:08:51 +020023
Aaron Durbin75a62e72018-09-13 02:10:45 -060024static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020025uint8_t pci_mmio_read_config8(pci_devfn_t dev, uint16_t reg)
Stefan Reinauer00636b02012-04-04 00:08:51 +020026{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080027 void *addr;
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020028 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | reg);
Stefan Reinauer00636b02012-04-04 00:08:51 +020029 return read8(addr);
30}
31
Aaron Durbin75a62e72018-09-13 02:10:45 -060032static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020033uint16_t pci_mmio_read_config16(pci_devfn_t dev, uint16_t reg)
Stefan Reinauer00636b02012-04-04 00:08:51 +020034{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080035 void *addr;
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020036 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | (reg & ~1));
Stefan Reinauer00636b02012-04-04 00:08:51 +020037 return read16(addr);
38}
39
Aaron Durbin75a62e72018-09-13 02:10:45 -060040static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020041uint32_t pci_mmio_read_config32(pci_devfn_t dev, uint16_t reg)
Stefan Reinauer00636b02012-04-04 00:08:51 +020042{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080043 void *addr;
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020044 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | (reg & ~3));
Stefan Reinauer00636b02012-04-04 00:08:51 +020045 return read32(addr);
46}
47
Aaron Durbin75a62e72018-09-13 02:10:45 -060048static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020049void pci_mmio_write_config8(pci_devfn_t dev, uint16_t reg, uint8_t value)
Stefan Reinauer00636b02012-04-04 00:08:51 +020050{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080051 void *addr;
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020052 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | reg);
Stefan Reinauer00636b02012-04-04 00:08:51 +020053 write8(addr, value);
54}
55
Aaron Durbin75a62e72018-09-13 02:10:45 -060056static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020057void pci_mmio_write_config16(pci_devfn_t dev, uint16_t reg, uint16_t value)
Stefan Reinauer00636b02012-04-04 00:08:51 +020058{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080059 void *addr;
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020060 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | (reg & ~1));
Stefan Reinauer00636b02012-04-04 00:08:51 +020061 write16(addr, value);
62}
63
Aaron Durbin75a62e72018-09-13 02:10:45 -060064static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020065void pci_mmio_write_config32(pci_devfn_t dev, uint16_t reg, uint32_t value)
Stefan Reinauer00636b02012-04-04 00:08:51 +020066{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080067 void *addr;
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020068 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | (reg & ~3));
Stefan Reinauer00636b02012-04-04 00:08:51 +020069 write32(addr, value);
70}
71
Julius Wernercd49cce2019-03-05 16:53:33 -080072#if CONFIG(MMCONF_SUPPORT)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020073
Kyösti Mälkki92b52962019-03-01 08:08:28 +020074/* Avoid name collisions as different stages have different signature
75 * for these functions. The _s_ stands for simple, fundamental IO or
76 * MMIO variant.
77 */
78
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020079static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020080uint8_t pci_s_read_config8(pci_devfn_t dev, uint16_t reg)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020081{
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020082 return pci_mmio_read_config8(dev, reg);
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020083}
84
85static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020086uint16_t pci_s_read_config16(pci_devfn_t dev, uint16_t reg)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020087{
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020088 return pci_mmio_read_config16(dev, reg);
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020089}
90
91static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020092uint32_t pci_s_read_config32(pci_devfn_t dev, uint16_t reg)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020093{
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020094 return pci_mmio_read_config32(dev, reg);
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020095}
96
97static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +020098void pci_s_write_config8(pci_devfn_t dev, uint16_t reg, uint8_t value)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020099{
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200100 pci_mmio_write_config8(dev, reg, value);
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +0200101}
102
103static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200104void pci_s_write_config16(pci_devfn_t dev, uint16_t reg, uint16_t value)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +0200105{
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200106 pci_mmio_write_config16(dev, reg, value);
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +0200107}
108
109static __always_inline
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200110void pci_s_write_config32(pci_devfn_t dev, uint16_t reg, uint32_t value)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +0200111{
Kyösti Mälkkib603fdc2019-03-11 20:33:01 +0200112 pci_mmio_write_config32(dev, reg, value);
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +0200113}
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +0200114
115#endif
116
Kyösti Mälkki54d6abd2013-06-19 23:05:00 +0300117#endif /* _PCI_MMIO_CFG_H */