blob: b8598cc4efa83a76d4060b6ca078e30f0a38085d [file] [log] [blame]
Patrick Georgiac959032020-05-05 22:49:26 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Mariusz Szafranskia4041332017-08-02 17:28:17 +02002
3/*
4 * The sole purpose of this driver is to avoid BAR to be changed during
5 * resource allocation. Since configuration space is just 32 bytes it
6 * shouldn't cause any fragmentation.
7 */
8
9#include <console/uart.h>
10#include <device/device.h>
11#include <device/pci.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +020012#include <device/pci_ops.h>
Mariusz Szafranskia4041332017-08-02 17:28:17 +020013#include <device/pci_ids.h>
14#include <soc/pci_devs.h>
15#include <console/console.h>
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010016#include <soc/uart.h>
17#include <fsp/api.h>
Mariusz Szafranskia4041332017-08-02 17:28:17 +020018
19static void dnv_ns_uart_read_resources(struct device *dev)
20{
21 /* read resources to be visible in the log*/
22 pci_dev_read_resources(dev);
Julius Wernercd49cce2019-03-05 16:53:33 -080023 if (!CONFIG(LEGACY_UART_MODE))
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010024 return;
Angel Ponsc1bfbe02021-11-03 13:18:53 +010025 struct resource *res = probe_resource(dev, PCI_BASE_ADDRESS_0);
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010026 if (res == NULL)
27 return;
28 res->size = 0x8;
29 res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
30 /* Do not configure membar */
Angel Ponsc1bfbe02021-11-03 13:18:53 +010031 res = probe_resource(dev, PCI_BASE_ADDRESS_1);
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010032 if (res != NULL)
33 res->flags = 0;
34 compact_resources(dev);
35
Mariusz Szafranskia4041332017-08-02 17:28:17 +020036}
37
38static struct device_operations uart_ops = {
39 .read_resources = dnv_ns_uart_read_resources,
40 .set_resources = pci_dev_set_resources,
41 .enable_resources = pci_dev_enable_resources,
42 .init = pci_dev_init,
Mariusz Szafranskia4041332017-08-02 17:28:17 +020043};
44
Mariusz Szafranskia4041332017-08-02 17:28:17 +020045static const struct pci_driver uart_driver __pci_driver = {
46 .ops = &uart_ops,
Felix Singer43b7f412022-03-07 04:34:52 +010047 .vendor = PCI_VID_INTEL,
48 .device = PCI_DID_INTEL_DNV_HSUART
Mariusz Szafranskia4041332017-08-02 17:28:17 +020049};
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010050
51static void hide_hsuarts(void)
52{
53 int i;
54 printk(BIOS_DEBUG, "HIDING HSUARTs.\n");
55 /* There is a hardware requirement to hide functions starting from the
56 last one. */
57 for (i = DENVERTON_UARTS_TO_INI - 1; i >= 0; i--) {
58 struct device *uart_dev;
Kyösti Mälkki903b40a2019-07-03 07:25:59 +030059 uart_dev = pcidev_on_root(HSUART_DEV, i);
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010060 if (uart_dev == NULL)
61 continue;
62 pci_or_config32(uart_dev, PCI_FUNC_RDCFG_HIDE, 1);
63 }
64}
65
66/* Hide HSUART PCI device very last when FSP no longer needs it */
67void platform_fsp_notify_status(enum fsp_notify_phase phase)
68{
69 if (phase != END_OF_FIRMWARE)
70 return;
Julius Wernercd49cce2019-03-05 16:53:33 -080071 if (CONFIG(LEGACY_UART_MODE))
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010072 hide_hsuarts();
73}