blob: 87cd69f989d8bf53bc2daa219bfc3f9bc1af17a5 [file] [log] [blame]
Marek Vasut6d8b3762025-06-17 10:16:31 +02001// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * PCIe controller driver for Renesas R-Car Gen4 Series SoCs
4 * Copyright (C) 2025 Marek Vasut <marek.vasut+renesas@mailbox.org>
5 * Based on Linux kernel driver
6 * Copyright (C) 2022-2023 Renesas Electronics Corporation
7 *
8 * The r8a779g0 (R-Car V4H) controller requires a specific firmware to be
9 * provided, to initialize the PHY. Otherwise, the PCIe controller will not
10 * work.
11 */
12
13#include <asm-generic/gpio.h>
14#include <asm/arch/gpio.h>
15#include <asm/global_data.h>
16#include <asm/io.h>
17#include <clk.h>
18#include <command.h>
19#include <dm.h>
20#include <dm/device_compat.h>
21#include <env.h>
22#include <log.h>
23#include <reset.h>
24
25#include <linux/bitfield.h>
26#include <linux/bitops.h>
27#include <linux/delay.h>
28#include <linux/err.h>
29#include <linux/iopoll.h>
30
31#include "pcie_dw_common.h"
32
33/* Renesas-specific */
34/* PCIe Mode Setting Register 0 */
35#define PCIEMSR0 0x0000
36#define APP_SRIS_MODE BIT(6)
37#define DEVICE_TYPE_EP 0
38#define DEVICE_TYPE_RC BIT(4)
39#define BIFUR_MOD_SET_ON BIT(0)
40
41/* PCIe Interrupt Status 0 */
42#define PCIEINTSTS0 0x0084
43
44/* PCIe Interrupt Status 0 Enable */
45#define PCIEINTSTS0EN 0x0310
46#define MSI_CTRL_INT BIT(26)
47#define SMLH_LINK_UP BIT(7)
48#define RDLH_LINK_UP BIT(6)
49
50/* PCIe DMA Interrupt Status Enable */
51#define PCIEDMAINTSTSEN 0x0314
52#define PCIEDMAINTSTSEN_INIT GENMASK(15, 0)
53
54/* Port Logic Registers 89 */
55#define PRTLGC89 0x0b70
56
57/* Port Logic Registers 90 */
58#define PRTLGC90 0x0b74
59
60/* PCIe Reset Control Register 1 */
61#define PCIERSTCTRL1 0x0014
62#define APP_HOLD_PHY_RST BIT(16)
63#define APP_LTSSM_ENABLE BIT(0)
64
65/* PCIe Power Management Control */
66#define PCIEPWRMNGCTRL 0x0070
67#define APP_CLK_REQ_N BIT(11)
68#define APP_CLK_PM_EN BIT(10)
69
70#define RCAR_NUM_SPEED_CHANGE_RETRIES 10
71#define RCAR_MAX_LINK_SPEED 4
72
73#define RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET 0x1000
74#define RCAR_GEN4_PCIE_EP_FUNC_DBI2_OFFSET 0x800
75
76#define RCAR_GEN4_PCIE_FIRMWARE_NAME "rcar_gen4_pcie.bin"
77#define RCAR_GEN4_PCIE_FIRMWARE_BASE_ADDR 0xc000
78
79#define PCIE_T_PVPERL_MS 100
80
81/**
82 * struct rcar_gen4_pcie - Renesas R-Car Gen4 DW PCIe controller state
83 *
84 * @rcar: The common PCIe DW structure
85 * @pwr_rst: The PWR reset of the PCIe core
86 * @core_clk: The core clock of the PCIe core
87 * @ref_clk: The reference clock of the PCIe core and possibly bus
88 * @pe_rst: PERST GPIO
89 * @app_base: The base address of application register space
90 * @dbi2_base: The base address of DBI2 register space
91 * @phy_base: The base address of PHY register space
92 * @max_link_speed: Maximum PCIe link speed supported by the setup
93 * @num_lanes: Number of PCIe lanes used by the setup
94 * @firmware: PHY firmware
95 * @firmware_size: PHY firmware size in Bytes
96 */
97struct rcar_gen4_pcie {
98 /* Must be first member of the struct */
99 struct pcie_dw dw;
100 struct reset_ctl pwr_rst;
101 struct clk *core_clk;
102 struct clk *ref_clk;
103 struct gpio_desc pe_rst;
104 void *app_base;
105 void *dbi2_base;
106 void *phy_base;
107 u32 max_link_speed;
108 u32 num_lanes;
109 u16 *firmware;
110 u32 firmware_size;
111};
112
113/* Common */
114static bool rcar_gen4_pcie_link_up(struct rcar_gen4_pcie *rcar)
115{
116 u32 val, mask;
117
118 val = readl(rcar->app_base + PCIEINTSTS0);
119 mask = RDLH_LINK_UP | SMLH_LINK_UP;
120
121 return (val & mask) == mask;
122}
123
124/*
125 * Manually initiate the speed change. Return 0 if change succeeded; otherwise
126 * -ETIMEDOUT.
127 */
128static int rcar_gen4_pcie_speed_change(struct rcar_gen4_pcie *rcar)
129{
130 u32 val;
131 int i;
132
133 clrbits_le32(rcar->dw.dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL,
134 PORT_LOGIC_SPEED_CHANGE);
135
136 setbits_le32(rcar->dw.dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL,
137 PORT_LOGIC_SPEED_CHANGE);
138
139 for (i = 0; i < RCAR_NUM_SPEED_CHANGE_RETRIES; i++) {
140 val = readl(rcar->dw.dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL);
141 if (!(val & PORT_LOGIC_SPEED_CHANGE))
142 return 0;
143 mdelay(10);
144 }
145
146 return -ETIMEDOUT;
147}
148
149/*
150 * SoC datasheet suggests checking port logic register bits during firmware
151 * write. If read returns non-zero value, then this function returns -EAGAIN
152 * indicating that the write needs to be done again. If read returns zero,
153 * then return 0 to indicate success.
154 */
155static int rcar_gen4_pcie_reg_test_bit(struct rcar_gen4_pcie *rcar,
156 u32 offset, u32 mask)
157{
158 if (readl(rcar->dw.dbi_base + offset) & mask)
159 return -EAGAIN;
160
161 return 0;
162}
163
164static int rcar_gen4_pcie_download_phy_firmware(struct rcar_gen4_pcie *rcar)
165{
166 /* The check_addr values are magical numbers in the datasheet */
167 static const u32 check_addr[] = {
168 0x00101018,
169 0x00101118,
170 0x00101021,
171 0x00101121,
172 };
173 unsigned int i, timeout;
174 u32 data;
175 int ret;
176
177 for (i = 0; i < rcar->firmware_size / 2; i++) {
178 data = rcar->firmware[i];
179 timeout = 100;
180 do {
181 writel(RCAR_GEN4_PCIE_FIRMWARE_BASE_ADDR + i, rcar->dw.dbi_base + PRTLGC89);
182 writel(data, rcar->dw.dbi_base + PRTLGC90);
183 if (!rcar_gen4_pcie_reg_test_bit(rcar, PRTLGC89, BIT(30)))
184 break;
185 if (!(--timeout))
186 return -ETIMEDOUT;
187 udelay(100);
188 } while (1);
189 }
190
191 setbits_le32(rcar->phy_base + 0x0f8, BIT(17));
192
193 for (i = 0; i < ARRAY_SIZE(check_addr); i++) {
194 timeout = 100;
195 do {
196 writel(check_addr[i], rcar->dw.dbi_base + PRTLGC89);
197 ret = rcar_gen4_pcie_reg_test_bit(rcar, PRTLGC89, BIT(30));
198 ret |= rcar_gen4_pcie_reg_test_bit(rcar, PRTLGC90, BIT(0));
199 if (!ret)
200 break;
201 if (!(--timeout))
202 return -ETIMEDOUT;
203 udelay(100);
204 } while (1);
205 }
206
207 return ret;
208}
209
210static int rcar_gen4_pcie_ltssm_control(struct rcar_gen4_pcie *rcar, bool enable)
211{
212 u32 val;
213 int ret;
214
215 if (!enable) {
216 clrbits_le32(rcar->app_base + PCIERSTCTRL1, APP_LTSSM_ENABLE);
217 return 0;
218 }
219
220 setbits_le32(rcar->dw.dbi_base + PCIE_PORT_FORCE,
221 PORT_FORCE_DO_DESKEW_FOR_SRIS);
222
223 setbits_le32(rcar->app_base + PCIEMSR0, APP_SRIS_MODE);
224
225 /*
226 * The R-Car Gen4 datasheet doesn't describe the PHY registers' name.
227 * But, the initialization procedure describes these offsets. So,
228 * this driver has magical offset numbers.
229 */
230 clrsetbits_le32(rcar->phy_base + 0x700, BIT(28), 0);
231 clrsetbits_le32(rcar->phy_base + 0x700, BIT(20), 0);
232 clrsetbits_le32(rcar->phy_base + 0x700, BIT(12), 0);
233 clrsetbits_le32(rcar->phy_base + 0x700, BIT(4), 0);
234
235 clrsetbits_le32(rcar->phy_base + 0x148, GENMASK(23, 22), BIT(22));
236 clrsetbits_le32(rcar->phy_base + 0x148, GENMASK(18, 16), GENMASK(17, 16));
237 clrsetbits_le32(rcar->phy_base + 0x148, GENMASK(7, 6), BIT(6));
238 clrsetbits_le32(rcar->phy_base + 0x148, GENMASK(2, 0), GENMASK(11, 0));
239 clrsetbits_le32(rcar->phy_base + 0x1d4, GENMASK(16, 15), GENMASK(16, 15));
240 clrsetbits_le32(rcar->phy_base + 0x514, BIT(26), BIT(26));
241 clrsetbits_le32(rcar->phy_base + 0x0f8, BIT(16), 0);
242 clrsetbits_le32(rcar->phy_base + 0x0f8, BIT(19), BIT(19));
243
244 clrbits_le32(rcar->app_base + PCIERSTCTRL1, APP_HOLD_PHY_RST);
245
246 ret = readl_poll_timeout(rcar->phy_base + 0x0f8, val, !(val & BIT(18)), 10000);
247 if (ret < 0)
248 return ret;
249
250 ret = rcar_gen4_pcie_download_phy_firmware(rcar);
251 if (ret)
252 return ret;
253
254 setbits_le32(rcar->app_base + PCIERSTCTRL1, APP_LTSSM_ENABLE);
255
256 return 0;
257}
258
259/*
260 * Enable LTSSM of this controller and manually initiate the speed change.
261 * Always return 0.
262 */
263static int rcar_gen4_pcie_start_link(struct rcar_gen4_pcie *rcar)
264{
265 int i, ret;
266
267 ret = rcar_gen4_pcie_ltssm_control(rcar, true);
268 if (ret)
269 return ret;
270
271 /*
272 * Require direct speed change with retrying here if the max_link_speed
273 * is PCIe Gen2 or higher.
274 */
275 if (rcar->max_link_speed == LINK_SPEED_GEN_1)
276 return 0;
277
278 for (i = 0; i < RCAR_MAX_LINK_SPEED; i++) {
279 /* It may not be connected in EP mode yet. So, break the loop */
280 if (rcar_gen4_pcie_speed_change(rcar))
281 break;
282 }
283
284 return 0;
285}
286
287static void rcar_gen4_pcie_additional_common_init(struct rcar_gen4_pcie *rcar)
288{
289 clrsetbits_le32(rcar->dw.dbi_base + PCIE_PORT_LANE_SKEW,
290 PORT_LANE_SKEW_INSERT_MASK,
291 (rcar->num_lanes < 4) ? BIT(6) : 0);
292
293 setbits_le32(rcar->app_base + PCIEPWRMNGCTRL,
294 APP_CLK_REQ_N | APP_CLK_PM_EN);
295}
296
297static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
298{
299 int ret;
300
301 ret = clk_prepare_enable(rcar->core_clk);
302 if (ret)
303 return ret;
304
305 ret = reset_assert(&rcar->pwr_rst);
306 if (ret)
307 goto err_unprepare;
308
309 setbits_le32(rcar->app_base + PCIEMSR0,
310 DEVICE_TYPE_RC |
311 ((rcar->num_lanes < 4) ? BIFUR_MOD_SET_ON : 0));
312
313 ret = reset_deassert(&rcar->pwr_rst);
314 if (ret)
315 goto err_unprepare;
316
317 rcar_gen4_pcie_additional_common_init(rcar);
318
319 return 0;
320
321err_unprepare:
322 clk_disable_unprepare(rcar->core_clk);
323
324 return ret;
325}
326
327/* Host mode */
328static int rcar_gen4_pcie_host_init(struct udevice *dev)
329{
330 struct rcar_gen4_pcie *rcar = dev_get_priv(dev);
331 int ret;
332
333 dm_gpio_set_value(&rcar->pe_rst, 1);
334
335 ret = rcar_gen4_pcie_common_init(rcar);
336 if (ret)
337 return ret;
338
339 /*
340 * According to the section 3.5.7.2 "RC Mode" in DWC PCIe Dual Mode
341 * Rev.5.20a and 3.5.6.1 "RC mode" in DWC PCIe RC databook v5.20a, we
342 * should disable two BARs to avoid unnecessary memory assignment
343 * during device enumeration.
344 */
345 writel(0x0, rcar->dbi2_base + PCI_BASE_ADDRESS_0);
346 writel(0x0, rcar->dbi2_base + PCI_BASE_ADDRESS_1);
347
348 /* Disable MSI interrupt signal */
349 clrbits_le32(rcar->app_base + PCIEINTSTS0EN, MSI_CTRL_INT);
350
351 mdelay(PCIE_T_PVPERL_MS); /* pe_rst requires 100msec delay */
352
353 dm_gpio_set_value(&rcar->pe_rst, 0);
354
355 return 0;
356}
357
358static int rcar_gen4_pcie_load_firmware(struct rcar_gen4_pcie *rcar)
359{
360 ulong addr, size;
361 int ret;
362
363 /*
364 * Run user specified firmware loading script, which loads the
365 * firmware from whichever location the user decides it should
366 * load the firmware from, by whatever means the user decides.
367 */
368 ret = run_command_list("run renesas_rcar_gen4_load_firmware", -1, 0);
369 if (ret) {
370 printf("Firmware loading script 'renesas_rcar_gen4_load_firmware' not defined or failed.\n");
371 goto fail;
372 }
373
374 /* Find out where the firmware got loaded and how long it is. */
375 addr = env_get_hex("renesas_rcar_gen4_load_firmware_addr", 0);
376 size = env_get_hex("renesas_rcar_gen4_load_firmware_size", 0);
377
378 /*
379 * Clear the variables set by the firmware loading script, as
380 * their content would become stale once this function exits.
381 */
382 env_set("renesas_rcar_gen4_load_firmware_addr", NULL);
383 env_set("renesas_rcar_gen4_load_firmware_size", NULL);
384
385 if (!addr || !size) {
386 printf("Firmware address (%lx) or size (%lx) are invalid.\n", addr, size);
387 goto fail;
388 }
389
390 /* Create local copy of the loaded firmware. */
391 rcar->firmware = (u16 *)memdup((void *)addr, size);
392 if (!rcar->firmware)
393 return -ENOMEM;
394
395 rcar->firmware_size = size;
396
397 return 0;
398
399fail:
400 printf("Define 'renesas_rcar_gen4_load_firmware' script which loads the R-Car\n"
401 "Gen4 PCIe controller firmware from storage into memory and sets these\n"
402 "two environment variables:\n"
403 " renesas_rcar_gen4_load_firmware_addr ... address of firmware in memory\n"
404 " renesas_rcar_gen4_load_firmware_size ... length of firmware in bytes\n"
405 "\n"
406 "Example:\n"
407 " => env set renesas_rcar_gen4_load_firmware 'env set renesas_rcar_gen4_load_firmware_addr 0x54000000 && load mmc 0:1 ${renesas_rcar_gen4_load_firmware_addr} lib/firmware/rcar_gen4_pcie.bin && env set renesas_rcar_gen4_load_firmware_size ${filesize}'\n"
408 );
409 return -EINVAL;
410}
411
412/**
413 * rcar_gen4_pcie_probe() - Probe the PCIe bus for active link
414 *
415 * @dev: A pointer to the device being operated on
416 *
417 * Probe for an active link on the PCIe bus and configure the controller
418 * to enable this port.
419 *
420 * Return: 0 on success, else -ENODEV
421 */
422static int rcar_gen4_pcie_probe(struct udevice *dev)
423{
424 struct rcar_gen4_pcie *rcar = dev_get_priv(dev);
425 struct udevice *ctlr = pci_get_controller(dev);
426 struct pci_controller *hose = dev_get_uclass_priv(ctlr);
427 int ret;
428
429 ret = rcar_gen4_pcie_load_firmware(rcar);
430 if (ret)
431 return ret;
432
433 rcar->dw.first_busno = dev_seq(dev);
434 rcar->dw.dev = dev;
435
436 ret = reset_get_by_name(dev, "pwr", &rcar->pwr_rst);
437 if (ret)
438 return ret;
439
440 rcar->core_clk = devm_clk_get(dev, "core");
441 if (IS_ERR(rcar->core_clk))
442 return PTR_ERR(rcar->core_clk);
443
444 rcar->ref_clk = devm_clk_get(dev, "ref");
445 if (IS_ERR(rcar->ref_clk))
446 return PTR_ERR(rcar->ref_clk);
447
448 ret = clk_prepare_enable(rcar->ref_clk);
449 if (ret)
450 return ret;
451
452 ret = gpio_request_by_name(dev, "reset-gpios", 0, &rcar->pe_rst,
453 GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
454 if (ret)
455 return ret;
456
457 ret = rcar_gen4_pcie_host_init(dev);
458 if (ret)
459 return ret;
460
461 pcie_dw_setup_host(&rcar->dw);
462
463 dw_pcie_dbi_write_enable(&rcar->dw, true);
464
465 dw_pcie_link_set_max_link_width(&rcar->dw, rcar->num_lanes);
466
467 ret = rcar_gen4_pcie_start_link(rcar);
468 if (ret)
469 return ret;
470
471 dw_pcie_dbi_write_enable(&rcar->dw, false);
472
473 if (!rcar_gen4_pcie_link_up(rcar)) {
474 printf("PCIE-%d: Link down\n", dev_seq(dev));
475 return -ENODEV;
476 }
477
478 printf("PCIE-%d: Link up (Gen%d-x%d, Bus%d)\n", dev_seq(dev),
479 pcie_dw_get_link_speed(&rcar->dw),
480 pcie_dw_get_link_width(&rcar->dw),
481 hose->first_busno);
482
483 pcie_dw_prog_outbound_atu_unroll(&rcar->dw, PCIE_ATU_REGION_INDEX0,
484 PCIE_ATU_TYPE_MEM,
485 rcar->dw.mem.phys_start,
486 rcar->dw.mem.bus_start, rcar->dw.mem.size);
487
488 return 0;
489}
490
491/**
492 * rcar_gen4_pcie_of_to_plat() - Translate from DT to device state
493 *
494 * @dev: A pointer to the device being operated on
495 *
496 * Translate relevant data from the device tree pertaining to device @dev into
497 * state that the driver will later make use of. This state is stored in the
498 * device's private data structure.
499 *
500 * Return: 0 on success, else -EINVAL
501 */
502static int rcar_gen4_pcie_of_to_plat(struct udevice *dev)
503{
504 struct rcar_gen4_pcie *rcar = dev_get_priv(dev);
505
506 /* Get the controller base address */
507 rcar->dw.dbi_base = (void *)dev_read_addr_name(dev, "dbi");
508 if ((fdt_addr_t)rcar->dw.dbi_base == FDT_ADDR_T_NONE)
509 return -EINVAL;
510
511 /* Get the config space base address and size */
512 rcar->dw.cfg_base = (void *)dev_read_addr_size_name(dev, "config",
513 &rcar->dw.cfg_size);
514 if ((fdt_addr_t)rcar->dw.cfg_base == FDT_ADDR_T_NONE)
515 return -EINVAL;
516
517 /* Get the iATU base address and size */
518 rcar->dw.atu_base = (void *)dev_read_addr_name(dev, "atu");
519 if ((fdt_addr_t)rcar->dw.atu_base == FDT_ADDR_T_NONE)
520 return -EINVAL;
521
522 /* Get the PHY base address and size */
523 rcar->phy_base = (void *)dev_read_addr_name(dev, "phy");
524 if ((fdt_addr_t)rcar->phy_base == FDT_ADDR_T_NONE)
525 return -EINVAL;
526
527 /* Get the app base address and size */
528 rcar->app_base = (void *)dev_read_addr_name(dev, "app");
529 if ((fdt_addr_t)rcar->app_base == FDT_ADDR_T_NONE)
530 return -EINVAL;
531
532 /* Get the dbi2 base address and size */
533 rcar->dbi2_base = (void *)dev_read_addr_name(dev, "dbi2");
534 if ((fdt_addr_t)rcar->dbi2_base == FDT_ADDR_T_NONE)
535 return -EINVAL;
536
537 rcar->max_link_speed =
538 clamp(dev_read_u32_default(dev, "max-link-speed",
539 LINK_SPEED_GEN_4),
540 LINK_SPEED_GEN_1, RCAR_MAX_LINK_SPEED);
541
542 rcar->num_lanes = dev_read_u32_default(dev, "num-lanes", 4);
543
544 return 0;
545}
546
547static const struct dm_pci_ops rcar_gen4_pcie_ops = {
548 .read_config = pcie_dw_read_config,
549 .write_config = pcie_dw_write_config,
550};
551
552static const struct udevice_id rcar_gen4_pcie_ids[] = {
553 { .compatible = "renesas,rcar-gen4-pcie" },
554 { }
555};
556
557U_BOOT_DRIVER(rcar_gen4_pcie) = {
558 .name = "rcar_gen4_pcie",
559 .id = UCLASS_PCI,
560 .of_match = rcar_gen4_pcie_ids,
561 .ops = &rcar_gen4_pcie_ops,
562 .of_to_plat = rcar_gen4_pcie_of_to_plat,
563 .probe = rcar_gen4_pcie_probe,
564 .priv_auto = sizeof(struct rcar_gen4_pcie),
565};