mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
Merge tag 'drm-msm-fixes-2026-09-16' of https://gitlab.freedesktop.org/drm/msm into drm-fixes
Fixes for v7.3-rc4: DT: - Corrected indentation Core: - Marked fbdev as system memory GPU: - Fixed autosuspend cleanup on teardown - a750: fix timestamps - Increase GMU fw init timeout - Misc fixes/cleanups DPU: - Fixed clock rounding, unbreaking newest platforms - Cleared pending flush state DP: - Skip PUSH_IDLE when link was never enabled - Fixed bandwidth checks HDMI: - Fixed runtime PM cleanup on probe failure Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rob Clark <rob.clark@oss.qualcomm.com> Link: https://patch.msgid.link/CACSVV021rZsjmiPEyR_LR7L=k7=DRV0QdsA50BF_Gd0s2DXaCw@mail.gmail.com
This commit is contained in:
commit
b15e54761a
|
|
@ -150,7 +150,7 @@ examples:
|
|||
reg = <0>;
|
||||
|
||||
dpu_intf0_out: endpoint {
|
||||
remote-endpoint = <&mdss_dp0_in>;
|
||||
remote-endpoint = <&mdss_dp0_in>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -352,9 +352,9 @@ examples:
|
|||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
reg = <1>;
|
||||
|
||||
mdss_dp_out: endpoint { };
|
||||
mdss_dp_out: endpoint { };
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -248,9 +248,9 @@ examples:
|
|||
remote-endpoint = <&usb_dp_qmpphy_dp_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
dp_opp_table: opp-table {
|
||||
dp_opp_table: opp-table {
|
||||
compatible = "operating-points-v2";
|
||||
|
||||
opp-162000000 {
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ examples:
|
|||
port@1 {
|
||||
reg = <1>;
|
||||
dpu_intf1_out: endpoint {
|
||||
remote-endpoint = <&mdss_dsi0_in>;
|
||||
remote-endpoint = <&mdss_dsi0_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
@ -90,18 +90,18 @@ examples:
|
|||
compatible = "operating-points-v2";
|
||||
|
||||
opp-19200000 {
|
||||
opp-hz = /bits/ 64 <19200000>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
opp-hz = /bits/ 64 <19200000>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
};
|
||||
|
||||
opp-25600000 {
|
||||
opp-hz = /bits/ 64 <25600000>;
|
||||
required-opps = <&rpmhpd_opp_svs>;
|
||||
opp-hz = /bits/ 64 <25600000>;
|
||||
required-opps = <&rpmhpd_opp_svs>;
|
||||
};
|
||||
|
||||
opp-307200000 {
|
||||
opp-hz = /bits/ 64 <307200000>;
|
||||
required-opps = <&rpmhpd_opp_nom>;
|
||||
opp-hz = /bits/ 64 <307200000>;
|
||||
required-opps = <&rpmhpd_opp_nom>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@ examples:
|
|||
phys = <&mdss_dsi0_phy>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
|
|
|
|||
|
|
@ -208,47 +208,47 @@ examples:
|
|||
#sound-dai-cells = <0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
|
||||
mdss_dp0_in: endpoint {
|
||||
remote-endpoint = <&mdss_intf0_out>;
|
||||
};
|
||||
};
|
||||
mdss_dp0_in: endpoint {
|
||||
remote-endpoint = <&mdss_intf0_out>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
|
||||
mdss_dp0_out: endpoint {
|
||||
};
|
||||
};
|
||||
mdss_dp0_out: endpoint {
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mdss_dp0_opp_table: opp-table {
|
||||
compatible = "operating-points-v2";
|
||||
compatible = "operating-points-v2";
|
||||
|
||||
opp-160000000 {
|
||||
opp-hz = /bits/ 64 <160000000>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
};
|
||||
opp-160000000 {
|
||||
opp-hz = /bits/ 64 <160000000>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
};
|
||||
|
||||
opp-270000000 {
|
||||
opp-hz = /bits/ 64 <270000000>;
|
||||
required-opps = <&rpmhpd_opp_svs>;
|
||||
};
|
||||
opp-270000000 {
|
||||
opp-hz = /bits/ 64 <270000000>;
|
||||
required-opps = <&rpmhpd_opp_svs>;
|
||||
};
|
||||
|
||||
opp-540000000 {
|
||||
opp-hz = /bits/ 64 <540000000>;
|
||||
required-opps = <&rpmhpd_opp_svs_l1>;
|
||||
};
|
||||
opp-540000000 {
|
||||
opp-hz = /bits/ 64 <540000000>;
|
||||
required-opps = <&rpmhpd_opp_svs_l1>;
|
||||
};
|
||||
|
||||
opp-810000000 {
|
||||
opp-hz = /bits/ 64 <810000000>;
|
||||
required-opps = <&rpmhpd_opp_nom>;
|
||||
};
|
||||
opp-810000000 {
|
||||
opp-hz = /bits/ 64 <810000000>;
|
||||
required-opps = <&rpmhpd_opp_nom>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -7,3 +7,10 @@ kms_hdmi_inject@inject-4k,Fail
|
|||
kms_lease@lease-uevent,Fail
|
||||
msm/msm_mapping@memptrs,Fail
|
||||
msm/msm_mapping@ring,Fail
|
||||
|
||||
# Started failing with v7.3-rc2 backmerge
|
||||
# https://gitlab.freedesktop.org/drm/msm/-/work_items/104
|
||||
kms_cursor_legacy@single-move,Fail
|
||||
kms_cursor_legacy@torture-bo,Fail
|
||||
kms_cursor_legacy@forked-bo,Fail
|
||||
kms_cursor_legacy@torture-move,Fail
|
||||
|
|
|
|||
|
|
@ -177,7 +177,6 @@ quiet_cmd_headergen = GENHDR $@
|
|||
cmd_headergen = mkdir -p $(obj)/generated && $(PYTHON3) $(src)/registers/gen_header.py \
|
||||
$(headergen-opts) --rnn $(src)/registers --xml $< c-defines > $@
|
||||
|
||||
# TODO how to do this for a2xx/a5xx which have different .xml arg?
|
||||
quiet_cmd_headergen_json = GENHDRJSN $@
|
||||
cmd_headergen_json = mkdir -p $(obj)/generated && $(PYTHON3) $(src)/registers/gen_header.py \
|
||||
$(headergen-opts) --rnn $(src)/registers --xml $(filter %.xml,$^) perfcntrs --json $< > $@
|
||||
|
|
|
|||
|
|
@ -320,7 +320,7 @@ static int a6xx_gmu_start(struct a6xx_gmu *gmu)
|
|||
gmu_write(gmu, REG_A6XX_GMU_CM3_SYSRESET, 0);
|
||||
|
||||
ret = gmu_poll_timeout(gmu, REG_A6XX_GMU_CM3_FW_INIT_RESULT, val,
|
||||
(val & mask) == reset_val, 100, 10000);
|
||||
(val & mask) == reset_val, 100, 100000);
|
||||
|
||||
if (ret)
|
||||
DRM_DEV_ERROR(gmu->dev, "GMU firmware initialization timed out\n");
|
||||
|
|
|
|||
|
|
@ -23,9 +23,15 @@ static u64 a6xx_gmu_get_timestamp(struct msm_gpu *gpu)
|
|||
u64 count_hi, count_lo, temp;
|
||||
|
||||
do {
|
||||
count_hi = gmu_read(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_H);
|
||||
count_lo = gmu_read(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_L);
|
||||
temp = gmu_read(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_H);
|
||||
if (adreno_is_a750_family(adreno_gpu)) {
|
||||
count_hi = gmu_read(&a6xx_gpu->gmu, REG_A7XX_GMU_CX_AO_COUNTER_H);
|
||||
count_lo = gmu_read(&a6xx_gpu->gmu, REG_A7XX_GMU_CX_AO_COUNTER_L);
|
||||
temp = gmu_read(&a6xx_gpu->gmu, REG_A7XX_GMU_CX_AO_COUNTER_H);
|
||||
} else {
|
||||
count_hi = gmu_read(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_H);
|
||||
count_lo = gmu_read(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_L);
|
||||
temp = gmu_read(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_H);
|
||||
}
|
||||
} while (unlikely(count_hi != temp));
|
||||
|
||||
return (count_hi << 32) | count_lo;
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ MODULE_PARM_DESC(disable_acd, "Forcefully disable GPU ACD");
|
|||
module_param_unsafe(disable_acd, bool, 0400);
|
||||
|
||||
static bool skip_gpu;
|
||||
MODULE_PARM_DESC(no_gpu, "Disable GPU driver register (0=enable GPU driver register (default), 1=skip GPU driver register");
|
||||
MODULE_PARM_DESC(skip_gpu, "Disable GPU driver register (0=enable GPU driver register (default), 1=skip GPU driver register");
|
||||
module_param(skip_gpu, bool, 0400);
|
||||
|
||||
extern const struct adreno_gpulist a2xx_gpulist;
|
||||
|
|
|
|||
|
|
@ -52,6 +52,12 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* We need PAS to be able to load the firmware */
|
||||
if (!qcom_pas_is_available()) {
|
||||
DRM_DEV_ERROR(dev, "PAS is not available\n");
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
||||
ret = of_reserved_mem_region_to_resource(np, 0, &r);
|
||||
if (ret) {
|
||||
zap_available = false;
|
||||
|
|
@ -170,18 +176,11 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname,
|
|||
int adreno_zap_shader_load(struct msm_gpu *gpu, u32 pasid)
|
||||
{
|
||||
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
|
||||
struct platform_device *pdev = gpu->pdev;
|
||||
|
||||
/* Short cut if we determine the zap shader isn't available/needed */
|
||||
if (!zap_available)
|
||||
return -ENODEV;
|
||||
|
||||
/* We need PAS to be able to load the firmware */
|
||||
if (!qcom_pas_is_available()) {
|
||||
DRM_DEV_ERROR(&pdev->dev, "PAS is not available\n");
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
||||
return zap_shader_load_mdt(gpu, adreno_gpu->info->zapfw, pasid);
|
||||
}
|
||||
|
||||
|
|
@ -1262,6 +1261,8 @@ void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
|
|||
for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++)
|
||||
release_firmware(adreno_gpu->fw[i]);
|
||||
|
||||
pm_runtime_dont_use_autosuspend(&gpu->pdev->dev);
|
||||
|
||||
if (priv && pm_runtime_enabled(&priv->gpu_pdev->dev))
|
||||
pm_runtime_disable(&priv->gpu_pdev->dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -118,6 +118,7 @@ static inline void dpu_hw_ctl_clear_pending_flush(struct dpu_hw_ctl *ctx)
|
|||
ctx->pending_intf_flush_mask = 0;
|
||||
ctx->pending_wb_flush_mask = 0;
|
||||
ctx->pending_cwb_flush_mask = 0;
|
||||
ctx->pending_periph_flush_mask = 0;
|
||||
ctx->pending_merge_3d_flush_mask = 0;
|
||||
ctx->pending_dsc_flush_mask = 0;
|
||||
ctx->pending_cdm_flush_mask = 0;
|
||||
|
|
|
|||
|
|
@ -756,6 +756,7 @@ enum drm_mode_status msm_dp_display_mode_valid(struct msm_dp *dp,
|
|||
struct msm_dp_link_info *link_info;
|
||||
u32 mode_rate_khz = 0, supported_rate_khz = 0, mode_bpp = 0;
|
||||
int mode_pclk_khz = mode->clock;
|
||||
int link_pclk_khz;
|
||||
bool is_yuv_420;
|
||||
|
||||
if (!dp || !mode_pclk_khz || !dp->connector) {
|
||||
|
|
@ -775,6 +776,8 @@ enum drm_mode_status msm_dp_display_mode_valid(struct msm_dp *dp,
|
|||
if (is_yuv_420 && !msm_dp_display->panel->vsc_sdp_supported)
|
||||
return MODE_NO_420;
|
||||
|
||||
link_pclk_khz = is_yuv_420 ? mode_pclk_khz / 2 : mode_pclk_khz;
|
||||
|
||||
if (is_yuv_420 || msm_dp_display->wide_bus_supported)
|
||||
mode_pclk_khz /= 2;
|
||||
|
||||
|
|
@ -786,9 +789,9 @@ enum drm_mode_status msm_dp_display_mode_valid(struct msm_dp *dp,
|
|||
mode_bpp = default_bpp;
|
||||
|
||||
mode_bpp = msm_dp_panel_get_mode_bpp(msm_dp_display->panel,
|
||||
mode_bpp, mode_pclk_khz);
|
||||
mode_bpp, link_pclk_khz);
|
||||
|
||||
mode_rate_khz = mode_pclk_khz * mode_bpp;
|
||||
mode_rate_khz = link_pclk_khz * mode_bpp;
|
||||
supported_rate_khz = link_info->num_lanes * link_info->rate * 8;
|
||||
|
||||
if (mode_rate_khz > supported_rate_khz)
|
||||
|
|
@ -1458,6 +1461,20 @@ void msm_dp_display_atomic_disable(struct msm_dp *dp)
|
|||
|
||||
msm_dp_display = container_of(dp, struct msm_dp_display_private, msm_dp_display);
|
||||
|
||||
/*
|
||||
* If .atomic_enable() bailed out - link training failure is the common
|
||||
* case - the mainlink was never brought up and ->power_on stayed false.
|
||||
* Driving the PUSH_IDLE pattern into a controller that was never
|
||||
* enabled times out, and .atomic_post_disable() then drops the
|
||||
* controller's runtime-PM reference without tearing the PHY back down,
|
||||
* because msm_dp_display_disable() returns early on !power_on. On
|
||||
* glymur (Snapdragon X2 Elite) that combination is answered by a
|
||||
* TrustZone-level SOCCP/ADSP force-stop and a silent SoC reset.
|
||||
* There is nothing to push idle, so leave it alone.
|
||||
*/
|
||||
if (!dp->power_on)
|
||||
return;
|
||||
|
||||
msm_dp_ctrl_push_idle(msm_dp_display->ctrl);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ struct msm_dsi_host {
|
|||
struct clk *dsi_pll_pixel_clk;
|
||||
|
||||
unsigned long byte_clk_rate;
|
||||
unsigned long byte_intf_clk_rate;
|
||||
bool byte_intf_clk_div_2;
|
||||
unsigned long pixel_clk_rate;
|
||||
unsigned long esc_clk_rate;
|
||||
|
||||
|
|
@ -382,8 +382,20 @@ int msm_dsi_runtime_resume(struct device *dev)
|
|||
|
||||
int dsi_link_clk_set_rate_6g(struct msm_dsi_host *msm_host)
|
||||
{
|
||||
unsigned long byte_intf_clk_rate;
|
||||
long rounded_byte_clk_rate;
|
||||
int ret;
|
||||
|
||||
rounded_byte_clk_rate = clk_round_rate(msm_host->byte_clk,
|
||||
msm_host->byte_clk_rate);
|
||||
if (rounded_byte_clk_rate < 0) {
|
||||
pr_err("%s: failed to round byte clock rate, %ld\n",
|
||||
__func__, rounded_byte_clk_rate);
|
||||
return rounded_byte_clk_rate;
|
||||
}
|
||||
|
||||
msm_host->byte_clk_rate = rounded_byte_clk_rate;
|
||||
|
||||
DBG("Set clk rates: pclk=%lu, byteclk=%lu",
|
||||
msm_host->pixel_clk_rate, msm_host->byte_clk_rate);
|
||||
|
||||
|
|
@ -401,7 +413,11 @@ int dsi_link_clk_set_rate_6g(struct msm_dsi_host *msm_host)
|
|||
}
|
||||
|
||||
if (msm_host->byte_intf_clk) {
|
||||
ret = clk_set_rate(msm_host->byte_intf_clk, msm_host->byte_intf_clk_rate);
|
||||
byte_intf_clk_rate = msm_host->byte_clk_rate;
|
||||
if (msm_host->byte_intf_clk_div_2)
|
||||
byte_intf_clk_rate /= 2;
|
||||
|
||||
ret = clk_set_rate(msm_host->byte_intf_clk, byte_intf_clk_rate);
|
||||
if (ret) {
|
||||
pr_err("%s: Failed to set rate byte intf clk, %d\n",
|
||||
__func__, ret);
|
||||
|
|
@ -669,24 +685,12 @@ static void dsi_calc_pclk(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
|
|||
|
||||
int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
|
||||
{
|
||||
long rounded_byte_clk_rate;
|
||||
|
||||
if (!msm_host->mode) {
|
||||
pr_err("%s: mode not set\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dsi_calc_pclk(msm_host, is_bonded_dsi);
|
||||
|
||||
rounded_byte_clk_rate = clk_round_rate(msm_host->byte_clk,
|
||||
msm_host->byte_clk_rate);
|
||||
if (rounded_byte_clk_rate < 0) {
|
||||
pr_err("%s: failed to round byte clock rate, %ld\n",
|
||||
__func__, rounded_byte_clk_rate);
|
||||
return rounded_byte_clk_rate;
|
||||
}
|
||||
|
||||
msm_host->byte_clk_rate = rounded_byte_clk_rate;
|
||||
msm_host->esc_clk_rate = clk_get_rate(msm_host->esc_clk);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2495,9 +2499,7 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
|
|||
goto unlock_ret;
|
||||
}
|
||||
|
||||
msm_host->byte_intf_clk_rate = msm_host->byte_clk_rate;
|
||||
if (phy_shared_timings->byte_intf_clk_div_2)
|
||||
msm_host->byte_intf_clk_rate /= 2;
|
||||
msm_host->byte_intf_clk_div_2 = phy_shared_timings->byte_intf_clk_div_2;
|
||||
|
||||
msm_dsi_sfpb_config(msm_host, true);
|
||||
|
||||
|
|
|
|||
|
|
@ -168,13 +168,13 @@ static int msm_hdmi_phy_probe(struct platform_device *pdev)
|
|||
|
||||
ret = msm_hdmi_phy_resource_enable(phy);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_pm_disable;
|
||||
|
||||
ret = msm_hdmi_phy_pll_init(pdev, phy->cfg->type);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(dev, "couldn't init PLL\n");
|
||||
msm_hdmi_phy_resource_disable(phy);
|
||||
return ret;
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
msm_hdmi_phy_resource_disable(phy);
|
||||
|
|
@ -182,6 +182,10 @@ static int msm_hdmi_phy_probe(struct platform_device *pdev)
|
|||
platform_set_drvdata(pdev, phy);
|
||||
|
||||
return 0;
|
||||
|
||||
err_pm_disable:
|
||||
pm_runtime_disable(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void msm_hdmi_phy_remove(struct platform_device *pdev)
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ MODULE_PARM_DESC(modeset, "Use kernel modesetting [KMS] (1=on (default), 0=disab
|
|||
module_param(modeset, bool, 0600);
|
||||
|
||||
static bool separate_gpu_kms;
|
||||
MODULE_PARM_DESC(separate_gpu_drm, "Use separate DRM device for the GPU (0=single DRM device for both GPU and display (default), 1=two DRM devices)");
|
||||
MODULE_PARM_DESC(separate_gpu_kms, "Use separate DRM device for the GPU (0=single DRM device for both GPU and display (default), 1=two DRM devices)");
|
||||
module_param(separate_gpu_kms, bool, 0400);
|
||||
|
||||
DECLARE_FAULT_ATTR(fail_gem_alloc);
|
||||
|
|
|
|||
|
|
@ -155,6 +155,7 @@ int msm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
|
|||
helper->fb = buffer->fb;
|
||||
|
||||
fbi->fbops = &msm_fb_ops;
|
||||
fbi->flags |= FBINFO_VIRTFB; /* system memory */
|
||||
|
||||
drm_fb_helper_fill_info(fbi, helper, sizes);
|
||||
|
||||
|
|
|
|||
|
|
@ -68,6 +68,9 @@ struct msm_gem_vm {
|
|||
/** @base: Inherit from drm_gpuvm. */
|
||||
struct drm_gpuvm base;
|
||||
|
||||
/** @rcu: RCU-delayed free so an exported sched fence->sched stays valid. */
|
||||
struct rcu_head rcu;
|
||||
|
||||
/**
|
||||
* @sched: Scheduler used for asynchronous VM_BIND request.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ msm_gem_vm_free(struct drm_gpuvm *gpuvm)
|
|||
dma_fence_put(vm->last_fence);
|
||||
put_pid(vm->pid);
|
||||
kfree(vm->log);
|
||||
kfree(vm);
|
||||
kfree_rcu(vm, rcu);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -140,5 +140,5 @@ void msm_ringbuffer_destroy(struct msm_ringbuffer *ring)
|
|||
|
||||
msm_gem_kernel_put(ring->bo, ring->gpu->vm);
|
||||
|
||||
kfree(ring);
|
||||
kfree_rcu(ring, rcu);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ struct msm_ringbuffer {
|
|||
/*
|
||||
* The job scheduler for this ring.
|
||||
*/
|
||||
struct rcu_head rcu;
|
||||
struct drm_gpu_scheduler sched;
|
||||
bool sched_initialized;
|
||||
|
||||
|
|
|
|||
|
|
@ -141,6 +141,8 @@ xsi:schemaLocation="https://gitlab.freedesktop.org/freedreno/ rules-fd.xsd">
|
|||
<reg32 offset="0x1f9f0" name="GMU_BOOT_KMD_LM_HANDSHAKE"/>
|
||||
<reg32 offset="0x1f957" name="GMU_LLM_GLM_SLEEP_CTRL"/>
|
||||
<reg32 offset="0x1f958" name="GMU_LLM_GLM_SLEEP_STATUS"/>
|
||||
<reg32 offset="0x1f880" name="GMU_CX_AO_COUNTER_L" variants="A7XX"/>
|
||||
<reg32 offset="0x1f881" name="GMU_CX_AO_COUNTER_H" variants="A7XX"/>
|
||||
<reg32 offset="0x1f888" name="GMU_ALWAYS_ON_COUNTER_L" variants="A6XX-A7XX"/>
|
||||
<reg32 offset="0x1f840" name="GMU_ALWAYS_ON_COUNTER_L" variants="A8XX-"/>
|
||||
<reg32 offset="0x1f889" name="GMU_ALWAYS_ON_COUNTER_H" variants="A6XX-A7XX"/>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user