blob: ca2e67f7522183a54e9716a4541347384a6ab63d [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);
Mariusz Szafranskia4041332017-08-02 17:28:17 +020035}
36
37static struct device_operations uart_ops = {
38 .read_resources = dnv_ns_uart_read_resources,
39 .set_resources = pci_dev_set_resources,
40 .enable_resources = pci_dev_enable_resources,
41 .init = pci_dev_init,
Mariusz Szafranskia4041332017-08-02 17:28:17 +020042};
43
Mariusz Szafranskia4041332017-08-02 17:28:17 +020044static const struct pci_driver uart_driver __pci_driver = {
45 .ops = &uart_ops,
Felix Singer43b7f412022-03-07 04:34:52 +010046 .vendor = PCI_VID_INTEL,
47 .device = PCI_DID_INTEL_DNV_HSUART
Mariusz Szafranskia4041332017-08-02 17:28:17 +020048};
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010049
50static void hide_hsuarts(void)
51{
52 int i;
53 printk(BIOS_DEBUG, "HIDING HSUARTs.\n");
54 /* There is a hardware requirement to hide functions starting from the
55 last one. */
56 for (i = DENVERTON_UARTS_TO_INI - 1; i >= 0; i--) {
57 struct device *uart_dev;
Kyösti Mälkki903b40a2019-07-03 07:25:59 +030058 uart_dev = pcidev_on_root(HSUART_DEV, i);
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010059 if (uart_dev == NULL)
60 continue;
61 pci_or_config32(uart_dev, PCI_FUNC_RDCFG_HIDE, 1);
62 }
63}
64
65/* Hide HSUART PCI device very last when FSP no longer needs it */
66void platform_fsp_notify_status(enum fsp_notify_phase phase)
67{
68 if (phase != END_OF_FIRMWARE)
69 return;
Julius Wernercd49cce2019-03-05 16:53:33 -080070 if (CONFIG(LEGACY_UART_MODE))
Julien Viard de Galbert546923f2018-03-05 11:10:16 +010071 hide_hsuarts();
72}