blob: 688dd5fd814612783cdb5174de78ac4002057dbe [file] [log] [blame]
Angel Pons4b429832020-04-02 23:48:50 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +01002
Vladimir Serbinenkobd896992014-01-02 10:10:14 +01003#define __SIMPLE_DEVICE__
4
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +01005#include <types.h>
Angel Ponsce3e6382020-08-03 18:57:34 +02006#include <commonlib/helpers.h>
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +01007#include <device/device.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02008#include <device/pci_ops.h>
Angel Pons95de2312020-02-17 13:08:53 +01009#include "ironlake.h"
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +010010
Angel Ponsce3e6382020-08-03 18:57:34 +020011static int decode_pcie_bar(u32 *const base, u32 *const len)
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +010012{
Angel Ponsce3e6382020-08-03 18:57:34 +020013 *base = 0;
14 *len = 0;
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +010015
Angel Ponsce3e6382020-08-03 18:57:34 +020016 const u32 pciexbar_reg = pci_read_config32(QPI_SAD, SAD_PCIEXBAR);
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +010017
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +010018 if (!(pciexbar_reg & (1 << 0)))
Angel Ponsce3e6382020-08-03 18:57:34 +020019 return 0;
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +010020
21 switch ((pciexbar_reg >> 1) & 3) {
Angel Ponsce3e6382020-08-03 18:57:34 +020022 case 0: /* 256MB */
23 *base = pciexbar_reg & (0x0f << 28);
24 *len = 256 * MiB;
25 return 1;
26 case 1: /* 128M */
27 *base = pciexbar_reg & (0x1f << 27);
28 *len = 128 * MiB;
29 return 1;
30 case 2: /* 64M */
31 *base = pciexbar_reg & (0x3f << 26);
32 *len = 64 * MiB;
33 return 1;
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +010034 }
35
Angel Ponsce3e6382020-08-03 18:57:34 +020036 return 0;
37}
38
39unsigned long acpi_fill_mcfg(unsigned long current)
40{
41 u32 length, pciexbar;
42
43 if (!decode_pcie_bar(&pciexbar, &length))
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +010044 return current;
45
Angel Ponsce3e6382020-08-03 18:57:34 +020046 const int max_buses = length / MiB;
47
Vladimir Serbinenkoc6f6be02013-11-12 22:32:08 +010048 current += acpi_create_mcfg_mmconfig((acpi_mcfg_mmconfig_t *) current,
49 pciexbar, 0x0, 0x0, max_buses - 1);
50
51 return current;
52}