blob: 731ce50d4a3d3faa44eb7a19532e3282c8cf034b [file] [log] [blame]
Angel Pons0612b272020-04-05 15:46:56 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2/* This file is part of the coreboot project. */
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -07003
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02004#include <device/pci_ops.h>
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -07005#include <console/console.h>
6#include <device/device.h>
7#include <device/pci.h>
8#include <device/pci_ids.h>
Subrata Banik7837c202018-05-07 17:13:40 +05309#include <intelblocks/p2sb.h>
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -070010#include <soc/iomap.h>
Subrata Banik7837c202018-05-07 17:13:40 +053011#include <soc/p2sb.h>
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -070012#include <soc/pci_devs.h>
Subrata Banik7837c202018-05-07 17:13:40 +053013#include <string.h>
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -070014
Subrata Banik7837c202018-05-07 17:13:40 +053015#define PCH_P2SB_EPMASK(mask_number) (PCH_P2SB_EPMASK0 + ((mask_number) * 4))
16
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -070017#define HIDE_BIT (1 << 0)
18
Subrata Banik7837c202018-05-07 17:13:40 +053019void p2sb_enable_bar(void)
20{
21 /* Enable PCR Base address in PCH */
Nico Hubere5495032020-02-17 18:26:51 +010022 pci_write_config32(PCH_DEV_P2SB, PCI_BASE_ADDRESS_0, P2SB_BAR);
23 pci_write_config32(PCH_DEV_P2SB, PCI_BASE_ADDRESS_1, 0);
Subrata Banik7837c202018-05-07 17:13:40 +053024
25 /* Enable P2SB MSE */
Nico Hubere5495032020-02-17 18:26:51 +010026 pci_write_config8(PCH_DEV_P2SB, PCI_COMMAND,
Subrata Banik7837c202018-05-07 17:13:40 +053027 PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
28}
29
30/*
31 * Enable decoding for HPET range.
32 * This is needed for FspMemoryInit to store and retrieve a global data
33 * pointer.
34 */
35void p2sb_configure_hpet(void)
36{
37 /*
38 * Enable decoding for HPET memory address range.
39 * HPTC_OFFSET(0x60) bit 7, when set the P2SB will decode
40 * the High Performance Timer memory address range
41 * selected by bits 1:0
42 */
Nico Hubere5495032020-02-17 18:26:51 +010043 pci_write_config8(PCH_DEV_P2SB, HPTC_OFFSET, HPTC_ADDR_ENABLE_BIT);
Subrata Banik7837c202018-05-07 17:13:40 +053044}
45
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -070046static void p2sb_set_hide_bit(int hide)
47{
Subrata Banik7837c202018-05-07 17:13:40 +053048 const uint16_t reg = PCH_P2SB_E0 + 1;
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -070049 const uint8_t mask = HIDE_BIT;
50 uint8_t val;
51
Nico Hubere5495032020-02-17 18:26:51 +010052 val = pci_read_config8(PCH_DEV_P2SB, reg);
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -070053 val &= ~mask;
54 if (hide)
55 val |= mask;
Nico Hubere5495032020-02-17 18:26:51 +010056 pci_write_config8(PCH_DEV_P2SB, reg, val);
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -070057}
58
59void p2sb_unhide(void)
60{
61 p2sb_set_hide_bit(0);
Subrata Banik7837c202018-05-07 17:13:40 +053062
Nico Hubere5495032020-02-17 18:26:51 +010063 if (pci_read_config16(PCH_DEV_P2SB, PCI_VENDOR_ID) !=
Subrata Banik7837c202018-05-07 17:13:40 +053064 PCI_VENDOR_ID_INTEL)
Keith Short15588b02019-05-09 11:40:34 -060065 die_with_post_code(POST_HW_INIT_FAILURE,
66 "Unable to unhide PCH_DEV_P2SB device !\n");
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -070067}
68
69void p2sb_hide(void)
70{
71 p2sb_set_hide_bit(1);
Subrata Banik7837c202018-05-07 17:13:40 +053072
Nico Hubere5495032020-02-17 18:26:51 +010073 if (pci_read_config16(PCH_DEV_P2SB, PCI_VENDOR_ID) !=
Subrata Banik7837c202018-05-07 17:13:40 +053074 0xFFFF)
Keith Short15588b02019-05-09 11:40:34 -060075 die_with_post_code(POST_HW_INIT_FAILURE,
76 "Unable to hide PCH_DEV_P2SB device !\n");
Subrata Banik7837c202018-05-07 17:13:40 +053077}
78
79static void p2sb_configure_endpoints(int epmask_id, uint32_t mask)
80{
81 uint32_t reg32;
82
Nico Hubere5495032020-02-17 18:26:51 +010083 reg32 = pci_read_config32(PCH_DEV_P2SB, PCH_P2SB_EPMASK(epmask_id));
84 pci_write_config32(PCH_DEV_P2SB, PCH_P2SB_EPMASK(epmask_id),
Subrata Banik7837c202018-05-07 17:13:40 +053085 reg32 | mask);
86}
87
88static void p2sb_lock_endpoints(void)
89{
90 uint8_t reg8;
91
92 /* Set the "Endpoint Mask Lock!", P2SB PCI offset E2h bit[1] to 1. */
Nico Hubere5495032020-02-17 18:26:51 +010093 reg8 = pci_read_config8(PCH_DEV_P2SB, PCH_P2SB_E0 + 2);
94 pci_write_config8(PCH_DEV_P2SB, PCH_P2SB_E0 + 2,
Subrata Banik7837c202018-05-07 17:13:40 +053095 reg8 | P2SB_E0_MASKLOCK);
96}
97
98void p2sb_disable_sideband_access(void)
99{
100 uint32_t ep_mask[P2SB_EP_MASK_MAX_REG];
101 int i;
102
103 memset(ep_mask, 0, sizeof(ep_mask));
104
105 p2sb_soc_get_sb_mask(ep_mask, ARRAY_SIZE(ep_mask));
106
107 /* Remove the host accessing right to PSF register range. */
108 for (i = 0; i < P2SB_EP_MASK_MAX_REG; i++)
109 p2sb_configure_endpoints(i, ep_mask[i]);
110
111 p2sb_lock_endpoints();
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -0700112}
113
114static void read_resources(struct device *dev)
115{
116 /*
117 * There's only one resource on the P2SB device. It's also already
118 * manually set to a fixed address in earlier boot stages.
Patrick Rudolph8d7a89b2019-10-04 09:22:27 +0200119 * The following code makes sure that it doesn't change if the device
120 * is visible and the resource allocator is being run.
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -0700121 */
122 mmio_resource(dev, PCI_BASE_ADDRESS_0, P2SB_BAR / KiB, P2SB_SIZE / KiB);
123}
124
125static const struct device_operations device_ops = {
126 .read_resources = read_resources,
Nico Huber2f8ba692020-04-05 14:05:24 +0200127 .set_resources = noop_set_resources,
Subrata Banik6bbc91a2017-12-07 14:55:51 +0530128 .ops_pci = &pci_dev_ops_pci,
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -0700129};
130
131static const unsigned short pci_device_ids[] = {
132 PCI_DEVICE_ID_INTEL_APL_P2SB,
133 PCI_DEVICE_ID_INTEL_GLK_P2SB,
Maxim Polyakov571d07d2019-08-22 13:11:32 +0300134 PCI_DEVICE_ID_INTEL_LWB_P2SB,
135 PCI_DEVICE_ID_INTEL_LWB_P2SB_SUPER,
Patrick Rudolph8d7a89b2019-10-04 09:22:27 +0200136 PCI_DEVICE_ID_INTEL_SKL_LP_P2SB,
137 PCI_DEVICE_ID_INTEL_SKL_P2SB,
138 PCI_DEVICE_ID_INTEL_KBL_P2SB,
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -0700139 PCI_DEVICE_ID_INTEL_CNL_P2SB,
praveen hodagatta praneshe26c4a42018-09-20 03:49:45 +0800140 PCI_DEVICE_ID_INTEL_CNP_H_P2SB,
Aamir Bohra9eac0392018-06-30 12:07:04 +0530141 PCI_DEVICE_ID_INTEL_ICL_P2SB,
Ronak Kanabarda7ffb482019-02-05 01:51:13 +0530142 PCI_DEVICE_ID_INTEL_CMP_P2SB,
Gaggery Tsai12a651c2019-12-05 11:23:20 -0800143 PCI_DEVICE_ID_INTEL_CMP_H_P2SB,
Ravi Sarawadi6b5bf402019-10-21 22:25:04 -0700144 PCI_DEVICE_ID_INTEL_TGL_P2SB,
Tan, Lean Sheng26136092020-01-20 19:13:56 -0800145 PCI_DEVICE_ID_INTEL_EHL_P2SB,
Meera Ravindranath3f4af0d2020-02-12 16:01:22 +0530146 PCI_DEVICE_ID_INTEL_JSP_P2SB,
Lijian Zhaoa3cbbf72017-10-26 11:59:14 -0700147 0,
148};
149
150static const struct pci_driver pmc __pci_driver = {
151 .ops = &device_ops,
152 .vendor = PCI_VENDOR_ID_INTEL,
153 .devices = pci_device_ids,
154};