Loading drivers/media/platform/msm/vidc/venus_hfi.c +30 −49 Original line number Diff line number Diff line Loading @@ -512,8 +512,8 @@ static void venus_hfi_free(struct venus_hfi_device *dev, struct msm_smem *mem) msm_smem_free(dev->hal_client, mem); } static void venus_hfi_write_register(struct venus_hfi_device *device, u32 reg, u32 value, u8 *vaddr) static void venus_hfi_write_register( struct venus_hfi_device *device, u32 reg, u32 value) { u32 hwiosymaddr = reg; u8 *base_addr; Loading Loading @@ -570,7 +570,7 @@ static void venus_hfi_set_registers(struct venus_hfi_device *device) for (i = 0; i < reg_set->count; i++) { venus_hfi_write_register(device, reg_set->reg_tbl[i].reg, reg_set->reg_tbl[i].value, 0); reg_set->reg_tbl[i].value); } } Loading @@ -580,9 +580,8 @@ static int venus_hfi_core_start_cpu(struct venus_hfi_device *device) int max_tries = 100; venus_hfi_write_register(device, VIDC_WRAPPER_INTR_MASK, VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK, 0); venus_hfi_write_register(device, VIDC_CPU_CS_SCIACMDARG3, 1, 0); VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK); venus_hfi_write_register(device, VIDC_CPU_CS_SCIACMDARG3, 1); while (!ctrl_status && count < max_tries) { ctrl_status = venus_hfi_read_register( Loading Loading @@ -1088,8 +1087,7 @@ static inline int venus_hfi_tzbsp_set_video_state(enum tzbsp_video_state state) static inline int venus_hfi_reset_core(struct venus_hfi_device *device) { int rc = 0; venus_hfi_write_register(device, VIDC_CTRL_INIT, 0x1, 0); venus_hfi_write_register(device, VIDC_CTRL_INIT, 0x1); rc = venus_hfi_core_start_cpu(device); if (rc) dprintk(VIDC_ERR, "Failed to start core\n"); Loading Loading @@ -1231,7 +1229,7 @@ static int venus_hfi_halt_axi(struct venus_hfi_device *device) /* Halt AXI and AXI OCMEM VBIF Access */ reg = venus_hfi_read_register(device, VENUS_VBIF_AXI_HALT_CTRL0); reg |= VENUS_VBIF_AXI_HALT_CTRL0_HALT_REQ; venus_hfi_write_register(device, VENUS_VBIF_AXI_HALT_CTRL0, reg, 0); venus_hfi_write_register(device, VENUS_VBIF_AXI_HALT_CTRL0, reg); /* Request for AXI bus port halt */ rc = readl_poll_timeout(device->hal_data->register_base Loading Loading @@ -1325,19 +1323,17 @@ static inline int venus_hfi_power_on(struct venus_hfi_device *device) venus_hfi_set_registers(device); venus_hfi_write_register(device, VIDC_UC_REGION_ADDR, (u32)device->iface_q_table.align_device_addr, 0); venus_hfi_write_register(device, VIDC_UC_REGION_SIZE, SHARED_QSIZE, 0); (u32)device->iface_q_table.align_device_addr); venus_hfi_write_register(device, VIDC_UC_REGION_SIZE, SHARED_QSIZE); venus_hfi_write_register(device, VIDC_CPU_CS_SCIACMDARG2, (u32)device->iface_q_table.align_device_addr, device->iface_q_table.align_virtual_addr); (u32)device->iface_q_table.align_device_addr); if (device->sfr.align_device_addr) venus_hfi_write_register(device, VIDC_SFR_ADDR, (u32)device->sfr.align_device_addr, 0); (u32)device->sfr.align_device_addr); if (device->qdss.align_device_addr) venus_hfi_write_register(device, VIDC_MMAP_ADDR, (u32)device->qdss.align_device_addr, 0); (u32)device->qdss.align_device_addr); /* Reboot the firmware */ rc = venus_hfi_tzbsp_set_video_state(TZBSP_VIDEO_STATE_RESUME); Loading Loading @@ -1428,7 +1424,7 @@ static inline int venus_hfi_clk_gating_off(struct venus_hfi_device *device) } venus_hfi_write_register(device, VIDC_WRAPPER_INTR_MASK, VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK, 0); VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK); } already_enabled: device->clocks_enabled = 1; Loading Loading @@ -1500,9 +1496,8 @@ static int venus_hfi_iface_cmdq_write_nolock(struct venus_hfi_device *device, } if (rx_req_is_set) venus_hfi_write_register( device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT, 0); device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT); result = 0; } else { dprintk(VIDC_ERR, "venus_hfi_iface_cmdq_write:queue_full\n"); Loading Loading @@ -1542,9 +1537,8 @@ static int venus_hfi_iface_msgq_read(struct venus_hfi_device *device, void *pkt) } if (tx_req_is_set) venus_hfi_write_register( device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT, 0); device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT); rc = 0; mutex_unlock(&device->clk_pwr_lock); } else { Loading Loading @@ -1586,9 +1580,8 @@ static int venus_hfi_iface_dbgq_read(struct venus_hfi_device *device, void *pkt) } if (tx_req_is_set) venus_hfi_write_register( device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT, 0); device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT); rc = 0; mutex_unlock(&device->clk_pwr_lock); } else { Loading Loading @@ -1855,16 +1848,10 @@ static int venus_hfi_interface_queues_init(struct venus_hfi_device *dev) "Invalid iface_q_table device address (0x%pa)", &dev->iface_q_table.align_device_addr); } venus_hfi_write_register(dev, VIDC_UC_REGION_ADDR, value, 0); venus_hfi_write_register(dev, VIDC_UC_REGION_SIZE, SHARED_QSIZE, 0); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG2, value, dev->iface_q_table.align_virtual_addr); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG1, 0x01, dev->iface_q_table.align_virtual_addr); venus_hfi_write_register(dev, VIDC_UC_REGION_ADDR, value); venus_hfi_write_register(dev, VIDC_UC_REGION_SIZE, SHARED_QSIZE); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG2, value); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG1, 0x01); if (dev->qdss.mem_data) { qdss = (struct hfi_mem_map_table *)dev->qdss.align_virtual_addr; Loading Loading @@ -1898,8 +1885,7 @@ static int venus_hfi_interface_queues_init(struct venus_hfi_device *dev) &dev->qdss.align_device_addr); } if (dev->qdss.align_device_addr) venus_hfi_write_register(dev, VIDC_MMAP_ADDR, value, 0); venus_hfi_write_register(dev, VIDC_MMAP_ADDR, value); } vsfr = (struct hfi_sfr_struct *) dev->sfr.align_virtual_addr; Loading @@ -1911,8 +1897,7 @@ static int venus_hfi_interface_queues_init(struct venus_hfi_device *dev) &dev->sfr.align_device_addr); } if (dev->sfr.align_device_addr) venus_hfi_write_register(dev, VIDC_SFR_ADDR, value , 0); venus_hfi_write_register(dev, VIDC_SFR_ADDR, value); return 0; fail_alloc_queue: return -ENOMEM; Loading Loading @@ -2034,8 +2019,7 @@ static int venus_hfi_core_init(void *device) goto err_core_init; } enable_irq(dev->hal_data->irq); venus_hfi_write_register(dev, VIDC_CTRL_INIT, 0x1, 0); venus_hfi_write_register(dev, VIDC_CTRL_INIT, 0x1); rc = venus_hfi_core_start_cpu(dev); if (rc) { dprintk(VIDC_ERR, "Failed to start core\n"); Loading Loading @@ -2081,8 +2065,7 @@ static int venus_hfi_core_release(void *device) mutex_unlock(&dev->clk_pwr_lock); return -EIO; } venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG3, 0, 0); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG3, 0); if (!(dev->intr_status & VIDC_WRAPPER_INTR_STATUS_A2HWD_BMSK)) disable_irq_nosync(dev->hal_data->irq); dev->intr_status = 0; Loading Loading @@ -2139,7 +2122,7 @@ static inline void venus_hfi_clk_gating_on(struct venus_hfi_device *device) venus_hfi_write_register(device, VIDC_WRAPPER_INTR_MASK, VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK | VIDC_WRAPPER_INTR_MASK_A2HCPU_BMSK, 0); VIDC_WRAPPER_INTR_MASK_A2HCPU_BMSK); } venus_hfi_clk_disable(device); if (!queue_delayed_work(device->venus_pm_workq, &venus_hfi_pm_work, Loading Loading @@ -2186,10 +2169,8 @@ static void venus_hfi_core_clear_interrupt(struct venus_hfi_device *device) device, device->spur_count, intr_status); } venus_hfi_write_register(device, VIDC_CPU_CS_A2HSOFTINTCLR, 1, 0); venus_hfi_write_register(device, VIDC_WRAPPER_INTR_CLEAR, intr_status, 0); venus_hfi_write_register(device, VIDC_CPU_CS_A2HSOFTINTCLR, 1); venus_hfi_write_register(device, VIDC_WRAPPER_INTR_CLEAR, intr_status); dprintk(VIDC_DBG, "Cleared WRAPPER/A2H interrupt\n"); err_clk_gating_off: mutex_unlock(&device->clk_pwr_lock); Loading Loading
drivers/media/platform/msm/vidc/venus_hfi.c +30 −49 Original line number Diff line number Diff line Loading @@ -512,8 +512,8 @@ static void venus_hfi_free(struct venus_hfi_device *dev, struct msm_smem *mem) msm_smem_free(dev->hal_client, mem); } static void venus_hfi_write_register(struct venus_hfi_device *device, u32 reg, u32 value, u8 *vaddr) static void venus_hfi_write_register( struct venus_hfi_device *device, u32 reg, u32 value) { u32 hwiosymaddr = reg; u8 *base_addr; Loading Loading @@ -570,7 +570,7 @@ static void venus_hfi_set_registers(struct venus_hfi_device *device) for (i = 0; i < reg_set->count; i++) { venus_hfi_write_register(device, reg_set->reg_tbl[i].reg, reg_set->reg_tbl[i].value, 0); reg_set->reg_tbl[i].value); } } Loading @@ -580,9 +580,8 @@ static int venus_hfi_core_start_cpu(struct venus_hfi_device *device) int max_tries = 100; venus_hfi_write_register(device, VIDC_WRAPPER_INTR_MASK, VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK, 0); venus_hfi_write_register(device, VIDC_CPU_CS_SCIACMDARG3, 1, 0); VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK); venus_hfi_write_register(device, VIDC_CPU_CS_SCIACMDARG3, 1); while (!ctrl_status && count < max_tries) { ctrl_status = venus_hfi_read_register( Loading Loading @@ -1088,8 +1087,7 @@ static inline int venus_hfi_tzbsp_set_video_state(enum tzbsp_video_state state) static inline int venus_hfi_reset_core(struct venus_hfi_device *device) { int rc = 0; venus_hfi_write_register(device, VIDC_CTRL_INIT, 0x1, 0); venus_hfi_write_register(device, VIDC_CTRL_INIT, 0x1); rc = venus_hfi_core_start_cpu(device); if (rc) dprintk(VIDC_ERR, "Failed to start core\n"); Loading Loading @@ -1231,7 +1229,7 @@ static int venus_hfi_halt_axi(struct venus_hfi_device *device) /* Halt AXI and AXI OCMEM VBIF Access */ reg = venus_hfi_read_register(device, VENUS_VBIF_AXI_HALT_CTRL0); reg |= VENUS_VBIF_AXI_HALT_CTRL0_HALT_REQ; venus_hfi_write_register(device, VENUS_VBIF_AXI_HALT_CTRL0, reg, 0); venus_hfi_write_register(device, VENUS_VBIF_AXI_HALT_CTRL0, reg); /* Request for AXI bus port halt */ rc = readl_poll_timeout(device->hal_data->register_base Loading Loading @@ -1325,19 +1323,17 @@ static inline int venus_hfi_power_on(struct venus_hfi_device *device) venus_hfi_set_registers(device); venus_hfi_write_register(device, VIDC_UC_REGION_ADDR, (u32)device->iface_q_table.align_device_addr, 0); venus_hfi_write_register(device, VIDC_UC_REGION_SIZE, SHARED_QSIZE, 0); (u32)device->iface_q_table.align_device_addr); venus_hfi_write_register(device, VIDC_UC_REGION_SIZE, SHARED_QSIZE); venus_hfi_write_register(device, VIDC_CPU_CS_SCIACMDARG2, (u32)device->iface_q_table.align_device_addr, device->iface_q_table.align_virtual_addr); (u32)device->iface_q_table.align_device_addr); if (device->sfr.align_device_addr) venus_hfi_write_register(device, VIDC_SFR_ADDR, (u32)device->sfr.align_device_addr, 0); (u32)device->sfr.align_device_addr); if (device->qdss.align_device_addr) venus_hfi_write_register(device, VIDC_MMAP_ADDR, (u32)device->qdss.align_device_addr, 0); (u32)device->qdss.align_device_addr); /* Reboot the firmware */ rc = venus_hfi_tzbsp_set_video_state(TZBSP_VIDEO_STATE_RESUME); Loading Loading @@ -1428,7 +1424,7 @@ static inline int venus_hfi_clk_gating_off(struct venus_hfi_device *device) } venus_hfi_write_register(device, VIDC_WRAPPER_INTR_MASK, VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK, 0); VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK); } already_enabled: device->clocks_enabled = 1; Loading Loading @@ -1500,9 +1496,8 @@ static int venus_hfi_iface_cmdq_write_nolock(struct venus_hfi_device *device, } if (rx_req_is_set) venus_hfi_write_register( device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT, 0); device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT); result = 0; } else { dprintk(VIDC_ERR, "venus_hfi_iface_cmdq_write:queue_full\n"); Loading Loading @@ -1542,9 +1537,8 @@ static int venus_hfi_iface_msgq_read(struct venus_hfi_device *device, void *pkt) } if (tx_req_is_set) venus_hfi_write_register( device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT, 0); device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT); rc = 0; mutex_unlock(&device->clk_pwr_lock); } else { Loading Loading @@ -1586,9 +1580,8 @@ static int venus_hfi_iface_dbgq_read(struct venus_hfi_device *device, void *pkt) } if (tx_req_is_set) venus_hfi_write_register( device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT, 0); device, VIDC_CPU_IC_SOFTINT, 1 << VIDC_CPU_IC_SOFTINT_H2A_SHFT); rc = 0; mutex_unlock(&device->clk_pwr_lock); } else { Loading Loading @@ -1855,16 +1848,10 @@ static int venus_hfi_interface_queues_init(struct venus_hfi_device *dev) "Invalid iface_q_table device address (0x%pa)", &dev->iface_q_table.align_device_addr); } venus_hfi_write_register(dev, VIDC_UC_REGION_ADDR, value, 0); venus_hfi_write_register(dev, VIDC_UC_REGION_SIZE, SHARED_QSIZE, 0); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG2, value, dev->iface_q_table.align_virtual_addr); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG1, 0x01, dev->iface_q_table.align_virtual_addr); venus_hfi_write_register(dev, VIDC_UC_REGION_ADDR, value); venus_hfi_write_register(dev, VIDC_UC_REGION_SIZE, SHARED_QSIZE); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG2, value); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG1, 0x01); if (dev->qdss.mem_data) { qdss = (struct hfi_mem_map_table *)dev->qdss.align_virtual_addr; Loading Loading @@ -1898,8 +1885,7 @@ static int venus_hfi_interface_queues_init(struct venus_hfi_device *dev) &dev->qdss.align_device_addr); } if (dev->qdss.align_device_addr) venus_hfi_write_register(dev, VIDC_MMAP_ADDR, value, 0); venus_hfi_write_register(dev, VIDC_MMAP_ADDR, value); } vsfr = (struct hfi_sfr_struct *) dev->sfr.align_virtual_addr; Loading @@ -1911,8 +1897,7 @@ static int venus_hfi_interface_queues_init(struct venus_hfi_device *dev) &dev->sfr.align_device_addr); } if (dev->sfr.align_device_addr) venus_hfi_write_register(dev, VIDC_SFR_ADDR, value , 0); venus_hfi_write_register(dev, VIDC_SFR_ADDR, value); return 0; fail_alloc_queue: return -ENOMEM; Loading Loading @@ -2034,8 +2019,7 @@ static int venus_hfi_core_init(void *device) goto err_core_init; } enable_irq(dev->hal_data->irq); venus_hfi_write_register(dev, VIDC_CTRL_INIT, 0x1, 0); venus_hfi_write_register(dev, VIDC_CTRL_INIT, 0x1); rc = venus_hfi_core_start_cpu(dev); if (rc) { dprintk(VIDC_ERR, "Failed to start core\n"); Loading Loading @@ -2081,8 +2065,7 @@ static int venus_hfi_core_release(void *device) mutex_unlock(&dev->clk_pwr_lock); return -EIO; } venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG3, 0, 0); venus_hfi_write_register(dev, VIDC_CPU_CS_SCIACMDARG3, 0); if (!(dev->intr_status & VIDC_WRAPPER_INTR_STATUS_A2HWD_BMSK)) disable_irq_nosync(dev->hal_data->irq); dev->intr_status = 0; Loading Loading @@ -2139,7 +2122,7 @@ static inline void venus_hfi_clk_gating_on(struct venus_hfi_device *device) venus_hfi_write_register(device, VIDC_WRAPPER_INTR_MASK, VIDC_WRAPPER_INTR_MASK_A2HVCODEC_BMSK | VIDC_WRAPPER_INTR_MASK_A2HCPU_BMSK, 0); VIDC_WRAPPER_INTR_MASK_A2HCPU_BMSK); } venus_hfi_clk_disable(device); if (!queue_delayed_work(device->venus_pm_workq, &venus_hfi_pm_work, Loading Loading @@ -2186,10 +2169,8 @@ static void venus_hfi_core_clear_interrupt(struct venus_hfi_device *device) device, device->spur_count, intr_status); } venus_hfi_write_register(device, VIDC_CPU_CS_A2HSOFTINTCLR, 1, 0); venus_hfi_write_register(device, VIDC_WRAPPER_INTR_CLEAR, intr_status, 0); venus_hfi_write_register(device, VIDC_CPU_CS_A2HSOFTINTCLR, 1); venus_hfi_write_register(device, VIDC_WRAPPER_INTR_CLEAR, intr_status); dprintk(VIDC_DBG, "Cleared WRAPPER/A2H interrupt\n"); err_clk_gating_off: mutex_unlock(&device->clk_pwr_lock); Loading