blob: c03f5a9d367dfb9bcbb068871e0ee28fc23fe25f [file] [log] [blame]
Angel Pons0612b272020-04-05 15:46:56 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Furquan Shaikha8198eb2017-08-04 16:12:19 -07002
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Patrick Rudolph49ae5962020-04-15 11:19:31 +02004#include <acpi/acpigen.h>
Kyösti Mälkki5daa1d32020-06-14 12:01:58 +03005#include <acpi/acpi_gnvs.h>
Subrata Banikafa07f72018-05-24 12:21:06 +05306#include <console/uart.h>
Aamir Bohra83f7bae2017-04-26 19:30:41 +05307#include <device/device.h>
8#include <device/pci.h>
Aamir Bohra83f7bae2017-04-26 19:30:41 +05309#include <device/pci_ids.h>
Furquan Shaikha8198eb2017-08-04 16:12:19 -070010#include <device/pci_ops.h>
Tim Wawrzynczakf9bb1b42021-06-25 13:02:16 -060011#include <intelblocks/irq.h>
Aamir Bohra01d75f42017-03-30 20:12:21 +053012#include <intelblocks/lpss.h>
13#include <intelblocks/uart.h>
Subrata Banikafa07f72018-05-24 12:21:06 +053014#include <soc/pci_devs.h>
15#include <soc/iomap.h>
16#include <soc/nvs.h>
Patrick Rudolph49ae5962020-04-15 11:19:31 +020017#include "chip.h"
Aamir Bohra01d75f42017-03-30 20:12:21 +053018
Furquan Shaikha8198eb2017-08-04 16:12:19 -070019#define UART_PCI_ENABLE (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER)
Subrata Banikafa07f72018-05-24 12:21:06 +053020
Michael Niewöhner405f2292020-12-21 03:46:58 +010021extern const unsigned int uart_devices[];
22extern const int uart_devices_size;
Furquan Shaikha8198eb2017-08-04 16:12:19 -070023
Furquan Shaikh582a0e22021-01-07 00:16:35 -080024static void uart_lpss_init(pci_devfn_t dev, uintptr_t baseaddr)
Furquan Shaikh3406dd62017-08-04 15:58:26 -070025{
Usha P5e59a822019-08-09 18:42:00 +053026 /* Ensure controller is in D0 state */
Furquan Shaikh582a0e22021-01-07 00:16:35 -080027 lpss_set_power_state(dev, STATE_D0);
Usha P5e59a822019-08-09 18:42:00 +053028
Furquan Shaikh3406dd62017-08-04 15:58:26 -070029 /* Take UART out of reset */
30 lpss_reset_release(baseaddr);
31
32 /* Set M and N divisor inputs and enable clock */
33 lpss_clk_update(baseaddr, CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL,
34 CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL);
35}
36
Nico Huber62ddc492019-05-29 18:39:31 +020037#if CONFIG(INTEL_LPSS_UART_FOR_CONSOLE)
Felix Helde3a12472020-09-11 15:47:09 +020038uintptr_t uart_platform_base(unsigned int idx)
Aamir Bohra01d75f42017-03-30 20:12:21 +053039{
Nico Huberce8eebd2019-05-29 18:33:35 +020040 if (idx == CONFIG_UART_FOR_CONSOLE)
Nico Huber99954182019-05-29 23:33:06 +020041 return CONFIG_CONSOLE_UART_BASE_ADDRESS;
Nico Huberce8eebd2019-05-29 18:33:35 +020042 return 0;
Subrata Banikafa07f72018-05-24 12:21:06 +053043}
44#endif
45
Furquan Shaikh582a0e22021-01-07 00:16:35 -080046static pci_devfn_t uart_console_get_pci_bdf(void)
Subrata Banikafa07f72018-05-24 12:21:06 +053047{
Furquan Shaikh582a0e22021-01-07 00:16:35 -080048 int devfn;
Subrata Banikafa07f72018-05-24 12:21:06 +053049
Furquan Shaikha8198eb2017-08-04 16:12:19 -070050 /*
Nico Hubera96e66a2018-11-11 02:51:14 +010051 * This function will get called even if INTEL_LPSS_UART_FOR_CONSOLE
52 * config option is not selected.
53 * By default return NULL in this case to avoid compilation errors.
Furquan Shaikha8198eb2017-08-04 16:12:19 -070054 */
Julius Wernercd49cce2019-03-05 16:53:33 -080055 if (!CONFIG(INTEL_LPSS_UART_FOR_CONSOLE))
Furquan Shaikh582a0e22021-01-07 00:16:35 -080056 return PCI_DEV_INVALID;
57
Michael Niewöhner405f2292020-12-21 03:46:58 +010058 if (CONFIG_UART_FOR_CONSOLE > uart_devices_size)
Furquan Shaikh582a0e22021-01-07 00:16:35 -080059 return PCI_DEV_INVALID;
60
Michael Niewöhner405f2292020-12-21 03:46:58 +010061 devfn = uart_devices[CONFIG_UART_FOR_CONSOLE];
62 if (devfn == PCI_DEVFN_INVALID)
63 return PCI_DEV_INVALID;
64
Furquan Shaikh582a0e22021-01-07 00:16:35 -080065 return PCI_DEV(0, PCI_SLOT(devfn), PCI_FUNC(devfn));
66}
67
68const struct device *uart_get_device(void)
69{
70 pci_devfn_t dev = uart_console_get_pci_bdf();
71 if (dev == PCI_DEV_INVALID)
Subrata Banikafa07f72018-05-24 12:21:06 +053072 return NULL;
73
Furquan Shaikh582a0e22021-01-07 00:16:35 -080074 return pcidev_path_on_root(PCI_DEV2DEVFN(dev));
Furquan Shaikha8198eb2017-08-04 16:12:19 -070075}
76
Subrata Banikafa07f72018-05-24 12:21:06 +053077bool uart_is_controller_initialized(void)
Furquan Shaikha8198eb2017-08-04 16:12:19 -070078{
Furquan Shaikha8198eb2017-08-04 16:12:19 -070079 uintptr_t base;
Furquan Shaikh582a0e22021-01-07 00:16:35 -080080 pci_devfn_t dev = uart_console_get_pci_bdf();
Aamir Bohra17cfba62019-07-25 20:56:54 +053081
Furquan Shaikh582a0e22021-01-07 00:16:35 -080082 if (dev == PCI_DEV_INVALID)
Aamir Bohra17cfba62019-07-25 20:56:54 +053083 return false;
Furquan Shaikha8198eb2017-08-04 16:12:19 -070084
Furquan Shaikh582a0e22021-01-07 00:16:35 -080085 base = pci_s_read_config32(dev, PCI_BASE_ADDRESS_0) & ~0xFFF;
Furquan Shaikha8198eb2017-08-04 16:12:19 -070086 if (!base)
87 return false;
88
Furquan Shaikh582a0e22021-01-07 00:16:35 -080089 if ((pci_s_read_config16(dev, PCI_COMMAND) & UART_PCI_ENABLE)
Furquan Shaikha8198eb2017-08-04 16:12:19 -070090 != UART_PCI_ENABLE)
91 return false;
92
93 return !lpss_is_controller_in_reset(base);
Aamir Bohra01d75f42017-03-30 20:12:21 +053094}
Aamir Bohra83f7bae2017-04-26 19:30:41 +053095
Subrata Banikafa07f72018-05-24 12:21:06 +053096void uart_bootblock_init(void)
Furquan Shaikha8198eb2017-08-04 16:12:19 -070097{
Furquan Shaikh582a0e22021-01-07 00:16:35 -080098 const uint32_t baseaddr = CONFIG_CONSOLE_UART_BASE_ADDRESS;
99 pci_devfn_t dev = uart_console_get_pci_bdf();
Aamir Bohra17cfba62019-07-25 20:56:54 +0530100
Furquan Shaikh582a0e22021-01-07 00:16:35 -0800101 if (dev == PCI_DEV_INVALID)
Aamir Bohra17cfba62019-07-25 20:56:54 +0530102 return;
103
Furquan Shaikh582a0e22021-01-07 00:16:35 -0800104 /* Set UART base address */
105 pci_s_write_config32(dev, PCI_BASE_ADDRESS_0, baseaddr);
106
107 /* Enable memory access and bus master */
108 pci_s_write_config16(dev, PCI_COMMAND, UART_PCI_ENABLE);
109
110 uart_lpss_init(dev, baseaddr);
Subrata Banikafa07f72018-05-24 12:21:06 +0530111}
112
113#if ENV_RAMSTAGE
114
115static void uart_read_resources(struct device *dev)
116{
117 pci_dev_read_resources(dev);
118
119 /* Set the configured UART base address for the debug port */
Julius Wernercd49cce2019-03-05 16:53:33 -0800120 if (CONFIG(INTEL_LPSS_UART_FOR_CONSOLE) &&
Nico Hubera96e66a2018-11-11 02:51:14 +0100121 uart_is_debug_controller(dev)) {
Subrata Banikafa07f72018-05-24 12:21:06 +0530122 struct resource *res = find_resource(dev, PCI_BASE_ADDRESS_0);
123 /* Need to set the base and size for the resource allocator. */
Nico Huber99954182019-05-29 23:33:06 +0200124 res->base = CONFIG_CONSOLE_UART_BASE_ADDRESS;
125 res->size = 0x1000;
Subrata Banikafa07f72018-05-24 12:21:06 +0530126 res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
127 IORESOURCE_FIXED;
128 }
Patrick Rudolphe42ce6b2021-06-07 16:46:40 +0200129 /* In ACPI mode mark the decoded region as reserved */
130 if (dev->hidden) {
131 struct resource *res = find_resource(dev, PCI_BASE_ADDRESS_0);
132 res->flags |= IORESOURCE_RESERVE;
133 }
Subrata Banikafa07f72018-05-24 12:21:06 +0530134}
135
136/*
137 * Check if UART debug port controller needs to be initialized on resume.
138 *
139 * Returns:
140 * true = when SoC wants debug port initialization on resume
141 * false = otherwise
142 */
143static bool pch_uart_init_debug_controller_on_resume(void)
144{
Kyösti Mälkki0c1dd9c2020-06-17 23:37:49 +0300145 struct global_nvs *gnvs = acpi_get_gnvs();
Subrata Banikafa07f72018-05-24 12:21:06 +0530146
147 if (gnvs)
148 return !!gnvs->uior;
149
Furquan Shaikha8198eb2017-08-04 16:12:19 -0700150 return false;
151}
152
153bool uart_is_debug_controller(struct device *dev)
154{
Subrata Banikafa07f72018-05-24 12:21:06 +0530155 return dev == uart_get_device();
Furquan Shaikha8198eb2017-08-04 16:12:19 -0700156}
157
158/*
159 * This is a workaround to enable UART controller for the debug port if:
160 * 1. CONSOLE_SERIAL is not enabled in coreboot, and
161 * 2. This boot is S3 resume, and
162 * 3. SoC wants to initialize debug UART controller.
163 *
164 * This workaround is required because Linux kernel hangs on resume if console
165 * is not enabled in coreboot, but it is enabled in kernel and not suspended.
166 */
167static bool uart_controller_needs_init(struct device *dev)
168{
169 /*
Jonathan Neuschäfer5268b762018-02-12 12:24:25 +0100170 * If coreboot has CONSOLE_SERIAL enabled, the skip re-initializing
Furquan Shaikha8198eb2017-08-04 16:12:19 -0700171 * controller here.
172 */
Julius Wernercd49cce2019-03-05 16:53:33 -0800173 if (CONFIG(CONSOLE_SERIAL))
Furquan Shaikha8198eb2017-08-04 16:12:19 -0700174 return false;
175
176 /* If this device does not correspond to debug port, then skip. */
177 if (!uart_is_debug_controller(dev))
178 return false;
179
180 /* Initialize UART controller only on S3 resume. */
181 if (!acpi_is_wakeup_s3())
182 return false;
183
184 /*
Subrata Banikafa07f72018-05-24 12:21:06 +0530185 * check if SOC wants to initialize UART on resume
Furquan Shaikha8198eb2017-08-04 16:12:19 -0700186 */
187 return pch_uart_init_debug_controller_on_resume();
188}
189
190static void uart_common_enable_resources(struct device *dev)
191{
192 pci_dev_enable_resources(dev);
193
194 if (uart_controller_needs_init(dev)) {
195 uintptr_t base;
196
197 base = pci_read_config32(dev, PCI_BASE_ADDRESS_0) & ~0xFFF;
198 if (base)
Furquan Shaikh582a0e22021-01-07 00:16:35 -0800199 uart_lpss_init(PCI_BDF(dev), base);
Furquan Shaikha8198eb2017-08-04 16:12:19 -0700200 }
201}
202
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200203static void uart_acpi_write_irq(const struct device *dev)
204{
Tim Wawrzynczakf9bb1b42021-06-25 13:02:16 -0600205 if (CONFIG(SOC_INTEL_COMMON_BLOCK_IRQ)) {
206 const int irq = get_pci_devfn_irq(dev->path.pci.devfn);
207 if (irq != INVALID_IRQ) {
208 struct acpi_irq airq = (struct acpi_irq)ACPI_IRQ_LEVEL_LOW(irq);
209 acpi_device_write_interrupt(&airq);
210 }
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200211 }
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200212}
213
214/*
215 * Generate an ACPI entry if the device is enabled in devicetree for the ACPI
216 * LPSS driver. In this mode the device and vendor ID reads as 0xffff, but the
217 * PCI device is still there.
218 */
219static void uart_fill_ssdt(const struct device *dev)
220{
221 const char *scope = acpi_device_scope(dev);
222 const char *hid = acpi_device_hid(dev);
223 struct resource *res;
224
225 /* In ACPI mode the device is "invisible" */
226 if (!dev->hidden)
227 return;
228
229 if (!scope || !hid)
230 return;
231
232 res = probe_resource(dev, PCI_BASE_ADDRESS_0);
233 if (!res)
234 return;
235
236 /* Scope */
237 acpigen_write_scope(scope);
238
239 /* Device */
240 acpigen_write_device(acpi_device_name(dev));
241 acpigen_write_name_string("_HID", hid);
242 /*
243 * Advertise compatibility to Sunrise Point, as the Linux kernel doesn't support
244 * CannonPoint yet...
245 */
246 if (strcmp(hid, "INT34B8") == 0)
247 acpigen_write_name_string("_CID", "INT3448");
248 else if (strcmp(hid, "INT34B9") == 0)
249 acpigen_write_name_string("_CID", "INT3449");
250 else if (strcmp(hid, "INT34BA") == 0)
251 acpigen_write_name_string("_CID", "INT344A");
252
253 acpi_device_write_uid(dev);
254 acpigen_write_name_string("_DDN", "LPSS ACPI UART");
Angel Pons69a8a532022-11-30 11:23:31 +0100255
256 /* Do not hide the UART device from the OS */
257 acpigen_write_STA(ACPI_STATUS_DEVICE_ALL_ON);
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200258
259 /* Resources */
260 acpigen_write_name("_CRS");
261 acpigen_write_resourcetemplate_header();
262
263 uart_acpi_write_irq(dev);
264 acpigen_write_mem32fixed(1, res->base, res->size);
265
266 acpigen_write_resourcetemplate_footer();
267
268 acpigen_pop_len(); /* Device */
269 acpigen_pop_len(); /* Scope */
270}
271
272static const char *uart_acpi_hid(const struct device *dev)
273{
274 switch (dev->device) {
Felix Singer43b7f412022-03-07 04:34:52 +0100275 case PCI_DID_INTEL_APL_UART0:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200276 return "80865abc";
Felix Singer43b7f412022-03-07 04:34:52 +0100277 case PCI_DID_INTEL_APL_UART1:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200278 return "80865abe";
Felix Singer43b7f412022-03-07 04:34:52 +0100279 case PCI_DID_INTEL_APL_UART2:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200280 return "80865ac0";
Felix Singer43b7f412022-03-07 04:34:52 +0100281 case PCI_DID_INTEL_GLK_UART0:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200282 return "808631bc";
Felix Singer43b7f412022-03-07 04:34:52 +0100283 case PCI_DID_INTEL_GLK_UART1:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200284 return "808631be";
Felix Singer43b7f412022-03-07 04:34:52 +0100285 case PCI_DID_INTEL_GLK_UART2:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200286 return "808631c0";
Felix Singer43b7f412022-03-07 04:34:52 +0100287 case PCI_DID_INTEL_GLK_UART3:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200288 return "808631ee";
Felix Singer43b7f412022-03-07 04:34:52 +0100289 case PCI_DID_INTEL_SPT_UART0:
290 case PCI_DID_INTEL_SPT_H_UART0:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200291 return "INT3448";
Felix Singer43b7f412022-03-07 04:34:52 +0100292 case PCI_DID_INTEL_SPT_UART1:
293 case PCI_DID_INTEL_SPT_H_UART1:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200294 return "INT3449";
Felix Singer43b7f412022-03-07 04:34:52 +0100295 case PCI_DID_INTEL_SPT_UART2:
296 case PCI_DID_INTEL_SPT_H_UART2:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200297 return "INT344A";
Felix Singer43b7f412022-03-07 04:34:52 +0100298 case PCI_DID_INTEL_CNP_H_UART0:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200299 return "INT34B8";
Felix Singer43b7f412022-03-07 04:34:52 +0100300 case PCI_DID_INTEL_CNP_H_UART1:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200301 return "INT34B9";
Felix Singer43b7f412022-03-07 04:34:52 +0100302 case PCI_DID_INTEL_CNP_H_UART2:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200303 return "INT34BA";
304 default:
305 return NULL;
306 }
307}
308
309static const char *uart_acpi_name(const struct device *dev)
310{
311 switch (dev->device) {
Appukuttan V K50c8f2e2024-01-11 18:05:11 +0530312 case PCI_DID_INTEL_LNL_UART0:
Tarun Tulid8d52282022-05-03 20:34:32 +0000313 case PCI_DID_INTEL_ADP_P_UART0:
Felix Singer43b7f412022-03-07 04:34:52 +0100314 case PCI_DID_INTEL_APL_UART0:
315 case PCI_DID_INTEL_GLK_UART0:
316 case PCI_DID_INTEL_SPT_UART0:
317 case PCI_DID_INTEL_SPT_H_UART0:
318 case PCI_DID_INTEL_CNP_H_UART0:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200319 return "UAR0";
Appukuttan V K50c8f2e2024-01-11 18:05:11 +0530320 case PCI_DID_INTEL_LNL_UART1:
Tarun Tulid8d52282022-05-03 20:34:32 +0000321 case PCI_DID_INTEL_ADP_P_UART1:
Felix Singer43b7f412022-03-07 04:34:52 +0100322 case PCI_DID_INTEL_APL_UART1:
323 case PCI_DID_INTEL_GLK_UART1:
324 case PCI_DID_INTEL_SPT_UART1:
325 case PCI_DID_INTEL_SPT_H_UART1:
326 case PCI_DID_INTEL_CNP_H_UART1:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200327 return "UAR1";
Appukuttan V K50c8f2e2024-01-11 18:05:11 +0530328 case PCI_DID_INTEL_LNL_UART2:
Tarun Tulid8d52282022-05-03 20:34:32 +0000329 case PCI_DID_INTEL_ADP_P_UART2:
Felix Singer43b7f412022-03-07 04:34:52 +0100330 case PCI_DID_INTEL_APL_UART2:
331 case PCI_DID_INTEL_GLK_UART2:
332 case PCI_DID_INTEL_SPT_UART2:
333 case PCI_DID_INTEL_SPT_H_UART2:
334 case PCI_DID_INTEL_CNP_H_UART2:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200335 return "UAR2";
Tarun Tulid8d52282022-05-03 20:34:32 +0000336 case PCI_DID_INTEL_ADP_P_UART3:
Felix Singer43b7f412022-03-07 04:34:52 +0100337 case PCI_DID_INTEL_GLK_UART3:
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200338 return "UAR3";
339 default:
340 return NULL;
341 }
342}
343
Nico Huber57686192022-08-06 19:11:55 +0200344struct device_operations uart_ops = {
Elyes HAOUAS1d191272018-11-27 12:23:48 +0100345 .read_resources = uart_read_resources,
346 .set_resources = pci_dev_set_resources,
347 .enable_resources = uart_common_enable_resources,
Subrata Banik6bbc91a2017-12-07 14:55:51 +0530348 .ops_pci = &pci_dev_ops_pci,
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200349 .acpi_fill_ssdt = uart_fill_ssdt,
350 .acpi_hid = uart_acpi_hid,
351 .acpi_name = uart_acpi_name,
Aamir Bohra83f7bae2017-04-26 19:30:41 +0530352};
353
354static const unsigned short pci_device_ids[] = {
Appukuttan V K50c8f2e2024-01-11 18:05:11 +0530355 PCI_DID_INTEL_LNL_UART0,
356 PCI_DID_INTEL_LNL_UART1,
357 PCI_DID_INTEL_LNL_UART2,
Wonkyu Kim9f401072020-11-13 15:16:32 -0800358 PCI_DID_INTEL_MTL_UART0,
359 PCI_DID_INTEL_MTL_UART1,
360 PCI_DID_INTEL_MTL_UART2,
Felix Singer43b7f412022-03-07 04:34:52 +0100361 PCI_DID_INTEL_APL_UART0,
362 PCI_DID_INTEL_APL_UART1,
363 PCI_DID_INTEL_APL_UART2,
364 PCI_DID_INTEL_APL_UART3,
365 PCI_DID_INTEL_CNL_UART0,
366 PCI_DID_INTEL_CNL_UART1,
367 PCI_DID_INTEL_CNL_UART2,
368 PCI_DID_INTEL_GLK_UART0,
369 PCI_DID_INTEL_GLK_UART1,
370 PCI_DID_INTEL_GLK_UART2,
371 PCI_DID_INTEL_GLK_UART3,
372 PCI_DID_INTEL_CNP_H_UART0,
373 PCI_DID_INTEL_CNP_H_UART1,
374 PCI_DID_INTEL_CNP_H_UART2,
375 PCI_DID_INTEL_ICP_UART0,
376 PCI_DID_INTEL_ICP_UART1,
377 PCI_DID_INTEL_ICP_UART2,
378 PCI_DID_INTEL_CMP_UART0,
379 PCI_DID_INTEL_CMP_UART1,
380 PCI_DID_INTEL_CMP_UART2,
381 PCI_DID_INTEL_CMP_H_UART0,
382 PCI_DID_INTEL_CMP_H_UART1,
383 PCI_DID_INTEL_CMP_H_UART2,
384 PCI_DID_INTEL_TGP_UART0,
385 PCI_DID_INTEL_TGP_UART1,
386 PCI_DID_INTEL_TGP_UART2,
387 PCI_DID_INTEL_TGP_H_UART0,
388 PCI_DID_INTEL_TGP_H_UART1,
389 PCI_DID_INTEL_TGP_H_UART2,
390 PCI_DID_INTEL_TGP_H_UART3,
391 PCI_DID_INTEL_MCC_UART0,
392 PCI_DID_INTEL_MCC_UART1,
393 PCI_DID_INTEL_MCC_UART2,
394 PCI_DID_INTEL_JSP_UART0,
395 PCI_DID_INTEL_JSP_UART1,
396 PCI_DID_INTEL_JSP_UART2,
397 PCI_DID_INTEL_ADP_S_UART0,
398 PCI_DID_INTEL_ADP_S_UART1,
399 PCI_DID_INTEL_ADP_S_UART2,
400 PCI_DID_INTEL_ADP_S_UART3,
401 PCI_DID_INTEL_ADP_S_UART4,
402 PCI_DID_INTEL_ADP_S_UART5,
403 PCI_DID_INTEL_ADP_S_UART6,
404 PCI_DID_INTEL_ADP_P_UART0,
405 PCI_DID_INTEL_ADP_P_UART1,
406 PCI_DID_INTEL_ADP_P_UART2,
407 PCI_DID_INTEL_ADP_P_UART3,
408 PCI_DID_INTEL_ADP_P_UART4,
409 PCI_DID_INTEL_ADP_P_UART5,
410 PCI_DID_INTEL_ADP_P_UART6,
411 PCI_DID_INTEL_ADP_M_N_UART0,
412 PCI_DID_INTEL_ADP_M_N_UART1,
413 PCI_DID_INTEL_ADP_M_N_UART2,
414 PCI_DID_INTEL_ADP_M_N_UART3,
Jeremy Soller14d69d02023-05-17 14:52:03 -0600415 PCI_DID_INTEL_RPP_S_UART0,
416 PCI_DID_INTEL_RPP_S_UART1,
417 PCI_DID_INTEL_RPP_S_UART2,
418 PCI_DID_INTEL_RPP_S_UART3,
Hannah Williamsf7149652017-05-13 16:18:02 -0700419 0,
Aamir Bohra83f7bae2017-04-26 19:30:41 +0530420};
421
422static const struct pci_driver pch_uart __pci_driver = {
Nico Huber57686192022-08-06 19:11:55 +0200423 .ops = &uart_ops,
Felix Singer43b7f412022-03-07 04:34:52 +0100424 .vendor = PCI_VID_INTEL,
Aamir Bohra83f7bae2017-04-26 19:30:41 +0530425 .devices = pci_device_ids,
426};
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200427
428static void uart_enable(struct device *dev)
429{
430 struct soc_intel_common_block_uart_config *conf = dev->chip_info;
Nico Huber57686192022-08-06 19:11:55 +0200431 dev->ops = &uart_ops;
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200432 dev->device = conf ? conf->devid : 0;
433}
434
435struct chip_operations soc_intel_common_block_uart_ops = {
Nicholas Sudsgaardbfb11be2024-01-30 09:53:46 +0900436 .name = "LPSS UART in ACPI mode",
Patrick Rudolph49ae5962020-04-15 11:19:31 +0200437 .enable_dev = uart_enable
438};
439
Aamir Bohra83f7bae2017-04-26 19:30:41 +0530440#endif /* ENV_RAMSTAGE */