Home | History | Annotate | Download | only in pci
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Copyright 2017 NXP
      4  * Copyright 2014-2015 Freescale Semiconductor, Inc.
      5  * Layerscape PCIe driver
      6  */
      7 
      8 #include <common.h>
      9 #include <asm/arch/fsl_serdes.h>
     10 #include <pci.h>
     11 #include <asm/io.h>
     12 #include <errno.h>
     13 #include <malloc.h>
     14 #include <dm.h>
     15 #if defined(CONFIG_FSL_LSCH2) || defined(CONFIG_FSL_LSCH3) || \
     16 	defined(CONFIG_ARM)
     17 #include <asm/arch/clock.h>
     18 #endif
     19 #include "pcie_layerscape.h"
     20 
     21 DECLARE_GLOBAL_DATA_PTR;
     22 
     23 LIST_HEAD(ls_pcie_list);
     24 
     25 static unsigned int dbi_readl(struct ls_pcie *pcie, unsigned int offset)
     26 {
     27 	return in_le32(pcie->dbi + offset);
     28 }
     29 
     30 static void dbi_writel(struct ls_pcie *pcie, unsigned int value,
     31 		       unsigned int offset)
     32 {
     33 	out_le32(pcie->dbi + offset, value);
     34 }
     35 
     36 static unsigned int ctrl_readl(struct ls_pcie *pcie, unsigned int offset)
     37 {
     38 	if (pcie->big_endian)
     39 		return in_be32(pcie->ctrl + offset);
     40 	else
     41 		return in_le32(pcie->ctrl + offset);
     42 }
     43 
     44 static void ctrl_writel(struct ls_pcie *pcie, unsigned int value,
     45 			unsigned int offset)
     46 {
     47 	if (pcie->big_endian)
     48 		out_be32(pcie->ctrl + offset, value);
     49 	else
     50 		out_le32(pcie->ctrl + offset, value);
     51 }
     52 
     53 static int ls_pcie_ltssm(struct ls_pcie *pcie)
     54 {
     55 	u32 state;
     56 	uint svr;
     57 
     58 	svr = get_svr();
     59 	if (((svr >> SVR_VAR_PER_SHIFT) & SVR_LS102XA_MASK) == SVR_LS102XA) {
     60 		state = ctrl_readl(pcie, LS1021_PEXMSCPORTSR(pcie->idx));
     61 		state = (state >> LS1021_LTSSM_STATE_SHIFT) & LTSSM_STATE_MASK;
     62 	} else {
     63 		state = ctrl_readl(pcie, PCIE_PF_DBG) & LTSSM_STATE_MASK;
     64 	}
     65 
     66 	return state;
     67 }
     68 
     69 static int ls_pcie_link_up(struct ls_pcie *pcie)
     70 {
     71 	int ltssm;
     72 
     73 	ltssm = ls_pcie_ltssm(pcie);
     74 	if (ltssm < LTSSM_PCIE_L0)
     75 		return 0;
     76 
     77 	return 1;
     78 }
     79 
     80 static void ls_pcie_cfg0_set_busdev(struct ls_pcie *pcie, u32 busdev)
     81 {
     82 	dbi_writel(pcie, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0,
     83 		   PCIE_ATU_VIEWPORT);
     84 	dbi_writel(pcie, busdev, PCIE_ATU_LOWER_TARGET);
     85 }
     86 
     87 static void ls_pcie_cfg1_set_busdev(struct ls_pcie *pcie, u32 busdev)
     88 {
     89 	dbi_writel(pcie, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1,
     90 		   PCIE_ATU_VIEWPORT);
     91 	dbi_writel(pcie, busdev, PCIE_ATU_LOWER_TARGET);
     92 }
     93 
     94 static void ls_pcie_atu_outbound_set(struct ls_pcie *pcie, int idx, int type,
     95 				      u64 phys, u64 bus_addr, pci_size_t size)
     96 {
     97 	dbi_writel(pcie, PCIE_ATU_REGION_OUTBOUND | idx, PCIE_ATU_VIEWPORT);
     98 	dbi_writel(pcie, (u32)phys, PCIE_ATU_LOWER_BASE);
     99 	dbi_writel(pcie, phys >> 32, PCIE_ATU_UPPER_BASE);
    100 	dbi_writel(pcie, (u32)phys + size - 1, PCIE_ATU_LIMIT);
    101 	dbi_writel(pcie, (u32)bus_addr, PCIE_ATU_LOWER_TARGET);
    102 	dbi_writel(pcie, bus_addr >> 32, PCIE_ATU_UPPER_TARGET);
    103 	dbi_writel(pcie, type, PCIE_ATU_CR1);
    104 	dbi_writel(pcie, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
    105 }
    106 
    107 /* Use bar match mode and MEM type as default */
    108 static void ls_pcie_atu_inbound_set(struct ls_pcie *pcie, int idx,
    109 				     int bar, u64 phys)
    110 {
    111 	dbi_writel(pcie, PCIE_ATU_REGION_INBOUND | idx, PCIE_ATU_VIEWPORT);
    112 	dbi_writel(pcie, (u32)phys, PCIE_ATU_LOWER_TARGET);
    113 	dbi_writel(pcie, phys >> 32, PCIE_ATU_UPPER_TARGET);
    114 	dbi_writel(pcie, PCIE_ATU_TYPE_MEM, PCIE_ATU_CR1);
    115 	dbi_writel(pcie, PCIE_ATU_ENABLE | PCIE_ATU_BAR_MODE_ENABLE |
    116 		   PCIE_ATU_BAR_NUM(bar), PCIE_ATU_CR2);
    117 }
    118 
    119 static void ls_pcie_dump_atu(struct ls_pcie *pcie)
    120 {
    121 	int i;
    122 
    123 	for (i = 0; i < PCIE_ATU_REGION_NUM; i++) {
    124 		dbi_writel(pcie, PCIE_ATU_REGION_OUTBOUND | i,
    125 			   PCIE_ATU_VIEWPORT);
    126 		debug("iATU%d:\n", i);
    127 		debug("\tLOWER PHYS 0x%08x\n",
    128 		      dbi_readl(pcie, PCIE_ATU_LOWER_BASE));
    129 		debug("\tUPPER PHYS 0x%08x\n",
    130 		      dbi_readl(pcie, PCIE_ATU_UPPER_BASE));
    131 		debug("\tLOWER BUS  0x%08x\n",
    132 		      dbi_readl(pcie, PCIE_ATU_LOWER_TARGET));
    133 		debug("\tUPPER BUS  0x%08x\n",
    134 		      dbi_readl(pcie, PCIE_ATU_UPPER_TARGET));
    135 		debug("\tLIMIT      0x%08x\n",
    136 		      readl(pcie->dbi + PCIE_ATU_LIMIT));
    137 		debug("\tCR1        0x%08x\n",
    138 		      dbi_readl(pcie, PCIE_ATU_CR1));
    139 		debug("\tCR2        0x%08x\n",
    140 		      dbi_readl(pcie, PCIE_ATU_CR2));
    141 	}
    142 }
    143 
    144 static void ls_pcie_setup_atu(struct ls_pcie *pcie)
    145 {
    146 	struct pci_region *io, *mem, *pref;
    147 	unsigned long long offset = 0;
    148 	int idx = 0;
    149 	uint svr;
    150 
    151 	svr = get_svr();
    152 	if (((svr >> SVR_VAR_PER_SHIFT) & SVR_LS102XA_MASK) == SVR_LS102XA) {
    153 		offset = LS1021_PCIE_SPACE_OFFSET +
    154 			 LS1021_PCIE_SPACE_SIZE * pcie->idx;
    155 	}
    156 
    157 	/* ATU 0 : OUTBOUND : CFG0 */
    158 	ls_pcie_atu_outbound_set(pcie, PCIE_ATU_REGION_INDEX0,
    159 				 PCIE_ATU_TYPE_CFG0,
    160 				 pcie->cfg_res.start + offset,
    161 				 0,
    162 				 fdt_resource_size(&pcie->cfg_res) / 2);
    163 	/* ATU 1 : OUTBOUND : CFG1 */
    164 	ls_pcie_atu_outbound_set(pcie, PCIE_ATU_REGION_INDEX1,
    165 				 PCIE_ATU_TYPE_CFG1,
    166 				 pcie->cfg_res.start + offset +
    167 				 fdt_resource_size(&pcie->cfg_res) / 2,
    168 				 0,
    169 				 fdt_resource_size(&pcie->cfg_res) / 2);
    170 
    171 	pci_get_regions(pcie->bus, &io, &mem, &pref);
    172 	idx = PCIE_ATU_REGION_INDEX1 + 1;
    173 
    174 	/* Fix the pcie memory map for LS2088A series SoCs */
    175 	svr = (svr >> SVR_VAR_PER_SHIFT) & 0xFFFFFE;
    176 	if (svr == SVR_LS2088A || svr == SVR_LS2084A ||
    177 	    svr == SVR_LS2048A || svr == SVR_LS2044A ||
    178 	    svr == SVR_LS2081A || svr == SVR_LS2041A) {
    179 		if (io)
    180 			io->phys_start = (io->phys_start &
    181 					 (PCIE_PHYS_SIZE - 1)) +
    182 					 LS2088A_PCIE1_PHYS_ADDR +
    183 					 LS2088A_PCIE_PHYS_SIZE * pcie->idx;
    184 		if (mem)
    185 			mem->phys_start = (mem->phys_start &
    186 					 (PCIE_PHYS_SIZE - 1)) +
    187 					 LS2088A_PCIE1_PHYS_ADDR +
    188 					 LS2088A_PCIE_PHYS_SIZE * pcie->idx;
    189 		if (pref)
    190 			pref->phys_start = (pref->phys_start &
    191 					 (PCIE_PHYS_SIZE - 1)) +
    192 					 LS2088A_PCIE1_PHYS_ADDR +
    193 					 LS2088A_PCIE_PHYS_SIZE * pcie->idx;
    194 	}
    195 
    196 	if (io)
    197 		/* ATU : OUTBOUND : IO */
    198 		ls_pcie_atu_outbound_set(pcie, idx++,
    199 					 PCIE_ATU_TYPE_IO,
    200 					 io->phys_start + offset,
    201 					 io->bus_start,
    202 					 io->size);
    203 
    204 	if (mem)
    205 		/* ATU : OUTBOUND : MEM */
    206 		ls_pcie_atu_outbound_set(pcie, idx++,
    207 					 PCIE_ATU_TYPE_MEM,
    208 					 mem->phys_start + offset,
    209 					 mem->bus_start,
    210 					 mem->size);
    211 
    212 	if (pref)
    213 		/* ATU : OUTBOUND : pref */
    214 		ls_pcie_atu_outbound_set(pcie, idx++,
    215 					 PCIE_ATU_TYPE_MEM,
    216 					 pref->phys_start + offset,
    217 					 pref->bus_start,
    218 					 pref->size);
    219 
    220 	ls_pcie_dump_atu(pcie);
    221 }
    222 
    223 /* Return 0 if the address is valid, -errno if not valid */
    224 static int ls_pcie_addr_valid(struct ls_pcie *pcie, pci_dev_t bdf)
    225 {
    226 	struct udevice *bus = pcie->bus;
    227 
    228 	if (!pcie->enabled)
    229 		return -ENXIO;
    230 
    231 	if (PCI_BUS(bdf) < bus->seq)
    232 		return -EINVAL;
    233 
    234 	if ((PCI_BUS(bdf) > bus->seq) && (!ls_pcie_link_up(pcie)))
    235 		return -EINVAL;
    236 
    237 	if (PCI_BUS(bdf) <= (bus->seq + 1) && (PCI_DEV(bdf) > 0))
    238 		return -EINVAL;
    239 
    240 	return 0;
    241 }
    242 
    243 int ls_pcie_conf_address(struct udevice *bus, pci_dev_t bdf,
    244 			 uint offset, void **paddress)
    245 {
    246 	struct ls_pcie *pcie = dev_get_priv(bus);
    247 	u32 busdev;
    248 
    249 	if (ls_pcie_addr_valid(pcie, bdf))
    250 		return -EINVAL;
    251 
    252 	if (PCI_BUS(bdf) == bus->seq) {
    253 		*paddress = pcie->dbi + offset;
    254 		return 0;
    255 	}
    256 
    257 	busdev = PCIE_ATU_BUS(PCI_BUS(bdf) - bus->seq) |
    258 		 PCIE_ATU_DEV(PCI_DEV(bdf)) |
    259 		 PCIE_ATU_FUNC(PCI_FUNC(bdf));
    260 
    261 	if (PCI_BUS(bdf) == bus->seq + 1) {
    262 		ls_pcie_cfg0_set_busdev(pcie, busdev);
    263 		*paddress = pcie->cfg0 + offset;
    264 	} else {
    265 		ls_pcie_cfg1_set_busdev(pcie, busdev);
    266 		*paddress = pcie->cfg1 + offset;
    267 	}
    268 	return 0;
    269 }
    270 
    271 static int ls_pcie_read_config(struct udevice *bus, pci_dev_t bdf,
    272 			       uint offset, ulong *valuep,
    273 			       enum pci_size_t size)
    274 {
    275 	return pci_generic_mmap_read_config(bus, ls_pcie_conf_address,
    276 					    bdf, offset, valuep, size);
    277 }
    278 
    279 static int ls_pcie_write_config(struct udevice *bus, pci_dev_t bdf,
    280 				uint offset, ulong value,
    281 				enum pci_size_t size)
    282 {
    283 	return pci_generic_mmap_write_config(bus, ls_pcie_conf_address,
    284 					     bdf, offset, value, size);
    285 }
    286 
    287 /* Clear multi-function bit */
    288 static void ls_pcie_clear_multifunction(struct ls_pcie *pcie)
    289 {
    290 	writeb(PCI_HEADER_TYPE_BRIDGE, pcie->dbi + PCI_HEADER_TYPE);
    291 }
    292 
    293 /* Fix class value */
    294 static void ls_pcie_fix_class(struct ls_pcie *pcie)
    295 {
    296 	writew(PCI_CLASS_BRIDGE_PCI, pcie->dbi + PCI_CLASS_DEVICE);
    297 }
    298 
    299 /* Drop MSG TLP except for Vendor MSG */
    300 static void ls_pcie_drop_msg_tlp(struct ls_pcie *pcie)
    301 {
    302 	u32 val;
    303 
    304 	val = dbi_readl(pcie, PCIE_STRFMR1);
    305 	val &= 0xDFFFFFFF;
    306 	dbi_writel(pcie, val, PCIE_STRFMR1);
    307 }
    308 
    309 /* Disable all bars in RC mode */
    310 static void ls_pcie_disable_bars(struct ls_pcie *pcie)
    311 {
    312 	u32 sriov;
    313 
    314 	sriov = in_le32(pcie->dbi + PCIE_SRIOV);
    315 
    316 	/*
    317 	 * TODO: For PCIe controller with SRIOV, the method to disable bars
    318 	 * is different and more complex, so will add later.
    319 	 */
    320 	if (PCI_EXT_CAP_ID(sriov) == PCI_EXT_CAP_ID_SRIOV)
    321 		return;
    322 
    323 	dbi_writel(pcie, 0, PCIE_CS2_OFFSET + PCI_BASE_ADDRESS_0);
    324 	dbi_writel(pcie, 0, PCIE_CS2_OFFSET + PCI_BASE_ADDRESS_1);
    325 	dbi_writel(pcie, 0, PCIE_CS2_OFFSET + PCI_ROM_ADDRESS1);
    326 }
    327 
    328 static void ls_pcie_setup_ctrl(struct ls_pcie *pcie)
    329 {
    330 	ls_pcie_setup_atu(pcie);
    331 
    332 	dbi_writel(pcie, 1, PCIE_DBI_RO_WR_EN);
    333 	ls_pcie_fix_class(pcie);
    334 	ls_pcie_clear_multifunction(pcie);
    335 	ls_pcie_drop_msg_tlp(pcie);
    336 	dbi_writel(pcie, 0, PCIE_DBI_RO_WR_EN);
    337 
    338 	ls_pcie_disable_bars(pcie);
    339 }
    340 
    341 static void ls_pcie_ep_setup_atu(struct ls_pcie *pcie)
    342 {
    343 	u64 phys = CONFIG_SYS_PCI_EP_MEMORY_BASE;
    344 
    345 	/* ATU 0 : INBOUND : map BAR0 */
    346 	ls_pcie_atu_inbound_set(pcie, 0, 0, phys);
    347 	/* ATU 1 : INBOUND : map BAR1 */
    348 	phys += PCIE_BAR1_SIZE;
    349 	ls_pcie_atu_inbound_set(pcie, 1, 1, phys);
    350 	/* ATU 2 : INBOUND : map BAR2 */
    351 	phys += PCIE_BAR2_SIZE;
    352 	ls_pcie_atu_inbound_set(pcie, 2, 2, phys);
    353 	/* ATU 3 : INBOUND : map BAR4 */
    354 	phys = CONFIG_SYS_PCI_EP_MEMORY_BASE + PCIE_BAR4_SIZE;
    355 	ls_pcie_atu_inbound_set(pcie, 3, 4, phys);
    356 
    357 	/* ATU 0 : OUTBOUND : map MEM */
    358 	ls_pcie_atu_outbound_set(pcie, 0,
    359 				 PCIE_ATU_TYPE_MEM,
    360 				 pcie->cfg_res.start,
    361 				 0,
    362 				 CONFIG_SYS_PCI_MEMORY_SIZE);
    363 }
    364 
    365 /* BAR0 and BAR1 are 32bit BAR2 and BAR4 are 64bit */
    366 static void ls_pcie_ep_setup_bar(void *bar_base, int bar, u32 size)
    367 {
    368 	/* The least inbound window is 4KiB */
    369 	if (size < 4 * 1024)
    370 		return;
    371 
    372 	switch (bar) {
    373 	case 0:
    374 		writel(size - 1, bar_base + PCI_BASE_ADDRESS_0);
    375 		break;
    376 	case 1:
    377 		writel(size - 1, bar_base + PCI_BASE_ADDRESS_1);
    378 		break;
    379 	case 2:
    380 		writel(size - 1, bar_base + PCI_BASE_ADDRESS_2);
    381 		writel(0, bar_base + PCI_BASE_ADDRESS_3);
    382 		break;
    383 	case 4:
    384 		writel(size - 1, bar_base + PCI_BASE_ADDRESS_4);
    385 		writel(0, bar_base + PCI_BASE_ADDRESS_5);
    386 		break;
    387 	default:
    388 		break;
    389 	}
    390 }
    391 
    392 static void ls_pcie_ep_setup_bars(void *bar_base)
    393 {
    394 	/* BAR0 - 32bit - 4K configuration */
    395 	ls_pcie_ep_setup_bar(bar_base, 0, PCIE_BAR0_SIZE);
    396 	/* BAR1 - 32bit - 8K MSIX*/
    397 	ls_pcie_ep_setup_bar(bar_base, 1, PCIE_BAR1_SIZE);
    398 	/* BAR2 - 64bit - 4K MEM desciptor */
    399 	ls_pcie_ep_setup_bar(bar_base, 2, PCIE_BAR2_SIZE);
    400 	/* BAR4 - 64bit - 1M MEM*/
    401 	ls_pcie_ep_setup_bar(bar_base, 4, PCIE_BAR4_SIZE);
    402 }
    403 
    404 static void ls_pcie_ep_enable_cfg(struct ls_pcie *pcie)
    405 {
    406 	ctrl_writel(pcie, PCIE_CONFIG_READY, PCIE_PF_CONFIG);
    407 }
    408 
    409 static void ls_pcie_setup_ep(struct ls_pcie *pcie)
    410 {
    411 	u32 sriov;
    412 
    413 	sriov = readl(pcie->dbi + PCIE_SRIOV);
    414 	if (PCI_EXT_CAP_ID(sriov) == PCI_EXT_CAP_ID_SRIOV) {
    415 		int pf, vf;
    416 
    417 		for (pf = 0; pf < PCIE_PF_NUM; pf++) {
    418 			for (vf = 0; vf <= PCIE_VF_NUM; vf++) {
    419 				ctrl_writel(pcie, PCIE_LCTRL0_VAL(pf, vf),
    420 					    PCIE_PF_VF_CTRL);
    421 
    422 				ls_pcie_ep_setup_bars(pcie->dbi);
    423 				ls_pcie_ep_setup_atu(pcie);
    424 			}
    425 		}
    426 		/* Disable CFG2 */
    427 		ctrl_writel(pcie, 0, PCIE_PF_VF_CTRL);
    428 	} else {
    429 		ls_pcie_ep_setup_bars(pcie->dbi + PCIE_NO_SRIOV_BAR_BASE);
    430 		ls_pcie_ep_setup_atu(pcie);
    431 	}
    432 
    433 	ls_pcie_ep_enable_cfg(pcie);
    434 }
    435 
    436 static int ls_pcie_probe(struct udevice *dev)
    437 {
    438 	struct ls_pcie *pcie = dev_get_priv(dev);
    439 	const void *fdt = gd->fdt_blob;
    440 	int node = dev_of_offset(dev);
    441 	u8 header_type;
    442 	u16 link_sta;
    443 	bool ep_mode;
    444 	uint svr;
    445 	int ret;
    446 	fdt_size_t cfg_size;
    447 
    448 	pcie->bus = dev;
    449 
    450 	ret = fdt_get_named_resource(fdt, node, "reg", "reg-names",
    451 				     "dbi", &pcie->dbi_res);
    452 	if (ret) {
    453 		printf("ls-pcie: resource \"dbi\" not found\n");
    454 		return ret;
    455 	}
    456 
    457 	pcie->idx = (pcie->dbi_res.start - PCIE_SYS_BASE_ADDR) / PCIE_CCSR_SIZE;
    458 
    459 	list_add(&pcie->list, &ls_pcie_list);
    460 
    461 	pcie->enabled = is_serdes_configured(PCIE_SRDS_PRTCL(pcie->idx));
    462 	if (!pcie->enabled) {
    463 		printf("PCIe%d: %s disabled\n", pcie->idx, dev->name);
    464 		return 0;
    465 	}
    466 
    467 	pcie->dbi = map_physmem(pcie->dbi_res.start,
    468 				fdt_resource_size(&pcie->dbi_res),
    469 				MAP_NOCACHE);
    470 
    471 	ret = fdt_get_named_resource(fdt, node, "reg", "reg-names",
    472 				     "lut", &pcie->lut_res);
    473 	if (!ret)
    474 		pcie->lut = map_physmem(pcie->lut_res.start,
    475 					fdt_resource_size(&pcie->lut_res),
    476 					MAP_NOCACHE);
    477 
    478 	ret = fdt_get_named_resource(fdt, node, "reg", "reg-names",
    479 				     "ctrl", &pcie->ctrl_res);
    480 	if (!ret)
    481 		pcie->ctrl = map_physmem(pcie->ctrl_res.start,
    482 					 fdt_resource_size(&pcie->ctrl_res),
    483 					 MAP_NOCACHE);
    484 	if (!pcie->ctrl)
    485 		pcie->ctrl = pcie->lut;
    486 
    487 	if (!pcie->ctrl) {
    488 		printf("%s: NOT find CTRL\n", dev->name);
    489 		return -1;
    490 	}
    491 
    492 	ret = fdt_get_named_resource(fdt, node, "reg", "reg-names",
    493 				     "config", &pcie->cfg_res);
    494 	if (ret) {
    495 		printf("%s: resource \"config\" not found\n", dev->name);
    496 		return ret;
    497 	}
    498 
    499 	/*
    500 	 * Fix the pcie memory map address and PF control registers address
    501 	 * for LS2088A series SoCs
    502 	 */
    503 	svr = get_svr();
    504 	svr = (svr >> SVR_VAR_PER_SHIFT) & 0xFFFFFE;
    505 	if (svr == SVR_LS2088A || svr == SVR_LS2084A ||
    506 	    svr == SVR_LS2048A || svr == SVR_LS2044A ||
    507 	    svr == SVR_LS2081A || svr == SVR_LS2041A) {
    508 		cfg_size = fdt_resource_size(&pcie->cfg_res);
    509 		pcie->cfg_res.start = LS2088A_PCIE1_PHYS_ADDR +
    510 					LS2088A_PCIE_PHYS_SIZE * pcie->idx;
    511 		pcie->cfg_res.end = pcie->cfg_res.start + cfg_size;
    512 		pcie->ctrl = pcie->lut + 0x40000;
    513 	}
    514 
    515 	pcie->cfg0 = map_physmem(pcie->cfg_res.start,
    516 				 fdt_resource_size(&pcie->cfg_res),
    517 				 MAP_NOCACHE);
    518 	pcie->cfg1 = pcie->cfg0 + fdt_resource_size(&pcie->cfg_res) / 2;
    519 
    520 	pcie->big_endian = fdtdec_get_bool(fdt, node, "big-endian");
    521 
    522 	debug("%s dbi:%lx lut:%lx ctrl:0x%lx cfg0:0x%lx, big-endian:%d\n",
    523 	      dev->name, (unsigned long)pcie->dbi, (unsigned long)pcie->lut,
    524 	      (unsigned long)pcie->ctrl, (unsigned long)pcie->cfg0,
    525 	      pcie->big_endian);
    526 
    527 	header_type = readb(pcie->dbi + PCI_HEADER_TYPE);
    528 	ep_mode = (header_type & 0x7f) == PCI_HEADER_TYPE_NORMAL;
    529 	printf("PCIe%u: %s %s", pcie->idx, dev->name,
    530 	       ep_mode ? "Endpoint" : "Root Complex");
    531 
    532 	if (ep_mode)
    533 		ls_pcie_setup_ep(pcie);
    534 	else
    535 		ls_pcie_setup_ctrl(pcie);
    536 
    537 	if (!ls_pcie_link_up(pcie)) {
    538 		/* Let the user know there's no PCIe link */
    539 		printf(": no link\n");
    540 		return 0;
    541 	}
    542 
    543 	/* Print the negotiated PCIe link width */
    544 	link_sta = readw(pcie->dbi + PCIE_LINK_STA);
    545 	printf(": x%d gen%d\n", (link_sta & PCIE_LINK_WIDTH_MASK) >> 4,
    546 	       link_sta & PCIE_LINK_SPEED_MASK);
    547 
    548 	return 0;
    549 }
    550 
    551 static const struct dm_pci_ops ls_pcie_ops = {
    552 	.read_config	= ls_pcie_read_config,
    553 	.write_config	= ls_pcie_write_config,
    554 };
    555 
    556 static const struct udevice_id ls_pcie_ids[] = {
    557 	{ .compatible = "fsl,ls-pcie" },
    558 	{ }
    559 };
    560 
    561 U_BOOT_DRIVER(pci_layerscape) = {
    562 	.name = "pci_layerscape",
    563 	.id = UCLASS_PCI,
    564 	.of_match = ls_pcie_ids,
    565 	.ops = &ls_pcie_ops,
    566 	.probe	= ls_pcie_probe,
    567 	.priv_auto_alloc_size = sizeof(struct ls_pcie),
    568 };
    569