blob: aaa21813ceafd4509e63095af0b82a61efbddde7 [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älkkid8d43ba2013-10-27 14:59:00 +020025u8 pci_mmio_read_config8(pci_devfn_t dev, unsigned int where)
Stefan Reinauer00636b02012-04-04 00:08:51 +020026{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080027 void *addr;
Kyösti Mälkki503d3242019-03-05 07:54:28 +020028 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | where);
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älkkid8d43ba2013-10-27 14:59:00 +020033u16 pci_mmio_read_config16(pci_devfn_t dev, unsigned int where)
Stefan Reinauer00636b02012-04-04 00:08:51 +020034{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080035 void *addr;
Kyösti Mälkki503d3242019-03-05 07:54:28 +020036 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | (where & ~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älkkid8d43ba2013-10-27 14:59:00 +020041u32 pci_mmio_read_config32(pci_devfn_t dev, unsigned int where)
Stefan Reinauer00636b02012-04-04 00:08:51 +020042{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080043 void *addr;
Kyösti Mälkki503d3242019-03-05 07:54:28 +020044 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | (where & ~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älkkid8d43ba2013-10-27 14:59:00 +020049void pci_mmio_write_config8(pci_devfn_t dev, unsigned int where, u8 value)
Stefan Reinauer00636b02012-04-04 00:08:51 +020050{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080051 void *addr;
Kyösti Mälkki503d3242019-03-05 07:54:28 +020052 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | where);
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älkkid8d43ba2013-10-27 14:59:00 +020057void pci_mmio_write_config16(pci_devfn_t dev, unsigned int where, u16 value)
Stefan Reinauer00636b02012-04-04 00:08:51 +020058{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080059 void *addr;
Kyösti Mälkki503d3242019-03-05 07:54:28 +020060 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | (where & ~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älkkid8d43ba2013-10-27 14:59:00 +020065void pci_mmio_write_config32(pci_devfn_t dev, unsigned int where, u32 value)
Stefan Reinauer00636b02012-04-04 00:08:51 +020066{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080067 void *addr;
Kyösti Mälkki503d3242019-03-05 07:54:28 +020068 addr = (void *)(uintptr_t)(CONFIG_MMCONF_BASE_ADDRESS | dev | (where & ~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älkki92b52962019-03-01 08:08:28 +020080uint8_t pci_s_read_config8(pci_devfn_t dev, unsigned int where)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020081{
82 return pci_mmio_read_config8(dev, where);
83}
84
85static __always_inline
Kyösti Mälkki92b52962019-03-01 08:08:28 +020086uint16_t pci_s_read_config16(pci_devfn_t dev, unsigned int where)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020087{
88 return pci_mmio_read_config16(dev, where);
89}
90
91static __always_inline
Kyösti Mälkki92b52962019-03-01 08:08:28 +020092uint32_t pci_s_read_config32(pci_devfn_t dev, unsigned int where)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020093{
94 return pci_mmio_read_config32(dev, where);
95}
96
97static __always_inline
Kyösti Mälkki92b52962019-03-01 08:08:28 +020098void pci_s_write_config8(pci_devfn_t dev, unsigned int where, uint8_t value)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +020099{
100 pci_mmio_write_config8(dev, where, value);
101}
102
103static __always_inline
Kyösti Mälkki92b52962019-03-01 08:08:28 +0200104void pci_s_write_config16(pci_devfn_t dev, unsigned int where, uint16_t value)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +0200105{
106 pci_mmio_write_config16(dev, where, value);
107}
108
109static __always_inline
Kyösti Mälkki92b52962019-03-01 08:08:28 +0200110void pci_s_write_config32(pci_devfn_t dev, unsigned int where, uint32_t value)
Kyösti Mälkki2d8aff32019-01-23 16:44:55 +0200111{
112 pci_mmio_write_config32(dev, where, value);
113}
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 */