Lines Matching refs:fman
569 static irqreturn_t fman_exceptions(struct fman *fman, in fman_exceptions() argument
572 dev_dbg(fman->dev, "%s: FMan[%d] exception %d\n", in fman_exceptions()
573 __func__, fman->state->fm_id, exception); in fman_exceptions()
578 static irqreturn_t fman_bus_error(struct fman *fman, u8 __maybe_unused port_id, in fman_bus_error() argument
583 dev_dbg(fman->dev, "%s: FMan[%d] bus error: port_id[%d]\n", in fman_bus_error()
584 __func__, fman->state->fm_id, port_id); in fman_bus_error()
589 static inline irqreturn_t call_mac_isr(struct fman *fman, u8 id) in call_mac_isr() argument
591 if (fman->intr_mng[id].isr_cb) { in call_mac_isr()
592 fman->intr_mng[id].isr_cb(fman->intr_mng[id].src_handle); in call_mac_isr()
632 static void set_port_liodn(struct fman *fman, u8 port_id, in set_port_liodn() argument
638 tmp = ioread32be(&fman->dma_regs->fmdmplr[port_id / 2]); in set_port_liodn()
646 iowrite32be(tmp, &fman->dma_regs->fmdmplr[port_id / 2]); in set_port_liodn()
647 iowrite32be(liodn_ofst, &fman->bmi_regs->fmbm_spliodn[port_id - 1]); in set_port_liodn()
699 static int dma_init(struct fman *fman) in dma_init() argument
701 struct fman_dma_regs __iomem *dma_rg = fman->dma_regs; in dma_init()
702 struct fman_cfg *cfg = fman->cfg; in dma_init()
763 fman->cam_size = in dma_init()
764 (u32)(fman->cfg->dma_cam_num_of_entries * DMA_CAM_SIZEOF_ENTRY); in dma_init()
765 fman->cam_offset = fman_muram_alloc(fman->muram, fman->cam_size); in dma_init()
766 if (IS_ERR_VALUE(fman->cam_offset)) { in dma_init()
767 dev_err(fman->dev, "%s: MURAM alloc for DMA CAM failed\n", in dma_init()
772 if (fman->state->rev_info.major == 2) { in dma_init()
775 fman_muram_free_mem(fman->muram, fman->cam_offset, in dma_init()
776 fman->cam_size); in dma_init()
778 fman->cam_size = fman->cfg->dma_cam_num_of_entries * 72 + 128; in dma_init()
779 fman->cam_offset = fman_muram_alloc(fman->muram, in dma_init()
780 fman->cam_size); in dma_init()
781 if (IS_ERR_VALUE(fman->cam_offset)) { in dma_init()
782 dev_err(fman->dev, "%s: MURAM alloc for DMA CAM failed\n", in dma_init()
787 if (fman->cfg->dma_cam_num_of_entries % 8 || in dma_init()
788 fman->cfg->dma_cam_num_of_entries > 32) { in dma_init()
789 dev_err(fman->dev, "%s: wrong dma_cam_num_of_entries\n", in dma_init()
795 fman_muram_offset_to_vbase(fman->muram, in dma_init()
796 fman->cam_offset); in dma_init()
798 (32 - fman->cfg->dma_cam_num_of_entries)) - 1), in dma_init()
802 fman->cfg->cam_base_addr = fman->cam_offset; in dma_init()
947 static int enable(struct fman *fman, struct fman_cfg *cfg) in enable() argument
961 iowrite32be(BMI_INIT_START, &fman->bmi_regs->fmbm_init); in enable()
963 &fman->qmi_regs->fmqm_gc); in enable()
968 static int set_exception(struct fman *fman, in set_exception() argument
975 tmp = ioread32be(&fman->dma_regs->fmdmmr); in set_exception()
981 iowrite32be(tmp, &fman->dma_regs->fmdmmr); in set_exception()
986 tmp = ioread32be(&fman->dma_regs->fmdmmr); in set_exception()
991 iowrite32be(tmp, &fman->dma_regs->fmdmmr); in set_exception()
994 tmp = ioread32be(&fman->fpm_regs->fmfp_ee); in set_exception()
999 iowrite32be(tmp, &fman->fpm_regs->fmfp_ee); in set_exception()
1002 tmp = ioread32be(&fman->fpm_regs->fmfp_ee); in set_exception()
1007 iowrite32be(tmp, &fman->fpm_regs->fmfp_ee); in set_exception()
1010 tmp = ioread32be(&fman->fpm_regs->fmfp_ee); in set_exception()
1015 iowrite32be(tmp, &fman->fpm_regs->fmfp_ee); in set_exception()
1018 tmp = ioread32be(&fman->qmi_regs->fmqm_ien); in set_exception()
1023 iowrite32be(tmp, &fman->qmi_regs->fmqm_ien); in set_exception()
1026 tmp = ioread32be(&fman->qmi_regs->fmqm_eien); in set_exception()
1031 iowrite32be(tmp, &fman->qmi_regs->fmqm_eien); in set_exception()
1034 tmp = ioread32be(&fman->qmi_regs->fmqm_eien); in set_exception()
1039 iowrite32be(tmp, &fman->qmi_regs->fmqm_eien); in set_exception()
1042 tmp = ioread32be(&fman->bmi_regs->fmbm_ier); in set_exception()
1047 iowrite32be(tmp, &fman->bmi_regs->fmbm_ier); in set_exception()
1050 tmp = ioread32be(&fman->bmi_regs->fmbm_ier); in set_exception()
1055 iowrite32be(tmp, &fman->bmi_regs->fmbm_ier); in set_exception()
1058 tmp = ioread32be(&fman->bmi_regs->fmbm_ier); in set_exception()
1063 iowrite32be(tmp, &fman->bmi_regs->fmbm_ier); in set_exception()
1066 tmp = ioread32be(&fman->bmi_regs->fmbm_ier); in set_exception()
1071 iowrite32be(tmp, &fman->bmi_regs->fmbm_ier); in set_exception()
1074 tmp = ioread32be(&fman->fpm_regs->fm_rie); in set_exception()
1077 enable_rams_ecc(fman->fpm_regs); in set_exception()
1084 disable_rams_ecc(fman->fpm_regs); in set_exception()
1087 iowrite32be(tmp, &fman->fpm_regs->fm_rie); in set_exception()
1090 tmp = ioread32be(&fman->fpm_regs->fm_rie); in set_exception()
1093 enable_rams_ecc(fman->fpm_regs); in set_exception()
1100 disable_rams_ecc(fman->fpm_regs); in set_exception()
1103 iowrite32be(tmp, &fman->fpm_regs->fm_rie); in set_exception()
1210 static void free_init_resources(struct fman *fman) in free_init_resources() argument
1212 if (fman->cam_offset) in free_init_resources()
1213 fman_muram_free_mem(fman->muram, fman->cam_offset, in free_init_resources()
1214 fman->cam_size); in free_init_resources()
1215 if (fman->fifo_offset) in free_init_resources()
1216 fman_muram_free_mem(fman->muram, fman->fifo_offset, in free_init_resources()
1217 fman->fifo_size); in free_init_resources()
1220 static irqreturn_t bmi_err_event(struct fman *fman) in bmi_err_event() argument
1223 struct fman_bmi_regs __iomem *bmi_rg = fman->bmi_regs; in bmi_err_event()
1237 ret = fman->exception_cb(fman, FMAN_EX_BMI_STORAGE_PROFILE_ECC); in bmi_err_event()
1239 ret = fman->exception_cb(fman, FMAN_EX_BMI_LIST_RAM_ECC); in bmi_err_event()
1241 ret = fman->exception_cb(fman, FMAN_EX_BMI_STATISTICS_RAM_ECC); in bmi_err_event()
1243 ret = fman->exception_cb(fman, FMAN_EX_BMI_DISPATCH_RAM_ECC); in bmi_err_event()
1248 static irqreturn_t qmi_err_event(struct fman *fman) in qmi_err_event() argument
1251 struct fman_qmi_regs __iomem *qmi_rg = fman->qmi_regs; in qmi_err_event()
1266 ret = fman->exception_cb(fman, FMAN_EX_QMI_DOUBLE_ECC); in qmi_err_event()
1268 ret = fman->exception_cb(fman, in qmi_err_event()
1274 static irqreturn_t dma_err_event(struct fman *fman) in dma_err_event() argument
1279 struct fman_dma_regs __iomem *dma_rg = fman->dma_regs; in dma_err_event()
1309 hw_port_id_to_sw_port_id(fman->state->rev_info.major, port_id); in dma_err_event()
1313 ret = fman->bus_error_cb(fman, relative_port_id, addr, tnum, in dma_err_event()
1317 ret = fman->exception_cb(fman, FMAN_EX_DMA_SINGLE_PORT_ECC); in dma_err_event()
1319 ret = fman->exception_cb(fman, FMAN_EX_DMA_READ_ECC); in dma_err_event()
1321 ret = fman->exception_cb(fman, FMAN_EX_DMA_SYSTEM_WRITE_ECC); in dma_err_event()
1323 ret = fman->exception_cb(fman, FMAN_EX_DMA_FM_WRITE_ECC); in dma_err_event()
1328 static irqreturn_t fpm_err_event(struct fman *fman) in fpm_err_event() argument
1331 struct fman_fpm_regs __iomem *fpm_rg = fman->fpm_regs; in fpm_err_event()
1340 ret = fman->exception_cb(fman, FMAN_EX_FPM_DOUBLE_ECC); in fpm_err_event()
1342 ret = fman->exception_cb(fman, FMAN_EX_FPM_STALL_ON_TASKS); in fpm_err_event()
1345 ret = fman->exception_cb(fman, FMAN_EX_FPM_SINGLE_ECC); in fpm_err_event()
1350 static irqreturn_t muram_err_intr(struct fman *fman) in muram_err_intr() argument
1353 struct fman_fpm_regs __iomem *fpm_rg = fman->fpm_regs; in muram_err_intr()
1363 ret = fman->exception_cb(fman, FMAN_EX_MURAM_ECC); in muram_err_intr()
1368 static irqreturn_t qmi_event(struct fman *fman) in qmi_event() argument
1371 struct fman_qmi_regs __iomem *qmi_rg = fman->qmi_regs; in qmi_event()
1385 ret = fman->exception_cb(fman, FMAN_EX_QMI_SINGLE_ECC); in qmi_event()
1390 static void enable_time_stamp(struct fman *fman) in enable_time_stamp() argument
1392 struct fman_fpm_regs __iomem *fpm_rg = fman->fpm_regs; in enable_time_stamp()
1393 u16 fm_clk_freq = fman->state->fm_clk_freq; in enable_time_stamp()
1397 ts_freq = (u32)(1 << fman->state->count1_micro_bit); in enable_time_stamp()
1422 fman->state->enabled_time_stamp = true; in enable_time_stamp()
1425 static int clear_iram(struct fman *fman) in clear_iram() argument
1430 iram = fman->base_addr + IMEM_OFFSET; in clear_iram()
1441 for (i = 0; i < (fman->state->fm_iram_size / 4); i++) in clear_iram()
1444 iowrite32be(fman->state->fm_iram_size - 4, &iram->iadd); in clear_iram()
1545 static int set_size_of_fifo(struct fman *fman, u8 port_id, u32 *size_of_fifo, in set_size_of_fifo() argument
1548 struct fman_bmi_regs __iomem *bmi_rg = fman->bmi_regs; in set_size_of_fifo()
1557 if (extra_fifo && !fman->state->extra_fifo_pool_size) in set_size_of_fifo()
1558 fman->state->extra_fifo_pool_size = in set_size_of_fifo()
1559 fman->state->num_of_rx_ports * FMAN_BMI_FIFO_UNITS; in set_size_of_fifo()
1561 fman->state->extra_fifo_pool_size = in set_size_of_fifo()
1562 max(fman->state->extra_fifo_pool_size, extra_fifo); in set_size_of_fifo()
1565 if ((fman->state->accumulated_fifo_size + fifo) > in set_size_of_fifo()
1566 (fman->state->total_fifo_size - in set_size_of_fifo()
1567 fman->state->extra_fifo_pool_size)) { in set_size_of_fifo()
1568 dev_err(fman->dev, "%s: Requested fifo size and extra size exceed total FIFO size.\n", in set_size_of_fifo()
1580 fman->state->accumulated_fifo_size += fifo; in set_size_of_fifo()
1585 static int set_num_of_tasks(struct fman *fman, u8 port_id, u8 *num_of_tasks, in set_num_of_tasks() argument
1588 struct fman_bmi_regs __iomem *bmi_rg = fman->bmi_regs; in set_num_of_tasks()
1594 fman->state->extra_tasks_pool_size = in set_num_of_tasks()
1595 max(fman->state->extra_tasks_pool_size, extra_tasks); in set_num_of_tasks()
1598 if ((fman->state->accumulated_num_of_tasks + tasks) > in set_num_of_tasks()
1599 (fman->state->total_num_of_tasks - in set_num_of_tasks()
1600 fman->state->extra_tasks_pool_size)) { in set_num_of_tasks()
1601 …dev_err(fman->dev, "%s: Requested num_of_tasks and extra tasks pool for fm%d exceed total num_of_t… in set_num_of_tasks()
1602 __func__, fman->state->fm_id); in set_num_of_tasks()
1606 fman->state->accumulated_num_of_tasks += tasks; in set_num_of_tasks()
1618 static int set_num_of_open_dmas(struct fman *fman, u8 port_id, in set_num_of_open_dmas() argument
1622 struct fman_bmi_regs __iomem *bmi_rg = fman->bmi_regs; in set_num_of_open_dmas()
1644 fman->state->extra_open_dmas_pool_size = in set_num_of_open_dmas()
1645 (u8)max(fman->state->extra_open_dmas_pool_size, in set_num_of_open_dmas()
1647 fman->state->accumulated_num_of_open_dmas += current_val; in set_num_of_open_dmas()
1654 fman->state->extra_open_dmas_pool_size = in set_num_of_open_dmas()
1655 (u8)max(fman->state->extra_open_dmas_pool_size, in set_num_of_open_dmas()
1658 if ((fman->state->rev_info.major < 6) && in set_num_of_open_dmas()
1659 (fman->state->accumulated_num_of_open_dmas - current_val + in set_num_of_open_dmas()
1660 open_dmas > fman->state->max_num_of_open_dmas)) { in set_num_of_open_dmas()
1661 dev_err(fman->dev, "%s: Requested num_of_open_dmas for fm%d exceeds total num_of_open_dmas.\n", in set_num_of_open_dmas()
1662 __func__, fman->state->fm_id); in set_num_of_open_dmas()
1664 } else if ((fman->state->rev_info.major >= 6) && in set_num_of_open_dmas()
1665 !((fman->state->rev_info.major == 6) && in set_num_of_open_dmas()
1666 (fman->state->rev_info.minor == 0)) && in set_num_of_open_dmas()
1667 (fman->state->accumulated_num_of_open_dmas - in set_num_of_open_dmas()
1669 fman->state->dma_thresh_max_commq + 1)) { in set_num_of_open_dmas()
1670 dev_err(fman->dev, "%s: Requested num_of_open_dmas for fm%d exceeds DMA Command queue (%d)\n", in set_num_of_open_dmas()
1671 __func__, fman->state->fm_id, in set_num_of_open_dmas()
1672 fman->state->dma_thresh_max_commq + 1); in set_num_of_open_dmas()
1676 WARN_ON(fman->state->accumulated_num_of_open_dmas < current_val); in set_num_of_open_dmas()
1678 fman->state->accumulated_num_of_open_dmas -= current_val; in set_num_of_open_dmas()
1679 fman->state->accumulated_num_of_open_dmas += open_dmas; in set_num_of_open_dmas()
1681 if (fman->state->rev_info.major < 6) in set_num_of_open_dmas()
1683 (u8)(fman->state->accumulated_num_of_open_dmas + in set_num_of_open_dmas()
1684 fman->state->extra_open_dmas_pool_size); in set_num_of_open_dmas()
1705 static int fman_config(struct fman *fman) in fman_config() argument
1710 base_addr = fman->dts_params.base_addr; in fman_config()
1712 fman->state = kzalloc(sizeof(*fman->state), GFP_KERNEL); in fman_config()
1713 if (!fman->state) in fman_config()
1717 fman->cfg = kzalloc(sizeof(*fman->cfg), GFP_KERNEL); in fman_config()
1718 if (!fman->cfg) in fman_config()
1722 fman->muram = in fman_config()
1723 fman_muram_init(fman->dts_params.muram_res.start, in fman_config()
1724 resource_size(&fman->dts_params.muram_res)); in fman_config()
1725 if (!fman->muram) in fman_config()
1729 fman->state->fm_id = fman->dts_params.id; in fman_config()
1730 fman->state->fm_clk_freq = fman->dts_params.clk_freq; in fman_config()
1731 fman->state->qman_channel_base = fman->dts_params.qman_channel_base; in fman_config()
1732 fman->state->num_of_qman_channels = in fman_config()
1733 fman->dts_params.num_of_qman_channels; in fman_config()
1734 fman->state->res = fman->dts_params.res; in fman_config()
1735 fman->exception_cb = fman_exceptions; in fman_config()
1736 fman->bus_error_cb = fman_bus_error; in fman_config()
1737 fman->fpm_regs = base_addr + FPM_OFFSET; in fman_config()
1738 fman->bmi_regs = base_addr + BMI_OFFSET; in fman_config()
1739 fman->qmi_regs = base_addr + QMI_OFFSET; in fman_config()
1740 fman->dma_regs = base_addr + DMA_OFFSET; in fman_config()
1741 fman->hwp_regs = base_addr + HWP_OFFSET; in fman_config()
1742 fman->kg_regs = base_addr + KG_OFFSET; in fman_config()
1743 fman->base_addr = base_addr; in fman_config()
1745 spin_lock_init(&fman->spinlock); in fman_config()
1746 fman_defconfig(fman->cfg); in fman_config()
1748 fman->state->extra_fifo_pool_size = 0; in fman_config()
1749 fman->state->exceptions = (EX_DMA_BUS_ERROR | in fman_config()
1766 fman_get_revision(fman, &fman->state->rev_info); in fman_config()
1768 err = fill_soc_specific_params(fman->state); in fman_config()
1773 if (fman->state->rev_info.major >= 6) in fman_config()
1774 fman->cfg->dma_aid_mode = FMAN_DMA_AID_OUT_PORT_ID; in fman_config()
1776 fman->cfg->qmi_def_tnums_thresh = fman->state->qmi_def_tnums_thresh; in fman_config()
1778 fman->state->total_num_of_tasks = in fman_config()
1779 (u8)DFLT_TOTAL_NUM_OF_TASKS(fman->state->rev_info.major, in fman_config()
1780 fman->state->rev_info.minor, in fman_config()
1781 fman->state->bmi_max_num_of_tasks); in fman_config()
1783 if (fman->state->rev_info.major < 6) { in fman_config()
1784 fman->cfg->dma_comm_qtsh_clr_emer = in fman_config()
1785 (u8)DFLT_DMA_COMM_Q_LOW(fman->state->rev_info.major, in fman_config()
1786 fman->state->dma_thresh_max_commq); in fman_config()
1788 fman->cfg->dma_comm_qtsh_asrt_emer = in fman_config()
1789 (u8)DFLT_DMA_COMM_Q_HIGH(fman->state->rev_info.major, in fman_config()
1790 fman->state->dma_thresh_max_commq); in fman_config()
1792 fman->cfg->dma_cam_num_of_entries = in fman_config()
1793 DFLT_DMA_CAM_NUM_OF_ENTRIES(fman->state->rev_info.major); in fman_config()
1795 fman->cfg->dma_read_buf_tsh_clr_emer = in fman_config()
1796 DFLT_DMA_READ_INT_BUF_LOW(fman->state->dma_thresh_max_buf); in fman_config()
1798 fman->cfg->dma_read_buf_tsh_asrt_emer = in fman_config()
1799 DFLT_DMA_READ_INT_BUF_HIGH(fman->state->dma_thresh_max_buf); in fman_config()
1801 fman->cfg->dma_write_buf_tsh_clr_emer = in fman_config()
1802 DFLT_DMA_WRITE_INT_BUF_LOW(fman->state->dma_thresh_max_buf); in fman_config()
1804 fman->cfg->dma_write_buf_tsh_asrt_emer = in fman_config()
1805 DFLT_DMA_WRITE_INT_BUF_HIGH(fman->state->dma_thresh_max_buf); in fman_config()
1807 fman->cfg->dma_axi_dbg_num_of_beats = in fman_config()
1814 kfree(fman->cfg); in fman_config()
1816 kfree(fman->state); in fman_config()
1818 kfree(fman); in fman_config()
1822 static int fman_reset(struct fman *fman) in fman_reset() argument
1827 if (fman->state->rev_info.major < 6) { in fman_reset()
1828 iowrite32be(FPM_RSTC_FM_RESET, &fman->fpm_regs->fm_rstc); in fman_reset()
1833 } while (((ioread32be(&fman->fpm_regs->fm_rstc)) & in fman_reset()
1850 dev_err(fman->dev, "%s: Couldn't find guts node\n", in fman_reset()
1857 dev_err(fman->dev, "%s: Couldn't map %pOF regs\n", in fman_reset()
1865 if (fman->dts_params.id == 0) in fman_reset()
1875 iowrite32be(FPM_RSTC_FM_RESET, &fman->fpm_regs->fm_rstc); in fman_reset()
1881 } while (((ioread32be(&fman->fpm_regs->fm_rstc)) & in fman_reset()
1906 dev_dbg(fman->dev, "%s: Didn't perform FManV3 reset due to Errata A007273!\n", in fman_reset()
1914 static int fman_init(struct fman *fman) in fman_init() argument
1919 if (is_init_done(fman->cfg)) in fman_init()
1922 fman->state->count1_micro_bit = FM_TIMESTAMP_1_USEC_BIT; in fman_init()
1924 cfg = fman->cfg; in fman_init()
1927 if (fman->state->rev_info.major < 6) in fman_init()
1928 fman->state->exceptions &= ~FMAN_EX_BMI_DISPATCH_RAM_ECC; in fman_init()
1930 if (fman->state->rev_info.major >= 6) in fman_init()
1931 fman->state->exceptions &= ~FMAN_EX_QMI_SINGLE_ECC; in fman_init()
1934 memset_io((void __iomem *)(fman->base_addr + CGP_OFFSET), 0, in fman_init()
1935 fman->state->fm_port_num_of_cg); in fman_init()
1943 fman->liodn_offset[i] = in fman_init()
1944 ioread32be(&fman->bmi_regs->fmbm_spliodn[i - 1]); in fman_init()
1945 liodn_base = ioread32be(&fman->dma_regs->fmdmplr[i / 2]); in fman_init()
1954 fman->liodn_base[i] = liodn_base; in fman_init()
1957 err = fman_reset(fman); in fman_init()
1961 if (ioread32be(&fman->qmi_regs->fmqm_gs) & QMI_GS_HALT_NOT_BUSY) { in fman_init()
1962 resume(fman->fpm_regs); in fman_init()
1967 } while (((ioread32be(&fman->qmi_regs->fmqm_gs)) & in fman_init()
1970 dev_warn(fman->dev, "%s: QMI is in halt not busy state\n", in fman_init()
1974 if (clear_iram(fman) != 0) in fman_init()
1977 cfg->exceptions = fman->state->exceptions; in fman_init()
1981 err = dma_init(fman); in fman_init()
1983 free_init_resources(fman); in fman_init()
1988 fpm_init(fman->fpm_regs, fman->cfg); in fman_init()
1992 fman->fifo_offset = fman_muram_alloc(fman->muram, in fman_init()
1993 fman->state->total_fifo_size); in fman_init()
1994 if (IS_ERR_VALUE(fman->fifo_offset)) { in fman_init()
1995 free_init_resources(fman); in fman_init()
1996 dev_err(fman->dev, "%s: MURAM alloc for BMI FIFO failed\n", in fman_init()
2001 cfg->fifo_base_addr = fman->fifo_offset; in fman_init()
2002 cfg->total_fifo_size = fman->state->total_fifo_size; in fman_init()
2003 cfg->total_num_of_tasks = fman->state->total_num_of_tasks; in fman_init()
2004 cfg->clk_freq = fman->state->fm_clk_freq; in fman_init()
2007 bmi_init(fman->bmi_regs, fman->cfg); in fman_init()
2010 qmi_init(fman->qmi_regs, fman->cfg); in fman_init()
2013 hwp_init(fman->hwp_regs); in fman_init()
2016 fman->keygen = keygen_init(fman->kg_regs); in fman_init()
2017 if (!fman->keygen) in fman_init()
2020 err = enable(fman, cfg); in fman_init()
2024 enable_time_stamp(fman); in fman_init()
2026 kfree(fman->cfg); in fman_init()
2027 fman->cfg = NULL; in fman_init()
2032 static int fman_set_exception(struct fman *fman, in fman_set_exception() argument
2037 if (!is_init_done(fman->cfg)) in fman_set_exception()
2043 fman->state->exceptions |= bit_mask; in fman_set_exception()
2045 fman->state->exceptions &= ~bit_mask; in fman_set_exception()
2047 dev_err(fman->dev, "%s: Undefined exception (%d)\n", in fman_set_exception()
2052 return set_exception(fman, exception, enable); in fman_set_exception()
2068 void fman_register_intr(struct fman *fman, enum fman_event_modules module, in fman_register_intr() argument
2078 fman->intr_mng[event].isr_cb = isr_cb; in fman_register_intr()
2079 fman->intr_mng[event].src_handle = src_arg; in fman_register_intr()
2094 void fman_unregister_intr(struct fman *fman, enum fman_event_modules module, in fman_unregister_intr() argument
2102 fman->intr_mng[event].isr_cb = NULL; in fman_unregister_intr()
2103 fman->intr_mng[event].src_handle = NULL; in fman_unregister_intr()
2116 int fman_set_port_params(struct fman *fman, in fman_set_port_params() argument
2123 spin_lock_irqsave(&fman->spinlock, flags); in fman_set_port_params()
2125 err = set_num_of_tasks(fman, port_params->port_id, in fman_set_port_params()
2136 fman->state->accumulated_num_of_deq_tnums += in fman_set_port_params()
2138 enq_th = (ioread32be(&fman->qmi_regs->fmqm_gc) & in fman_set_port_params()
2143 if (enq_th >= (fman->state->qmi_max_num_of_tnums - in fman_set_port_params()
2144 fman->state->accumulated_num_of_deq_tnums)) { in fman_set_port_params()
2146 fman->state->qmi_max_num_of_tnums - in fman_set_port_params()
2147 fman->state->accumulated_num_of_deq_tnums - 1; in fman_set_port_params()
2149 reg = ioread32be(&fman->qmi_regs->fmqm_gc); in fman_set_port_params()
2152 iowrite32be(reg, &fman->qmi_regs->fmqm_gc); in fman_set_port_params()
2155 deq_th = ioread32be(&fman->qmi_regs->fmqm_gc) & in fman_set_port_params()
2162 if ((deq_th <= fman->state->accumulated_num_of_deq_tnums) && in fman_set_port_params()
2163 (deq_th < fman->state->qmi_max_num_of_tnums - 1)) { in fman_set_port_params()
2164 deq_th = fman->state->accumulated_num_of_deq_tnums + 1; in fman_set_port_params()
2165 reg = ioread32be(&fman->qmi_regs->fmqm_gc); in fman_set_port_params()
2168 iowrite32be(reg, &fman->qmi_regs->fmqm_gc); in fman_set_port_params()
2172 err = set_size_of_fifo(fman, port_params->port_id, in fman_set_port_params()
2178 err = set_num_of_open_dmas(fman, port_params->port_id, in fman_set_port_params()
2184 set_port_liodn(fman, port_id, fman->liodn_base[port_id], in fman_set_port_params()
2185 fman->liodn_offset[port_id]); in fman_set_port_params()
2187 if (fman->state->rev_info.major < 6) in fman_set_port_params()
2188 set_port_order_restoration(fman->fpm_regs, port_id); in fman_set_port_params()
2190 mac_id = hw_port_id_to_sw_port_id(fman->state->rev_info.major, port_id); in fman_set_port_params()
2192 if (port_params->max_frame_length >= fman->state->mac_mfl[mac_id]) { in fman_set_port_params()
2193 fman->state->port_mfl[mac_id] = port_params->max_frame_length; in fman_set_port_params()
2195 dev_warn(fman->dev, "%s: Port (%d) max_frame_length is smaller than MAC (%d) current MTU\n", in fman_set_port_params()
2201 spin_unlock_irqrestore(&fman->spinlock, flags); in fman_set_port_params()
2206 spin_unlock_irqrestore(&fman->spinlock, flags); in fman_set_port_params()
2220 int fman_reset_mac(struct fman *fman, u8 mac_id) in fman_reset_mac() argument
2222 struct fman_fpm_regs __iomem *fpm_rg = fman->fpm_regs; in fman_reset_mac()
2225 if (fman->state->rev_info.major >= 6) { in fman_reset_mac()
2226 dev_err(fman->dev, "%s: FMan MAC reset no available for FMan V3!\n", in fman_reset_mac()
2264 dev_warn(fman->dev, "%s: Illegal MAC Id [%d]\n", in fman_reset_mac()
2291 int fman_set_mac_max_frame(struct fman *fman, u8 mac_id, u16 mfl) in fman_set_mac_max_frame() argument
2296 if ((!fman->state->port_mfl[mac_id]) || in fman_set_mac_max_frame()
2297 (mfl <= fman->state->port_mfl[mac_id])) { in fman_set_mac_max_frame()
2298 fman->state->mac_mfl[mac_id] = mfl; in fman_set_mac_max_frame()
2300 dev_warn(fman->dev, "%s: MAC max_frame_length is larger than Port max_frame_length\n", in fman_set_mac_max_frame()
2316 u16 fman_get_clock_freq(struct fman *fman) in fman_get_clock_freq() argument
2318 return fman->state->fm_clk_freq; in fman_get_clock_freq()
2329 u32 fman_get_bmi_max_fifo_size(struct fman *fman) in fman_get_bmi_max_fifo_size() argument
2331 return fman->state->bmi_max_fifo_size; in fman_get_bmi_max_fifo_size()
2346 void fman_get_revision(struct fman *fman, struct fman_rev_info *rev_info) in fman_get_revision() argument
2350 tmp = ioread32be(&fman->fpm_regs->fm_ip_rev_1); in fman_get_revision()
2366 u32 fman_get_qman_channel_id(struct fman *fman, u32 port_id) in fman_get_qman_channel_id() argument
2370 if (fman->state->rev_info.major >= 6) { in fman_get_qman_channel_id()
2376 for (i = 0; i < fman->state->num_of_qman_channels; i++) { in fman_get_qman_channel_id()
2386 for (i = 0; i < fman->state->num_of_qman_channels; i++) { in fman_get_qman_channel_id()
2392 if (i == fman->state->num_of_qman_channels) in fman_get_qman_channel_id()
2395 return fman->state->qman_channel_base + i; in fman_get_qman_channel_id()
2407 struct resource *fman_get_mem_region(struct fman *fman) in fman_get_mem_region() argument
2409 return fman->state->res; in fman_get_mem_region()
2514 struct fman *fman_bind(struct device *fm_dev) in fman_bind()
2516 return (struct fman *)(dev_get_drvdata(get_device(fm_dev))); in fman_bind()
2522 struct fman *fman = (struct fman *)handle; in fman_err_irq() local
2527 if (!is_init_done(fman->cfg)) in fman_err_irq()
2530 fpm_rg = fman->fpm_regs; in fman_err_irq()
2538 single_ret = bmi_err_event(fman); in fman_err_irq()
2543 single_ret = qmi_err_event(fman); in fman_err_irq()
2548 single_ret = fpm_err_event(fman); in fman_err_irq()
2553 single_ret = dma_err_event(fman); in fman_err_irq()
2558 single_ret = muram_err_intr(fman); in fman_err_irq()
2565 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 0); in fman_err_irq()
2570 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 1); in fman_err_irq()
2575 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 2); in fman_err_irq()
2580 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 3); in fman_err_irq()
2585 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 4); in fman_err_irq()
2590 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 5); in fman_err_irq()
2595 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 6); in fman_err_irq()
2600 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 7); in fman_err_irq()
2605 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 8); in fman_err_irq()
2610 single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 9); in fman_err_irq()
2620 struct fman *fman = (struct fman *)handle; in fman_irq() local
2625 if (!is_init_done(fman->cfg)) in fman_irq()
2628 fpm_rg = fman->fpm_regs; in fman_irq()
2636 single_ret = qmi_event(fman); in fman_irq()
2643 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 0); in fman_irq()
2648 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 1); in fman_irq()
2653 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 2); in fman_irq()
2658 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 3); in fman_irq()
2663 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 4); in fman_irq()
2668 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 5); in fman_irq()
2673 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 6); in fman_irq()
2678 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 7); in fman_irq()
2683 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 8); in fman_irq()
2688 single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 9); in fman_irq()
2703 static struct fman *read_dts_node(struct platform_device *of_dev) in read_dts_node()
2705 struct fman *fman; in read_dts_node() local
2715 fman = kzalloc(sizeof(*fman), GFP_KERNEL); in read_dts_node()
2716 if (!fman) in read_dts_node()
2727 fman->dts_params.id = (u8)val; in read_dts_node()
2745 fman->dts_params.err_irq = res->start; in read_dts_node()
2761 __func__, fman->dts_params.id); in read_dts_node()
2768 __func__, fman->dts_params.id); in read_dts_node()
2772 fman->dts_params.clk_freq = DIV_ROUND_UP(clk_rate, 1000000); in read_dts_node()
2781 fman->dts_params.qman_channel_base = range[0]; in read_dts_node()
2782 fman->dts_params.num_of_qman_channels = range[1]; in read_dts_node()
2793 &fman->dts_params.muram_res); in read_dts_node()
2805 "fman", fman); in read_dts_node()
2812 if (fman->dts_params.err_irq != 0) { in read_dts_node()
2813 err = devm_request_irq(&of_dev->dev, fman->dts_params.err_irq, in read_dts_node()
2815 "fman-err", fman); in read_dts_node()
2818 __func__, fman->dts_params.err_irq, err); in read_dts_node()
2823 fman->dts_params.res = in read_dts_node()
2826 if (!fman->dts_params.res) { in read_dts_node()
2832 fman->dts_params.base_addr = in read_dts_node()
2834 if (!fman->dts_params.base_addr) { in read_dts_node()
2839 fman->dev = &of_dev->dev; in read_dts_node()
2848 return fman; in read_dts_node()
2853 kfree(fman); in read_dts_node()
2859 struct fman *fman; in fman_probe() local
2865 fman = read_dts_node(of_dev); in fman_probe()
2866 if (!fman) in fman_probe()
2869 err = fman_config(fman); in fman_probe()
2875 if (fman_init(fman) != 0) { in fman_probe()
2880 if (fman->dts_params.err_irq == 0) { in fman_probe()
2881 fman_set_exception(fman, FMAN_EX_DMA_BUS_ERROR, false); in fman_probe()
2882 fman_set_exception(fman, FMAN_EX_DMA_READ_ECC, false); in fman_probe()
2883 fman_set_exception(fman, FMAN_EX_DMA_SYSTEM_WRITE_ECC, false); in fman_probe()
2884 fman_set_exception(fman, FMAN_EX_DMA_FM_WRITE_ECC, false); in fman_probe()
2885 fman_set_exception(fman, FMAN_EX_DMA_SINGLE_PORT_ECC, false); in fman_probe()
2886 fman_set_exception(fman, FMAN_EX_FPM_STALL_ON_TASKS, false); in fman_probe()
2887 fman_set_exception(fman, FMAN_EX_FPM_SINGLE_ECC, false); in fman_probe()
2888 fman_set_exception(fman, FMAN_EX_FPM_DOUBLE_ECC, false); in fman_probe()
2889 fman_set_exception(fman, FMAN_EX_QMI_SINGLE_ECC, false); in fman_probe()
2890 fman_set_exception(fman, FMAN_EX_QMI_DOUBLE_ECC, false); in fman_probe()
2891 fman_set_exception(fman, in fman_probe()
2893 fman_set_exception(fman, FMAN_EX_BMI_LIST_RAM_ECC, false); in fman_probe()
2894 fman_set_exception(fman, FMAN_EX_BMI_STORAGE_PROFILE_ECC, in fman_probe()
2896 fman_set_exception(fman, FMAN_EX_BMI_STATISTICS_RAM_ECC, false); in fman_probe()
2897 fman_set_exception(fman, FMAN_EX_BMI_DISPATCH_RAM_ECC, false); in fman_probe()
2900 dev_set_drvdata(dev, fman); in fman_probe()
2902 dev_dbg(dev, "FMan%d probed\n", fman->dts_params.id); in fman_probe()