diff --git a/arch/arm64/configs/rockchip_linux_defconfig b/arch/arm64/configs/rockchip_linux_defconfig index 01020d5862fb..8a4c8ac090a8 100644 --- a/arch/arm64/configs/rockchip_linux_defconfig +++ b/arch/arm64/configs/rockchip_linux_defconfig @@ -20,7 +20,6 @@ CONFIG_NAMESPACES=y CONFIG_USER_NS=y CONFIG_BLK_DEV_INITRD=y CONFIG_EMBEDDED=y -# CONFIG_COMPAT_BRK is not set CONFIG_PROFILING=y CONFIG_ARCH_ROCKCHIP=y # CONFIG_ARM64_ERRATUM_826319 is not set @@ -62,7 +61,6 @@ CONFIG_SETEND_EMULATION=y # CONFIG_ARM64_TLB_RANGE is not set # CONFIG_ARM64_BTI is not set # CONFIG_ARM64_E0PD is not set -# CONFIG_ARCH_RANDOM is not set # CONFIG_ARM64_MTE is not set # CONFIG_ARM64_SVE is not set CONFIG_ARM64_PSEUDO_NMI=y @@ -71,11 +69,9 @@ CONFIG_PM_ADVANCED_DEBUG=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y CONFIG_ENERGY_MODEL=y CONFIG_CPU_IDLE=y -CONFIG_ARM_CPUIDLE=y CONFIG_ARM_PSCI_CPUIDLE=y CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_STAT=y -CONFIG_CPU_FREQ_TIMES=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y @@ -83,24 +79,16 @@ CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y CONFIG_CPU_FREQ_GOV_INTERACTIVE=y CONFIG_CPUFREQ_DT=y CONFIG_ARM_ROCKCHIP_CPUFREQ=y -CONFIG_ARM_SCMI_PROTOCOL=y -CONFIG_ROCKCHIP_SIP=y -CONFIG_ARM64_CRYPTO=y -CONFIG_CRYPTO_SHA1_ARM64_CE=y -CONFIG_CRYPTO_SHA2_ARM64_CE=y -CONFIG_CRYPTO_GHASH_ARM64_CE=y -CONFIG_CRYPTO_AES_ARM64_CE_CCM=y -CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_PARTITION_ADVANCED=y CONFIG_CMDLINE_PARTITION=y +# CONFIG_COMPAT_BRK is not set # CONFIG_COMPACTION is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 CONFIG_CMA=y -CONFIG_ZSMALLOC=y CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y @@ -132,12 +120,15 @@ CONFIG_PCI=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEASPM_POWERSAVE=y CONFIG_PCIEASPM_EXT=y +# CONFIG_VGA_ARB is not set CONFIG_PCIE_ROCKCHIP_HOST=y CONFIG_PCIE_DW_ROCKCHIP=y CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_DEBUG_DEVRES=y CONFIG_CONNECTOR=y +CONFIG_ARM_SCMI_PROTOCOL=y +CONFIG_ROCKCHIP_SIP=y CONFIG_MTD=y CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_BLOCK=y @@ -168,7 +159,6 @@ CONFIG_NETDEVICES=y # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ATHEROS is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set @@ -187,6 +177,7 @@ CONFIG_NETDEVICES=y # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set CONFIG_R8168=y @@ -300,34 +291,32 @@ CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_USB_SUPPORT=y CONFIG_USB_VIDEO_CLASS=y # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set -# CONFIG_USB_GSPCA is not set CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_V4L_MEM2MEM_DRIVERS=y CONFIG_VIDEO_ROCKCHIP_CIF=y CONFIG_VIDEO_ROCKCHIP_RKISP1=y CONFIG_VIDEO_ROCKCHIP_ISP=y CONFIG_VIDEO_ROCKCHIP_ISPP=y CONFIG_VIDEO_ROCKCHIP_HDMIRX=y -CONFIG_V4L_MEM2MEM_DRIVERS=y CONFIG_VIDEO_ROCKCHIP_RGA=y -CONFIG_VIDEO_LT6911UXC=y -CONFIG_VIDEO_LT7911D=y -CONFIG_VIDEO_RK628_CSI=y -CONFIG_VIDEO_RK628_BT1120=y -CONFIG_VIDEO_TC35874X=y -CONFIG_VIDEO_RK_IRCUT=y CONFIG_VIDEO_GC8034=y CONFIG_VIDEO_IMX415=y CONFIG_VIDEO_IMX464=y CONFIG_VIDEO_OS04A10=y +CONFIG_VIDEO_OV13850=y CONFIG_VIDEO_OV4689=y CONFIG_VIDEO_OV5695=y CONFIG_VIDEO_OV7251=y -CONFIG_VIDEO_OV13850=y -# CONFIG_VGA_ARB is not set +CONFIG_VIDEO_LT6911UXC=y +CONFIG_VIDEO_LT7911D=y +CONFIG_VIDEO_TC35874X=y +CONFIG_VIDEO_RK628_CSI=y +CONFIG_VIDEO_RK628_BT1120=y +CONFIG_VIDEO_RK_IRCUT=y CONFIG_DRM=y CONFIG_DRM_IGNORE_IOTCL_PERMIT=y -CONFIG_DRM_DP_AUX_CHARDEV=y CONFIG_DRM_LOAD_EDID_FIRMWARE=y +CONFIG_DRM_DP_AUX_CHARDEV=y CONFIG_DRM_ROCKCHIP=y CONFIG_ROCKCHIP_ANALOGIX_DP=y CONFIG_ROCKCHIP_CDN_DP=y @@ -421,7 +410,7 @@ CONFIG_UHID=y CONFIG_HID_KENSINGTON=y CONFIG_HID_MULTITOUCH=y CONFIG_USB_HIDDEV=y -CONFIG_I2C_HID=y +CONFIG_I2C_HID_OF=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # CONFIG_USB_DEFAULT_PERSIST is not set CONFIG_USB_OTG=y @@ -484,24 +473,14 @@ CONFIG_RK_DMABUF_DEBUG=y CONFIG_SW_SYNC=y CONFIG_DMABUF_HEAPS=y CONFIG_DMABUF_SYSFS_STATS=y -CONFIG_DMABUF_HEAPS_DEFERRED_FREE=y -CONFIG_DMABUF_HEAPS_PAGE_POOL=y CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y CONFIG_STAGING=y -CONFIG_FIQ_DEBUGGER=y -CONFIG_FIQ_DEBUGGER_NO_SLEEP=y -CONFIG_FIQ_DEBUGGER_CONSOLE=y -CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y -CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y -CONFIG_RK_CONSOLE_THREAD=y CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCMI=y CONFIG_COMMON_CLK_PWM=y CONFIG_MAILBOX=y CONFIG_ROCKCHIP_MBOX=y -CONFIG_IOMMU_LIMIT_IOVA_ALIGNMENT=y -CONFIG_IOMMU_IOVA_ALIGNMENT=4 CONFIG_ROCKCHIP_IOMMU=y CONFIG_ARM_SMMU_V3=y CONFIG_RPMSG_ROCKCHIP=y @@ -528,6 +507,12 @@ CONFIG_ROCKCHIP_SYSTEM_MONITOR=y CONFIG_ROCKCHIP_VENDOR_STORAGE=y CONFIG_ROCKCHIP_MMC_VENDOR_STORAGE=y CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER=y +CONFIG_FIQ_DEBUGGER=y +CONFIG_FIQ_DEBUGGER_NO_SLEEP=y +CONFIG_FIQ_DEBUGGER_CONSOLE=y +CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y +CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y +CONFIG_RK_CONSOLE_THREAD=y CONFIG_ROCKCHIP_DEBUG=y CONFIG_PM_DEVFREQ=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y @@ -561,7 +546,6 @@ CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y CONFIG_PHY_ROCKCHIP_TYPEC=y CONFIG_PHY_ROCKCHIP_USB=y CONFIG_PHY_ROCKCHIP_USBDP=y -CONFIG_ANDROID=y CONFIG_NVMEM_ROCKCHIP_EFUSE=y CONFIG_NVMEM_ROCKCHIP_OTP=y CONFIG_TEE=y @@ -604,11 +588,15 @@ CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y CONFIG_NLS_UTF8=y CONFIG_UNICODE=y -CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_DEV_ROCKCHIP=y CONFIG_CRYPTO_DEV_ROCKCHIP_DEV=y CONFIG_CRC_CCITT=y @@ -622,7 +610,8 @@ CONFIG_DMA_CMA=y CONFIG_PRINTK_TIME=y CONFIG_PRINTK_TIME_FROM_ARM_ARCH_TIMER=y CONFIG_DYNAMIC_DEBUG=y -CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y +CONFIG_DEBUG_INFO_REDUCED=y CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 CONFIG_SCHEDSTATS=y diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 03b75d98abe8..cd641b1bce7b 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -43,7 +43,7 @@ config DRM_EDID config DRM_IGNORE_IOTCL_PERMIT bool "Ignore drm ioctl permission" - depends on DRM && ANDROID && NO_GKI + depends on DRM && NO_GKI config DRM_MIPI_DSI bool diff --git a/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c b/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c index 1fa8d3aea989..97e236cf10f2 100644 --- a/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c +++ b/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c @@ -121,22 +121,13 @@ static int csi2_dphy_update_sensor_mbus(struct v4l2_subdev *sd) return ret; sensor->mbus = mbus; - switch (mbus.flags & V4L2_MBUS_CSI2_LANES) { - case V4L2_MBUS_CSI2_1_LANE: - sensor->lanes = 1; - break; - case V4L2_MBUS_CSI2_2_LANE: - sensor->lanes = 2; - break; - case V4L2_MBUS_CSI2_3_LANE: - sensor->lanes = 3; - break; - case V4L2_MBUS_CSI2_4_LANE: - sensor->lanes = 4; - break; - default: - return -EINVAL; - } + + if (mbus.type == V4L2_MBUS_CSI2_DPHY || + mbus.type == V4L2_MBUS_CSI2_CPHY) + sensor->lanes = mbus.bus.mipi_csi2.num_data_lanes; + else if (mbus.type == V4L2_MBUS_CCP2) + sensor->lanes = mbus.bus.mipi_csi1.data_lane; + if (dphy->drv_data->vendor == PHY_VENDOR_INNO) { ret = v4l2_subdev_call(sensor_sd, core, ioctl, RKMODULE_GET_BUS_CONFIG, &bus_config); @@ -491,9 +482,10 @@ static int rockchip_csi2_dphy_fwnode_parse(struct device *dev, return -EINVAL; } - if (vep->bus_type == V4L2_MBUS_CSI2_DPHY) { + if (vep->bus_type == V4L2_MBUS_CSI2_DPHY || + vep->bus_type == V4L2_MBUS_CSI2_CPHY) { config->type = V4L2_MBUS_CSI2_DPHY; - config->flags = vep->bus.mipi_csi2.flags; + config->bus.mipi_csi2.flags = vep->bus.mipi_csi2.flags; s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes; } else if (vep->bus_type == V4L2_MBUS_CCP2) { config->type = V4L2_MBUS_CCP2; @@ -503,23 +495,6 @@ static int rockchip_csi2_dphy_fwnode_parse(struct device *dev, return -EINVAL; } - switch (s_asd->lanes) { - case 1: - config->flags |= V4L2_MBUS_CSI2_1_LANE; - break; - case 2: - config->flags |= V4L2_MBUS_CSI2_2_LANE; - break; - case 3: - config->flags |= V4L2_MBUS_CSI2_3_LANE; - break; - case 4: - config->flags |= V4L2_MBUS_CSI2_4_LANE; - break; - default: - return -EINVAL; - } - return 0; } diff --git a/drivers/phy/rockchip/phy-rockchip-mipi-rx.c b/drivers/phy/rockchip/phy-rockchip-mipi-rx.c index a99764257220..245c8731a027 100644 --- a/drivers/phy/rockchip/phy-rockchip-mipi-rx.c +++ b/drivers/phy/rockchip/phy-rockchip-mipi-rx.c @@ -794,22 +794,11 @@ static int mipidphy_update_sensor_mbus(struct v4l2_subdev *sd) return ret; sensor->mbus = mbus; - switch (mbus.flags & V4L2_MBUS_CSI2_LANES) { - case V4L2_MBUS_CSI2_1_LANE: - sensor->lanes = 1; - break; - case V4L2_MBUS_CSI2_2_LANE: - sensor->lanes = 2; - break; - case V4L2_MBUS_CSI2_3_LANE: - sensor->lanes = 3; - break; - case V4L2_MBUS_CSI2_4_LANE: - sensor->lanes = 4; - break; - default: - return -EINVAL; - } + if (mbus.type == V4L2_MBUS_CSI2_DPHY || + mbus.type == V4L2_MBUS_CSI2_CPHY) + sensor->lanes = mbus.bus.mipi_csi2.num_data_lanes; + else if (mbus.type == V4L2_MBUS_CCP2) + sensor->lanes = mbus.bus.mipi_csi1.data_lane; return 0; } @@ -1414,10 +1403,10 @@ static int csi_mipidphy_stream_on(struct mipidphy_priv *priv, write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1e); write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1f); if (drv_data->chip_id == CHIP_ID_RK3326S) { - if (sensor->mbus.flags & V4L2_MBUS_CSI2_CONTINUOUS_CLOCK) - clk_mode = 0x03; - else if (sensor->mbus.flags & V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK) + if (sensor->mbus.bus.mipi_csi2.flags & V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK) clk_mode = 0; + else + clk_mode = 0x03; write_csiphy_reg(priv, CSIPHY_CLK_MODE, clk_mode); } } else { @@ -1708,7 +1697,7 @@ static int rockchip_mipidphy_fwnode_parse(struct device *dev, if (vep->bus_type == V4L2_MBUS_CSI2_DPHY) { config->type = V4L2_MBUS_CSI2_DPHY; - config->flags = vep->bus.mipi_csi2.flags; + config->bus.mipi_csi2.flags = vep->bus.mipi_csi2.flags; s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes; } else if (vep->bus_type == V4L2_MBUS_CCP2) { /* V4L2_MBUS_CCP2 for lvds */ @@ -1719,23 +1708,6 @@ static int rockchip_mipidphy_fwnode_parse(struct device *dev, return -EINVAL; } - switch (s_asd->lanes) { - case 1: - config->flags |= V4L2_MBUS_CSI2_1_LANE; - break; - case 2: - config->flags |= V4L2_MBUS_CSI2_2_LANE; - break; - case 3: - config->flags |= V4L2_MBUS_CSI2_3_LANE; - break; - case 4: - config->flags |= V4L2_MBUS_CSI2_4_LANE; - break; - default: - return -EINVAL; - } - return 0; } diff --git a/drivers/video/rockchip/mpp/mpp_iommu.c b/drivers/video/rockchip/mpp/mpp_iommu.c index fe8a1a414b94..d4b65f9b3dc9 100644 --- a/drivers/video/rockchip/mpp/mpp_iommu.c +++ b/drivers/video/rockchip/mpp/mpp_iommu.c @@ -272,14 +272,14 @@ fail: int mpp_dma_unmap_kernel(struct mpp_dma_session *dma, struct mpp_dma_buffer *buffer) { - void *vaddr = buffer->vaddr; + struct iosys_map map = IOSYS_MAP_INIT_VADDR(buffer->vaddr); struct dma_buf *dmabuf = buffer->dmabuf; - if (IS_ERR_OR_NULL(vaddr) || + if (IS_ERR_OR_NULL(map.vaddr) || IS_ERR_OR_NULL(dmabuf)) return -EINVAL; - dma_buf_vunmap(dmabuf, vaddr); + dma_buf_vunmap(dmabuf, &map); buffer->vaddr = NULL; dma_buf_end_cpu_access(dmabuf, DMA_FROM_DEVICE); @@ -291,7 +291,7 @@ int mpp_dma_map_kernel(struct mpp_dma_session *dma, struct mpp_dma_buffer *buffer) { int ret; - void *vaddr; + struct iosys_map map; struct dma_buf *dmabuf = buffer->dmabuf; if (IS_ERR_OR_NULL(dmabuf)) @@ -303,14 +303,13 @@ int mpp_dma_map_kernel(struct mpp_dma_session *dma, goto failed_access; } - vaddr = dma_buf_vmap(dmabuf); - if (!vaddr) { + ret = dma_buf_vmap(dmabuf, &map); + if (ret) { dev_dbg(dma->dev, "can't vmap the dma buffer\n"); - ret = -EIO; goto failed_vmap; } - buffer->vaddr = vaddr; + buffer->vaddr = map.vaddr; return 0; @@ -633,3 +632,31 @@ int mpp_iommu_dev_deactivate(struct mpp_iommu_info *info, struct mpp_dev *dev) return 0; } + +int mpp_iommu_reserve_iova(struct mpp_iommu_info *info, dma_addr_t iova, size_t size) +{ + + struct iommu_domain *domain; + struct mpp_iommu_dma_cookie *cookie; + struct iova_domain *iovad; + unsigned long pfn_lo, pfn_hi; + + if (!info) + return 0; + + domain = info->domain; + if (!domain || !domain->iova_cookie) + return -EINVAL; + + cookie = (struct mpp_iommu_dma_cookie *)domain->iova_cookie; + iovad = &cookie->iovad; + + /* iova will be freed automatically by put_iova_domain() */ + pfn_lo = iova_pfn(iovad, iova); + pfn_hi = iova_pfn(iovad, iova + size - 1); + if (!reserve_iova(iovad, pfn_lo, pfn_hi)) + return -EINVAL; + + return 0; + +} diff --git a/drivers/video/rockchip/mpp/mpp_iommu.h b/drivers/video/rockchip/mpp/mpp_iommu.h index 87d1b5c612d2..c4c0199f8558 100644 --- a/drivers/video/rockchip/mpp/mpp_iommu.h +++ b/drivers/video/rockchip/mpp/mpp_iommu.h @@ -14,6 +14,19 @@ #include #include #include +#include + +enum iommu_dma_cookie_type { + IOMMU_DMA_IOVA_COOKIE, + IOMMU_DMA_MSI_COOKIE, +}; + +/* Keep in mind: member order must keep align with struct iommu_dma_cookie */ +struct mpp_iommu_dma_cookie { + enum iommu_dma_cookie_type type; + /* Full allocator for IOMMU_DMA_IOVA_COOKIE */ + struct iova_domain iovad; +}; struct mpp_dma_buffer { /* link to dma session buffer list */ @@ -122,6 +135,7 @@ int mpp_av1_iommu_enable(struct device *dev); int mpp_iommu_dev_activate(struct mpp_iommu_info *info, struct mpp_dev *dev); int mpp_iommu_dev_deactivate(struct mpp_iommu_info *info, struct mpp_dev *dev); +int mpp_iommu_reserve_iova(struct mpp_iommu_info *info, dma_addr_t iova, size_t size); static inline int mpp_iommu_down_read(struct mpp_iommu_info *info) { diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec.c b/drivers/video/rockchip/mpp/mpp_rkvdec.c index cad51ddc562b..0e6089986014 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -182,7 +181,6 @@ struct rkvdec_dev { struct devfreq *devfreq; struct devfreq *parent_devfreq; struct notifier_block devfreq_nb; - struct thermal_cooling_device *devfreq_cooling; struct thermal_zone_device *thermal_zone; u32 static_power_coeff; s32 ts[4]; @@ -418,106 +416,9 @@ static struct devfreq_dev_profile devfreq_profile = { .target = devfreq_target, .get_cur_freq = devfreq_get_cur_freq, .get_dev_status = devfreq_get_dev_status, + .is_cooling_device = true, }; -static unsigned long -model_static_power(struct devfreq *devfreq, - unsigned long voltage) -{ - struct device *dev = devfreq->dev.parent; - struct rkvdec_dev *dec = dev_get_drvdata(dev); - struct thermal_zone_device *tz = dec->thermal_zone; - - int temperature; - unsigned long temp; - unsigned long temp_squared, temp_cubed, temp_scaling_factor; - const unsigned long voltage_cubed = (voltage * voltage * voltage) >> 10; - - if (!IS_ERR_OR_NULL(tz) && tz->ops->get_temp) { - int ret; - - ret = tz->ops->get_temp(tz, &temperature); - if (ret) { - dev_warn_ratelimited(dev, "ddr thermal zone failed\n"); - temperature = FALLBACK_STATIC_TEMPERATURE; - } - } else { - temperature = FALLBACK_STATIC_TEMPERATURE; - } - - /* - * Calculate the temperature scaling factor. To be applied to the - * voltage scaled power. - */ - temp = temperature / 1000; - temp_squared = temp * temp; - temp_cubed = temp_squared * temp; - temp_scaling_factor = (dec->ts[3] * temp_cubed) - + (dec->ts[2] * temp_squared) + (dec->ts[1] * temp) + dec->ts[0]; - - return (((dec->static_power_coeff * voltage_cubed) >> 20) - * temp_scaling_factor) / 1000000; -} - -static struct devfreq_cooling_power cooling_power_data = { - .get_static_power = model_static_power, - .dyn_power_coeff = 120, -}; - -static int power_model_simple_init(struct mpp_dev *mpp) -{ - struct rkvdec_dev *dec = to_rkvdec_dev(mpp); - struct device_node *np = mpp->dev->of_node; - - u32 temp; - const char *tz_name; - struct device_node *power_model_node; - - power_model_node = of_get_child_by_name(np, "vcodec_power_model"); - if (!power_model_node) { - dev_err(mpp->dev, "could not find power_model node\n"); - return -ENODEV; - } - - if (of_property_read_string(power_model_node, - "thermal-zone", - &tz_name)) { - dev_err(mpp->dev, "ts in power_model not available\n"); - return -EINVAL; - } - - dec->thermal_zone = thermal_zone_get_zone_by_name(tz_name); - if (IS_ERR(dec->thermal_zone)) { - pr_warn("Error getting ddr thermal zone, not yet ready?\n"); - dec->thermal_zone = NULL; - return -EPROBE_DEFER; - } - - if (of_property_read_u32(power_model_node, - "static-power-coefficient", - &dec->static_power_coeff)) { - dev_err(mpp->dev, "static-power-coefficient not available\n"); - return -EINVAL; - } - if (of_property_read_u32(power_model_node, - "dynamic-power-coefficient", - &temp)) { - dev_err(mpp->dev, "dynamic-power-coefficient not available\n"); - return -EINVAL; - } - cooling_power_data.dyn_power_coeff = (unsigned long)temp; - - if (of_property_read_u32_array(power_model_node, - "ts", - (u32 *)dec->ts, - 4)) { - dev_err(mpp->dev, "ts in power_model not available\n"); - return -EINVAL; - } - - return 0; -} - static int devfreq_notifier_call(struct notifier_block *nb, unsigned long event, void *data) @@ -558,7 +459,7 @@ static int fill_scaling_list_pps(struct rkvdec_task *task, int pps_info_size, int sub_addr_offset) { struct dma_buf *dmabuf = NULL; - void *vaddr = NULL; + struct iosys_map map; u8 *pps = NULL; u32 scaling_fd = 0; int ret = 0; @@ -573,16 +474,15 @@ static int fill_scaling_list_pps(struct rkvdec_task *task, ret = dma_buf_begin_cpu_access(dmabuf, DMA_FROM_DEVICE); if (ret) { mpp_err("can't access the pps buffer\n"); - goto done; + goto access_failed; } - vaddr = dma_buf_vmap(dmabuf); - if (!vaddr) { + ret = dma_buf_vmap(dmabuf, &map); + if (ret) { mpp_err("can't access the pps buffer\n"); - ret = -EIO; - goto done; + goto vmap_failed; } - pps = vaddr + offset; + pps = map.vaddr + offset; /* NOTE: scaling buffer in pps, have no offset */ memcpy(&scaling_fd, pps + base, sizeof(scaling_fd)); scaling_fd = le32_to_cpu(scaling_fd); @@ -596,7 +496,7 @@ static int fill_scaling_list_pps(struct rkvdec_task *task, if (IS_ERR(mem_region)) { mpp_err("scaling list fd %d attach failed\n", scaling_fd); ret = PTR_ERR(mem_region); - goto done; + goto task_fd_failed; } tmp = mem_region->iova & 0xffffffff; @@ -610,9 +510,11 @@ static int fill_scaling_list_pps(struct rkvdec_task *task, memcpy(pps + base, &tmp, sizeof(tmp)); } -done: - dma_buf_vunmap(dmabuf, vaddr); +task_fd_failed: + dma_buf_vunmap(dmabuf, &map); +vmap_failed: dma_buf_end_cpu_access(dmabuf, DMA_FROM_DEVICE); +access_failed: dma_buf_put(dmabuf); return ret; @@ -1369,38 +1271,25 @@ static int rkvdec_devfreq_init(struct mpp_dev *mpp) "rkvdec_leakage", "vcodec"); if (ret) { dev_err(mpp->dev, "Failed to init_opp_table\n"); - goto done; + return ret; } dec->devfreq = devm_devfreq_add_device(mpp->dev, &devfreq_profile, "userspace", NULL); if (IS_ERR(dec->devfreq)) { ret = PTR_ERR(dec->devfreq); - goto done; + return ret; } stat = &dec->devfreq->last_status; stat->current_frequency = clk_get_rate(dec->aclk_info.clk); ret = devfreq_register_opp_notifier(mpp->dev, dec->devfreq); - if (ret) - goto done; - - /* power simplle init */ - ret = power_model_simple_init(mpp); - if (!ret && dec->devfreq) { - dec->devfreq_cooling = - of_devfreq_cooling_register_power(mpp->dev->of_node, - dec->devfreq, - &cooling_power_data); - if (IS_ERR_OR_NULL(dec->devfreq_cooling)) { - ret = -ENXIO; - dev_err(mpp->dev, "Failed to register cooling\n"); - goto done; - } + if (ret < 0) { + dev_err(mpp->dev, "failed to register opp notifier\n"); + return ret; } -done: - return ret; + return 0; } #else static inline int rkvdec_devfreq_remove(struct mpp_dev *mpp) diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c index 175582feb370..0bf3737c7e96 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c @@ -17,8 +17,6 @@ #include "hack/mpp_rkvdec2_hack_rk3568.c" -#include -#include #include #include #include @@ -787,6 +785,7 @@ static struct devfreq_dev_profile rkvdec2_devfreq_profile = { .target = rkvdec2_devfreq_target, .get_dev_status = rkvdec2_devfreq_get_dev_status, .get_cur_freq = rkvdec2_devfreq_get_cur_freq, + .is_cooling_device = true, }; static int devfreq_vdec2_ondemand_func(struct devfreq *df, unsigned long *freq) @@ -813,22 +812,6 @@ static struct devfreq_governor devfreq_vdec2_ondemand = { .event_handler = devfreq_vdec2_ondemand_handler, }; -static unsigned long rkvdec2_get_static_power(struct devfreq *devfreq, - unsigned long voltage) -{ - struct rkvdec2_dev *dec = devfreq->data; - - if (!dec->model_data) - return 0; - else - return rockchip_ipa_get_static_power(dec->model_data, - voltage); -} - -static struct devfreq_cooling_power vdec2_cooling_power_data = { - .get_static_power = rkvdec2_get_static_power, -}; - static struct monitor_dev_profile vdec2_mdevp = { .type = MONITOR_TPYE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, @@ -839,7 +822,6 @@ static int rkvdec2_devfreq_init(struct mpp_dev *mpp) { struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); struct clk *clk_core = dec->core_clk_info.clk; - struct devfreq_cooling_power *vdec2_dcp = &vdec2_cooling_power_data; int ret = 0; if (!clk_core) @@ -884,28 +866,6 @@ static int rkvdec2_devfreq_init(struct mpp_dev *mpp) devfreq_register_opp_notifier(mpp->dev, dec->devfreq); - of_property_read_u32(mpp->dev->of_node, "dynamic-power-coefficient", - (u32 *)&vdec2_dcp->dyn_power_coeff); - dec->model_data = rockchip_ipa_power_model_init(mpp->dev, - "vdec_leakage"); - if (IS_ERR_OR_NULL(dec->model_data)) { - dec->model_data = NULL; - dev_err(mpp->dev, "failed to initialize power model\n"); - } else if (dec->model_data->dynamic_coefficient) { - vdec2_dcp->dyn_power_coeff = - dec->model_data->dynamic_coefficient; - } - if (!vdec2_dcp->dyn_power_coeff) { - dev_err(mpp->dev, "failed to get dynamic-coefficient\n"); - goto out; - } - - dec->devfreq_cooling = - of_devfreq_cooling_register_power(mpp->dev->of_node, - dec->devfreq, vdec2_dcp); - if (IS_ERR_OR_NULL(dec->devfreq_cooling)) - dev_err(mpp->dev, "failed to register cooling device\n"); - vdec2_mdevp.data = dec->devfreq; dec->mdev_info = rockchip_system_monitor_register(mpp->dev, &vdec2_mdevp); if (IS_ERR(dec->mdev_info)) { @@ -913,7 +873,6 @@ static int rkvdec2_devfreq_init(struct mpp_dev *mpp) dec->mdev_info = NULL; } -out: return 0; devfreq_err: @@ -1426,7 +1385,7 @@ static int rkvdec2_alloc_rcbbuf(struct platform_device *pdev, struct rkvdec2_dev return -EINVAL; } /* alloc reserve iova for rcb */ - ret = iommu_dma_reserve_iova(dev, iova, rcb_size); + ret = mpp_iommu_reserve_iova(dec->mpp.iommu_info, iova, rcb_size); if (ret) { dev_err(dev, "alloc rcb iova error.\n"); return ret; diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.h b/drivers/video/rockchip/mpp/mpp_rkvdec2.h index aef2f3a5af20..5ff89a256d85 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2.h +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.h @@ -195,8 +195,6 @@ struct rkvdec2_dev { unsigned long volt; unsigned long core_rate_hz; unsigned long core_last_rate_hz; - struct ipa_power_model_data *model_data; - struct thermal_cooling_device *devfreq_cooling; struct monitor_dev_info *mdev_info; #endif diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c index e6f7784b7284..2d5840ca8db8 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -198,8 +197,6 @@ struct rkvenc_dev { unsigned long volt; unsigned long core_rate_hz; unsigned long core_last_rate_hz; - struct ipa_power_model_data *model_data; - struct thermal_cooling_device *devfreq_cooling; struct monitor_dev_info *mdev_info; #endif /* for iommu pagefault handle */ @@ -926,6 +923,7 @@ static struct devfreq_dev_profile rkvenc_devfreq_profile = { .target = rkvenc_devfreq_target, .get_dev_status = rkvenc_devfreq_get_dev_status, .get_cur_freq = rkvenc_devfreq_get_cur_freq, + .is_cooling_device = true, }; static int devfreq_venc_ondemand_func(struct devfreq *df, unsigned long *freq) @@ -952,22 +950,6 @@ static struct devfreq_governor devfreq_venc_ondemand = { .event_handler = devfreq_venc_ondemand_handler, }; -static unsigned long rkvenc_get_static_power(struct devfreq *devfreq, - unsigned long voltage) -{ - struct rkvenc_dev *enc = devfreq->data; - - if (!enc->model_data) - return 0; - else - return rockchip_ipa_get_static_power(enc->model_data, - voltage); -} - -static struct devfreq_cooling_power venc_cooling_power_data = { - .get_static_power = rkvenc_get_static_power, -}; - static struct monitor_dev_profile enc_mdevp = { .type = MONITOR_TPYE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, @@ -1020,7 +1002,6 @@ static int rkvenc_devfreq_init(struct mpp_dev *mpp) { struct rkvenc_dev *enc = to_rkvenc_dev(mpp); struct clk *clk_core = enc->core_clk_info.clk; - struct devfreq_cooling_power *venc_dcp = &venc_cooling_power_data; struct rockchip_opp_info opp_info = {0}; int ret = 0; @@ -1067,28 +1048,6 @@ static int rkvenc_devfreq_init(struct mpp_dev *mpp) devfreq_register_opp_notifier(mpp->dev, enc->devfreq); - of_property_read_u32(mpp->dev->of_node, "dynamic-power-coefficient", - (u32 *)&venc_dcp->dyn_power_coeff); - enc->model_data = rockchip_ipa_power_model_init(mpp->dev, - "venc_leakage"); - if (IS_ERR_OR_NULL(enc->model_data)) { - enc->model_data = NULL; - dev_err(mpp->dev, "failed to initialize power model\n"); - } else if (enc->model_data->dynamic_coefficient) { - venc_dcp->dyn_power_coeff = - enc->model_data->dynamic_coefficient; - } - if (!venc_dcp->dyn_power_coeff) { - dev_err(mpp->dev, "failed to get dynamic-coefficient\n"); - goto out; - } - - enc->devfreq_cooling = - of_devfreq_cooling_register_power(mpp->dev->of_node, - enc->devfreq, venc_dcp); - if (IS_ERR_OR_NULL(enc->devfreq_cooling)) - dev_err(mpp->dev, "failed to register cooling device\n"); - enc_mdevp.data = enc->devfreq; enc->mdev_info = rockchip_system_monitor_register(mpp->dev, &enc_mdevp); if (IS_ERR(enc->mdev_info)) { @@ -1096,8 +1055,6 @@ static int rkvenc_devfreq_init(struct mpp_dev *mpp) enc->mdev_info = NULL; } -out: - return 0; devfreq_err: diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc2.c b/drivers/video/rockchip/mpp/mpp_rkvenc2.c index 24d1f89ea994..0b0f623c95b7 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc2.c @@ -1721,9 +1721,6 @@ static int rkvenc_devfreq_init(struct mpp_dev *mpp) struct rkvenc_dev *enc = to_rkvenc_dev(mpp); struct clk *clk_core = enc->core_clk_info.clk; struct device *dev = mpp->dev; - struct opp_table *reg_table = NULL; - struct opp_table *clk_table = NULL; - const char *const reg_names[] = { "venc", "mem" }; int ret = 0; if (!clk_core) @@ -1731,18 +1728,22 @@ static int rkvenc_devfreq_init(struct mpp_dev *mpp) if (of_find_property(dev->of_node, "venc-supply", NULL) && of_find_property(dev->of_node, "mem-supply", NULL)) { - reg_table = dev_pm_opp_set_regulators(dev, reg_names, 2); - if (IS_ERR(reg_table)) - return PTR_ERR(reg_table); + const char *const reg_names[] = { "venc", "mem", NULL }; + + ret = dev_pm_opp_set_regulators(dev, reg_names); + if (ret) + return ret; } else { - reg_table = dev_pm_opp_set_regulators(dev, reg_names, 1); - if (IS_ERR(reg_table)) - return PTR_ERR(reg_table); + const char *const reg_names[] = { "venc", NULL }; + + ret = dev_pm_opp_set_regulators(dev, reg_names); + if (ret) + return ret; } - clk_table = dev_pm_opp_set_clkname(dev, "clk_core"); - if (IS_ERR(clk_table)) - return PTR_ERR(clk_table); + ret = dev_pm_opp_set_clkname(dev, "clk_core"); + if (ret) + return ret; rockchip_get_opp_data(rockchip_rkvenc_of_match, &enc->opp_info); ret = rockchip_init_opp_table(dev, &enc->opp_info, "leakage", "venc"); @@ -2282,7 +2283,7 @@ static int rkvenc2_alloc_rcbbuf(struct platform_device *pdev, struct rkvenc_dev return -EINVAL; } /* alloc reserve iova for rcb */ - ret = iommu_dma_reserve_iova(dev, iova, sram_used); + ret = mpp_iommu_reserve_iova(enc->mpp.iommu_info, iova, sram_used); if (ret) { dev_err(dev, "alloc rcb iova error.\n"); return ret; diff --git a/drivers/video/rockchip/rga3/rga_dma_buf.c b/drivers/video/rockchip/rga3/rga_dma_buf.c index d6ccd01eb4e0..214de47bab6d 100644 --- a/drivers/video/rockchip/rga3/rga_dma_buf.c +++ b/drivers/video/rockchip/rga3/rga_dma_buf.c @@ -209,6 +209,8 @@ static dma_addr_t rga_iommu_dma_alloc_iova(struct iommu_domain *domain, shift = iova_shift(iovad); iova_len = size >> shift; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0)) /* * Freeing non-power-of-two-sized allocations back into the IOVA caches * will come back to bite us badly, so we have to waste a bit of space @@ -217,6 +219,7 @@ static dma_addr_t rga_iommu_dma_alloc_iova(struct iommu_domain *domain, */ if (iova_len < (1 << (IOVA_RANGE_CACHE_MAX_SIZE - 1))) iova_len = roundup_pow_of_two(iova_len); +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) dma_limit = min_not_zero(dma_limit, dev->bus_dma_limit);