diff --git a/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c index bb28519cc53f..14611f9354e1 100644 --- a/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c +++ b/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c @@ -149,6 +149,12 @@ static const struct of_device_id rockchip_pcie_ep_of_match[] = { MODULE_DEVICE_TABLE(of, rockchip_pcie_ep_of_match); +static void rockchip_pcie_devmode_update(struct rockchip_pcie *rockchip, int mode, int submode) +{ + rockchip->obj_info->devmode.mode = mode; + rockchip->obj_info->devmode.submode = submode; +} + static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip, u32 reg) { return readl(rockchip->apb_base + reg); @@ -298,6 +304,7 @@ static int rockchip_pcie_resource_get(struct platform_device *pdev, memset_io(rockchip->obj_info, 0, sizeof(struct pcie_ep_obj_info)); rockchip->obj_info->magic = PCIE_EP_OBJ_INFO_MAGIC; rockchip->obj_info->version = PCIE_EP_OBJ_INFO_DRV_VERSION; + rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_INIT); } else { dev_err(dev, "missing bar0 memory region\n"); return -ENODEV; @@ -1177,6 +1184,7 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev) rockchip_pcie_fast_link_setup(rockchip); rockchip_pcie_start_link(&rockchip->pci); + rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_LNKRDY); for (retry = 0; retry < 10000; retry++) { if (dw_pcie_link_up(&rockchip->pci)) { @@ -1204,6 +1212,7 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev) } already_linkup: + rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_LNKUP); rockchip->pci.iatu_unroll_enabled = rockchip_pcie_iatu_unroll_enabled(&rockchip->pci); for (i = 0; i < PCIE_BAR_MAX_NUM; i++) if (rockchip->ib_target_size[i]) diff --git a/include/uapi/linux/rk-pcie-ep.h b/include/uapi/linux/rk-pcie-ep.h index 42483e7620a8..b6e3ac04ac2b 100644 --- a/include/uapi/linux/rk-pcie-ep.h +++ b/include/uapi/linux/rk-pcie-ep.h @@ -8,6 +8,22 @@ #include +/* rkep device mode status definition */ +#define RKEP_MODE_BOOTROM 1 +#define RKEP_MODE_LOADER 2 +#define RKEP_MODE_KERNEL 3 +#define RKEP_MODE_FUN0 4 +/* Common status */ +#define RKEP_SMODE_INIT 0 +#define RKEP_SMODE_LNKRDY 1 +#define RKEP_SMODE_LNKUP 2 +#define RKEP_SMODE_ERR 0xff +/* Firmware download status */ +#define RKEP_SMODE_FWDLRDY 0x10 +#define RKEP_SMODE_FWDLDONE 0x11 +/* Application status*/ +#define RKEP_SMODE_APPRDY 0x20 + /* * rockchip pcie driver elbi ioctrl output data */ @@ -52,7 +68,11 @@ enum pcie_ep_mmap_resource { struct pcie_ep_obj_info { __u32 magic; __u32 version; - __u8 reserved[0x1F8]; + struct { + __u16 mode; + __u16 submode; + } devmode; + __u8 reserved[0x1F4]; __u32 irq_type_rc; /* Generate in ep isr, valid only for rc, clear in rc */ struct pcie_ep_obj_irq_dma_status dma_status_rc; /* Generate in ep isr, valid only for rc, clear in rc */