Merge commit 'a41b37cce25eff86fa855e4be7236b0e4a68feac'

* commit 'a41b37cce25eff86fa855e4be7236b0e4a68feac':
  phy: rockchip: csi2-dphy: fixes build error for kernel 6.1
  phy: rockchip: mipi-rx: fixes build error for kernel 6.1
  video: rockchip: rga3: fix compile errors on kernel-6.1
  arm64: rockchip_linux_defconfig: Use DEBUG_INFO_REDUCED
  arm64: rockchip_linux_defconfig: address renamed CONFIG_DEBUG_INFO=y
  arm64: rockchip_linux_defconfig: Replace I2C_HID by I2C_HID_OF
  arm64: rockchip_linux_defconfig: Remove unused configs
  arm64: rockchip_linux_defconfig: Remove Android only configs
  arm64: rockchip_linux_defconfig: reorder configs only for kernel 6.1
  drm: DRM_IGNORE_IOTCL_PERMIT drop depends on ANDROID
  video: rockchip: mpp: rkvenc2: fix adapt to kernel 6.1 issue
  video: rockchip: mpp: rkvenc: remove old power model
  video: rockchip: mpp: rkvdec2: remove old power model
  video: rockchip: mpp: rkvdec: remove old power model
  video: rockchip: mpp: iommu: fix adapt to kernel 6.1
  video: rockchip: mpp: fix dma_buf_vmap/vunmap adapt to kernel 6.1
This commit is contained in:
Tao Huang
2023-06-01 19:41:06 +08:00
12 changed files with 135 additions and 351 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -14,6 +14,19 @@
#include <linux/iommu.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include <linux/iova.h>
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)
{

View File

@@ -12,7 +12,6 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/devfreq.h>
#include <linux/devfreq_cooling.h>
#include <linux/gfp.h>
#include <linux/interrupt.h>
#include <linux/iopoll.h>
@@ -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)

View File

@@ -17,8 +17,6 @@
#include "hack/mpp_rkvdec2_hack_rk3568.c"
#include <linux/devfreq_cooling.h>
#include <soc/rockchip/rockchip_ipa.h>
#include <soc/rockchip/rockchip_dmc.h>
#include <soc/rockchip/rockchip_opp_select.h>
#include <soc/rockchip/rockchip_system_monitor.h>
@@ -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;

View File

@@ -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

View File

@@ -12,7 +12,6 @@
#include <asm/cacheflush.h>
#include <linux/delay.h>
#include <linux/devfreq.h>
#include <linux/devfreq_cooling.h>
#include <linux/iopoll.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
@@ -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:

View File

@@ -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;

View File

@@ -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);