7.0.10-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainerPATCH 349/1146 ALSA: hda/realtek: fix code style (ERROR: else should follow close brace })
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lei Huang <[email protected]>
[ Upstream commit d1888bf848ade6a9e71c7ba516fd215aa1bd8d65 ]
Fix checkpatch code style errors:
ERROR: else should follow close brace '}' #2300: FILE: sound/hda/codecs/realtek/alc269.c:2300:
+ }
+ else
--- sound/hda/codecs/realtek/alc269.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/hda/codecs/realtek/alc269.c +2 -2
@@ -2296,9 +2296,9 @@ static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,struct alc_spec *spec = codec->spec; spec->parse_flags |=HDA_PINCFG_HEADSET_MIC ;alc255_set_default_jack_type (codec); - } -else + }else {alc_fixup_headset_mode (codec, fix, action); + } } static void alc288_update_headset_jack_cb(struct hda_codec *codec,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 350/1146 ASoC: SOF: Intel: hda: Place check before dereference
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ethan Tidmore <[email protected]>
[ Upstream commit 6cbc8360f51a3df2ea16a786b262b9fe44d4c68c ]
The struct hext_stream is dereferenced before it is checked for NULL. Although it can never be NULL due to a check prior to hda_dsp_iccmax_stream_hw_params() being called, this change clears any confusion regarding hext_stream possibly being NULL.
Check hext_stream for NULL and then assign its members.
Detected by Smatch:sound/soc/sof/intel/hda-stream.c:488 hda_dsp_iccmax_stream_hw_params() warn:
variable dereferenced before check 'hext_stream' (see line 486)
--- sound/soc/sof/intel/hda-stream.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
sound/soc/sof/intel/hda-stream.c +7 -3
@@ -480,16 +480,20 @@ int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_ststruct snd_dma_buffer *dmab, struct snd_pcm_hw_params *params) { - struct hdac_stream *hstream = &hext_stream->hstream; -int sd_offset =SOF_STREAM_SD_OFFSET (hstream); + struct hdac_stream *hstream; +int sd_offset;int ret; -u32 mask =0x1 << hstream->index; +u32 mask;if (!hext_stream) {dev_err (sdev->dev,"error: no stream available\n" );return -ENODEV ; } + hstream = &hext_stream->hstream; + sd_offset =SOF_STREAM_SD_OFFSET (hstream); + mask =0x1 << hstream->index; +if (!dmab) {dev_err (sdev->dev,"error: no dma buffer allocated!\n" );return -ENODEV ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 351/1146 drm/msm/vma: Avoid lock in VM_BIND fence signaling path
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit 8a7023b035355ef5bfa096bd323256fa8abbbc6a ]
Use msm_gem_unpin_active(), similar to what is used in the GEM_SUBMIT path. This avoids needing to hold the obj lock, and the end result is the same. (As with GEM_SUBMIT, we know the fence isn't signaled yet.)
Patchwork: https://patchwork.freedesktop.org/patch/712230/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/msm_gem.c | 3 +++ drivers/gpu/drm/msm/msm_gem_vma.c | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-)
drivers/gpu/drm/msm/msm_gem.c +3 -0
@@ -507,8 +507,11 @@ void msm_gem_unpin_locked(struct drm_gem_object *obj)*/ void msm_gem_unpin_active (struct drm_gem_object *obj) { +struct msm_drm_private *priv = obj->dev->dev_private;struct msm_gem_object *msm_obj =to_msm_bo (obj); +GEM_WARN_ON (!mutex_is_locked (&priv->lru.lock)); + msm_obj->pin_count--;GEM_WARN_ON (msm_obj->pin_count <0 );update_lru_active (obj);
drivers/gpu/drm/msm/msm_gem_vma.c +6 -3
@@ -696,6 +696,7 @@ static struct dma_fence * msm_vma_job_run(struct drm_sched_job *_job) {struct msm_vm_bind_job *job =to_msm_vm_bind_job (_job); +struct msm_drm_private *priv = job->vm->drm->dev_private;struct msm_gem_vm *vm =to_msm_vm (job->vm);struct drm_gem_object *obj;int ret = vm->unusable ? -EINVAL :0 ;
@@ -738,12 +739,14 @@ msm_vma_job_run(struct drm_sched_job *_job)if (ret)msm_gem_vm_unusable (job->vm); +mutex_lock (&priv->lru.lock); + job_foreach_bo (obj, job) { -msm_gem_lock (obj); -msm_gem_unpin_locked (obj); -msm_gem_unlock (obj); +msm_gem_unpin_active (obj); } +mutex_unlock (&priv->lru.lock); +/* VM_BIND ops are synchronous, so no fence to wait on: */ return NULL ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 352/1146 drm/msm/a6xx: Add missing aperture_lock init
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit d4ef6d77bb1ef92bdbfb70c7a5d08072848357d8 ]
Looks like this was somehow missed when introducing gen8 support.
Patchwork: https://patchwork.freedesktop.org/patch/713545/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +1 -0
@@ -2656,6 +2656,7 @@ static struct msm_gpu *a6xx_gpu_init(struct drm_device *dev) gpu = &adreno_gpu->base;mutex_init (&a6xx_gpu->gmu.lock); +spin_lock_init (&a6xx_gpu->aperture_lock); adreno_gpu->registers =NULL ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 353/1146 drm/msm: Reject fb creation from _NO_SHARE objs
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit cf50ccdb765b3a6f1cd8e75642b0439fea0263a5 ]
It would be an error to map these into kms->vm. So reject this as early as possible, when creating an fb.
Patchwork: https://patchwork.freedesktop.org/patch/714264/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/msm_fb.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/msm_fb.c +6 -1
@@ -219,7 +219,12 @@ static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev, + mode_cmd->offsets[i];if (bos[i]->size < min_size) { - ret = -EINVAL ; + ret =UERR (EINVAL , dev,"plane %d too small" , i); + goto fail; + } + +if (to_msm_bo (bos[i])->flags &MSM_BO_NO_SHARE ) { + ret =UERR (EINVAL , dev,"Cannot map _NO_SHARE to kms vm" ); goto fail; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 354/1146 drm/msm: Fix VM_BIND UNMAP locking
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit 85042c2cd970a6b0e686329387096fe19989ae62 ]
Wrong argument meant that the objs involved in UNMAP ops were not always getting locked.
Since _NO_SHARE objs share a common resv with the VM (which is always locked) this would only show up with non-_NO_SHARE BOs.
Patchwork: https://patchwork.freedesktop.org/patch/713898/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/msm_gem_vma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/msm_gem_vma.c +1 -1
@@ -1245,7 +1245,7 @@ vm_bind_job_lock_objects(struct msm_vm_bind_job *job, struct drm_exec *exec)case MSM_VM_BIND_OP_UNMAP : ret =drm_gpuvm_sm_unmap_exec_lock (job->vm, exec, op->iova, - op->obj_offset); + op->range);break ;case MSM_VM_BIND_OP_MAP :case MSM_VM_BIND_OP_MAP_NULL : {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 355/1146 drm/msm/a6xx: Fix HLSQ register dumping
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit c289a6db9ba6cb974f0317da142e4f665d589566 ]
Fix the bitfield offset of HLSQ_READ_SEL state-type bitfield. Otherwise we are always reading TP state when we wanted SP or HLSQ state.
Patchwork: https://patchwork.freedesktop.org/patch/714236/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c +1 -1
@@ -1013,7 +1013,7 @@ static void a6xx_get_crashdumper_hlsq_registers(struct msm_gpu *gpu,u64 out = dumper->iova +A6XX_CD_DATA_OFFSET ;int i, regcount =0 ; - in +=CRASHDUMP_WRITE (in,REG_A6XX_HLSQ_DBG_READ_SEL , regs->val1); + in +=CRASHDUMP_WRITE (in,REG_A6XX_HLSQ_DBG_READ_SEL , (regs->val1 &0xff ) <<8 );for (i =0 ; i < regs->count; i +=2 ) {u32 count =RANGE (regs->registers, i);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 356/1146 drm/msm/shrinker: Fix can_block() logic
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit df0f439e3926817cf577ca6272aad68468ff7624 ]
The intention here was to allow blocking if DIRECT_RECLAIM or if called from kswapd and KSWAPD_RECLAIM is set.
Reported by Claude code review: https://lore.gitlab.freedesktop.org/drm-ai-reviews/review-patch9-20260309151119.290217-10-boris.brezillon@collabora.com/ on a panthor patch which had copied similar logic.
Patchwork: https://patchwork.freedesktop.org/patch/714238/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/msm_gem_shrinker.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/gpu/drm/msm/msm_gem_shrinker.c +2 -3
@@ -26,9 +26,8 @@ static bool can_swap(void)static bool can_block (struct shrink_control *sc) { -if (!(sc->gfp_mask & __GFP_DIRECT_RECLAIM)) -return false; -return current_is_kswapd () || (sc->gfp_mask & __GFP_RECLAIM); +return (sc->gfp_mask & __GFP_DIRECT_RECLAIM) || + (current_is_kswapd () && (sc->gfp_mask & __GFP_KSWAPD_RECLAIM)); } static unsigned long
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 357/1146 drm/msm/a6xx: Fix dumping A650+ debugbus blocks
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Connor Abbott <[email protected]>
[ Upstream commit cc83f71c9be0715fe93b963ffa9767d5d84354ed ]
These should be appended after the existing debugbus blocks, instead of replacing them.
Patchwork: https://patchwork.freedesktop.org/patch/714270/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c +6 -6
@@ -361,7 +361,7 @@ static void a6xx_get_debugbus_blocks(struct msm_gpu *gpu, sizeof(*a6xx_state->debugbus));if (a6xx_state->debugbus) { -int i; +int i, j;for (i =0 ; i <ARRAY_SIZE (a6xx_debugbus_blocks); i++) a6xx_get_debugbus_block(gpu,
@@ -369,8 +369,6 @@ static void a6xx_get_debugbus_blocks(struct msm_gpu *gpu, &a6xx_debugbus_blocks[i], &a6xx_state->debugbus[i]); - a6xx_state->nr_debugbus =ARRAY_SIZE (a6xx_debugbus_blocks); -/* * GBIF has same debugbus as of other GPU blocks, fall back to * default path if GPU uses GBIF, also GBIF uses exactly same
@@ -381,17 +379,19 @@ static void a6xx_get_debugbus_blocks(struct msm_gpu *gpu, &a6xx_gbif_debugbus_block, &a6xx_state->debugbus[i]); - a6xx_state->nr_debugbus +=1 ; + i++; }if (adreno_is_a650_family (to_adreno_gpu (gpu))) { -for (i =0 ; i <ARRAY_SIZE (a650_debugbus_blocks); i++) +for (j =0 ; j <ARRAY_SIZE (a650_debugbus_blocks); i++, j++)a6xx_get_debugbus_block (gpu, a6xx_state, - &a650_debugbus_blocks[i], + &a650_debugbus_blocks[j], &a6xx_state->debugbus[i]); } + + a6xx_state->nr_debugbus = i; } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 358/1146 drm/msm/a6xx: Use barriers while updating HFI Q headers
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit dc78b35d5ec09d1b0b8a937e6e640d2c5a030915 ]
To avoid harmful compiler optimizations and IO reordering in the HW, use barriers and READ/WRITE_ONCE helpers as necessary while accessing the HFI queue index variables.
Patchwork: https://patchwork.freedesktop.org/patch/714653/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a6xx_hfi.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/gpu/drm/msm/adreno/a6xx_hfi.c +10 -4
@@ -34,7 +34,7 @@ static int a6xx_hfi_queue_read(struct a6xx_gmu *gmu,struct a6xx_hfi_queue_header *header = queue->header;u32 i, hdr, index = header->read_index; -if (header->read_index == header->write_index) { +if (header->read_index ==READ_ONCE (header->write_index)) { header->rx_request =1 ;return 0 ; }
@@ -62,7 +62,10 @@ static int a6xx_hfi_queue_read(struct a6xx_gmu *gmu,if (!gmu->legacy) index =ALIGN (index,4 ) % header->size; - header->read_index = index; +/* Ensure all memory operations are complete before updating the read index */ +dma_mb (); + +WRITE_ONCE (header->read_index, index);return HFI_HEADER_SIZE (hdr); }
@@ -74,7 +77,7 @@ static int a6xx_hfi_queue_write(struct a6xx_gmu *gmu,spin_lock (&queue->lock); - space =CIRC_SPACE (header->write_index, header->read_index, + space =CIRC_SPACE (header->write_index,READ_ONCE (header->read_index), header->size);if (space < dwords) { header->dropped++;
@@ -95,7 +98,10 @@ static int a6xx_hfi_queue_write(struct a6xx_gmu *gmu, queue->data[index] =0xfafafafa ; } - header->write_index = index; +/* Ensure all memory operations are complete before updating the write index */ +dma_mb (); + +WRITE_ONCE (header->write_index, index);spin_unlock (&queue->lock);gmu_write (gmu,REG_A6XX_GMU_HOST2GMU_INTR_SET ,0x01 );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 359/1146 drm/msm/a8xx: Fix the ticks used in submit traces
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit cfc8b48649e159ff394fb4b7b08e5006c5c1c234 ]
GMU_ALWAYS_ON_COUNTER_* registers got moved in A8x, but currently, A6x register offsets are used in the submit traces instead of A8x offsets. To fix this, refactor a bit and use adreno_gpu->funcs->get_timestamp() everywhere.
While we are at it, update a8xx_gmu_get_timestamp() to use the GMU AO counter.
Patchwork: https://patchwork.freedesktop.org/patch/714655/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a4xx_gpu.c | 6 ++--- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 6 ++--- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 23 ++++++------------- drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 2 +- drivers/gpu/drm/msm/adreno/a8xx_gpu.c | 20 +++++++--------- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 6 ++--- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 2 +- .../gpu/drm/msm/registers/adreno/a6xx_gmu.xml | 6 +++-- 8 files changed, 27 insertions(+), 44 deletions(-)
drivers/gpu/drm/msm/adreno/a4xx_gpu.c +2 -4
@@ -604,11 +604,9 @@ static int a4xx_pm_suspend(struct msm_gpu *gpu) {return 0 ; } -static int a4xx_get_timestamp (struct msm_gpu *gpu,uint64_t *value) +static u64 a4xx_get_timestamp (struct msm_gpu *gpu) { - *value =gpu_read64 (gpu,REG_A4XX_RBBM_PERFCTR_CP_0_LO ); - -return 0 ; +return gpu_read64 (gpu,REG_A4XX_RBBM_PERFCTR_CP_0_LO ); }static u64 a4xx_gpu_busy (struct msm_gpu *gpu,unsigned long *out_sample_rate)
drivers/gpu/drm/msm/adreno/a5xx_gpu.c +2 -4
@@ -1435,11 +1435,9 @@ static int a5xx_pm_suspend(struct msm_gpu *gpu)return 0 ; } -static int a5xx_get_timestamp (struct msm_gpu *gpu,uint64_t *value) +static u64 a5xx_get_timestamp (struct msm_gpu *gpu) { - *value =gpu_read64 (gpu,REG_A5XX_RBBM_ALWAYSON_COUNTER_LO ); - -return 0 ; +return gpu_read64 (gpu,REG_A5XX_RBBM_ALWAYSON_COUNTER_LO ); }struct a5xx_crashdumper {
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +7 -16
@@ -16,8 +16,10 @@#define GPU_PAS_ID 13 -static u64 read_gmu_ao_counter (struct a6xx_gpu *a6xx_gpu) +static u64 a6xx_gmu_get_timestamp (struct msm_gpu *gpu) { +struct adreno_gpu *adreno_gpu =to_adreno_gpu (gpu); +struct a6xx_gpu *a6xx_gpu =to_a6xx_gpu (adreno_gpu);u64 count_hi, count_lo, temp; do {
@@ -404,7 +406,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)OUT_RING (ring,upper_32_bits (rbmemptr (ring, fence)));OUT_RING (ring, submit->seqno); -trace_msm_gpu_submit_flush (submit,read_gmu_ao_counter (a6xx_gpu)); +trace_msm_gpu_submit_flush (submit, adreno_gpu->funcs->get_timestamp (gpu));a6xx_flush (gpu, ring); }
@@ -614,7 +616,7 @@ static void a7xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit) } -trace_msm_gpu_submit_flush (submit,read_gmu_ao_counter (a6xx_gpu)); +trace_msm_gpu_submit_flush (submit, adreno_gpu->funcs->get_timestamp (gpu));a6xx_flush (gpu, ring);
@@ -2414,20 +2416,9 @@ static int a6xx_pm_suspend(struct msm_gpu *gpu)return 0 ; } -static int a6xx_gmu_get_timestamp (struct msm_gpu *gpu,uint64_t *value) +static u64 a6xx_get_timestamp (struct msm_gpu *gpu) { -struct adreno_gpu *adreno_gpu =to_adreno_gpu (gpu); -struct a6xx_gpu *a6xx_gpu =to_a6xx_gpu (adreno_gpu); - - *value =read_gmu_ao_counter (a6xx_gpu); - -return 0 ; -} - -static int a6xx_get_timestamp (struct msm_gpu *gpu,uint64_t *value) -{ - *value =gpu_read64 (gpu,REG_A6XX_CP_ALWAYS_ON_COUNTER ); -return 0 ; +return gpu_read64 (gpu,REG_A6XX_CP_ALWAYS_ON_COUNTER ); }static struct msm_ringbuffer *a6xx_active_ring (struct msm_gpu *gpu)
drivers/gpu/drm/msm/adreno/a6xx_gpu.h +1 -1
@@ -320,7 +320,7 @@ int a6xx_zap_shader_init(struct msm_gpu *gpu);void a8xx_bus_clear_pending_transactions (struct adreno_gpu *adreno_gpu,bool gx_off);int a8xx_fault_handler (void *arg,unsigned long iova,int flags,void *data);void a8xx_flush (struct msm_gpu *gpu,struct msm_ringbuffer *ring); -int a8xx_gmu_get_timestamp (struct msm_gpu *gpu,uint64_t *value); +u64 a8xx_gmu_get_timestamp (struct msm_gpu *gpu);u64 a8xx_gpu_busy (struct msm_gpu *gpu,unsigned long *out_sample_rate);int a8xx_gpu_feature_probe (struct msm_gpu *gpu);void a8xx_gpu_get_slice_info (struct msm_gpu *gpu);
drivers/gpu/drm/msm/adreno/a8xx_gpu.c +8 -12
@@ -1174,23 +1174,19 @@ void a8xx_bus_clear_pending_transactions(struct adreno_gpu *adreno_gpu, bool gx_gpu_write (gpu,REG_A6XX_GBIF_HALT ,0x0 ); } -int a8xx_gmu_get_timestamp (struct msm_gpu *gpu,uint64_t *value) +u64 a8xx_gmu_get_timestamp (struct msm_gpu *gpu) {struct adreno_gpu *adreno_gpu =to_adreno_gpu (gpu);struct a6xx_gpu *a6xx_gpu =to_a6xx_gpu (adreno_gpu); +u64 count_hi, count_lo, temp; -mutex_lock (&a6xx_gpu->gmu.lock); - -/* Force the GPU power on so we can read this register */ -a6xx_gmu_set_oob (&a6xx_gpu->gmu,GMU_OOB_PERFCOUNTER_SET ); - - *value =gpu_read64 (gpu,REG_A8XX_CP_ALWAYS_ON_COUNTER ); - -a6xx_gmu_clear_oob (&a6xx_gpu->gmu,GMU_OOB_PERFCOUNTER_SET ); - -mutex_unlock (&a6xx_gpu->gmu.lock); +do { + count_hi =gmu_read (&a6xx_gpu->gmu,REG_A8XX_GMU_ALWAYS_ON_COUNTER_H ); + count_lo =gmu_read (&a6xx_gpu->gmu,REG_A8XX_GMU_ALWAYS_ON_COUNTER_L ); + temp =gmu_read (&a6xx_gpu->gmu,REG_A8XX_GMU_ALWAYS_ON_COUNTER_H ); + }while (unlikely (count_hi != temp)); -return 0 ; +return (count_hi <<32 ) | count_lo; }u64 a8xx_gpu_busy (struct msm_gpu *gpu,unsigned long *out_sample_rate)
drivers/gpu/drm/msm/adreno/adreno_gpu.c +2 -4
@@ -391,13 +391,11 @@ int adreno_get_param(struct msm_gpu *gpu, struct msm_context *ctx,return 0 ;case MSM_PARAM_TIMESTAMP :if (adreno_gpu->funcs->get_timestamp) { -int ret; -pm_runtime_get_sync (&gpu->pdev->dev); - ret = adreno_gpu->funcs->get_timestamp (gpu, value); + *value = adreno_gpu->funcs->get_timestamp (gpu);pm_runtime_put_autosuspend (&gpu->pdev->dev); -return ret; +return 0 ; }return -EINVAL ;case MSM_PARAM_PRIORITIES :
drivers/gpu/drm/msm/adreno/adreno_gpu.h +1 -1
@@ -79,7 +79,7 @@ struct adreno_gpu;struct adreno_gpu_funcs {struct msm_gpu_funcs base;struct msm_gpu *(*init)(struct drm_device *dev); -int (*get_timestamp)(struct msm_gpu *gpu,uint64_t *value); +u64 (*get_timestamp)(struct msm_gpu *gpu);void (*bus_halt)(struct adreno_gpu *adreno_gpu,bool gx_off);int (*mmu_fault_handler)(void *arg,unsigned long iova,int flags,void *data); };
drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml +4 -2
@@ -141,8 +141,10 @@ 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="0x1f888" name="GMU_ALWAYS_ON_COUNTER_L"/> - <reg32 offset="0x1f889" name="GMU_ALWAYS_ON_COUNTER_H"/> + <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"/> + <reg32 offset="0x1f841" name="GMU_ALWAYS_ON_COUNTER_H" variants="A8XX-"/> <reg32 offset="0x1f8c3" name="GMU_GMU_PWR_COL_KEEPALIVE" variants="A6XX-A7XX"/> <reg32 offset="0x1f7e4" name="GMU_GMU_PWR_COL_KEEPALIVE" variants="A8XX-"/> <reg32 offset="0x1f8c4" name="GMU_PWR_COL_PREEMPT_KEEPALIVE" variants="A6XX-A7XX"/>
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 360/1146 drm/msm/a6xx: Switch to preemption safe AO counter
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit 0c59f258ffd4c9c2a6bd37d71a0ade1db8bc03b7 ]
CP_ALWAYS_ON_COUNTER is not save-restored during preemption, so it won't provide accurate data about the 'submit' when preemption is enabled. Switch to CP_ALWAYS_ON_CONTEXT which is preemption safe.
Patchwork: https://patchwork.freedesktop.org/patch/714657/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +7 -7
@@ -347,7 +347,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)* GPU registers so we need to add 0x1a800 to the register value on A630 * to get the right value from PM4. */ -get_stats_counter (ring,REG_A6XX_CP_ALWAYS_ON_COUNTER , +get_stats_counter (ring,REG_A6XX_CP_ALWAYS_ON_CONTEXT ,rbmemptr_stats (ring, index, alwayson_start));/* Invalidate CCU depth and color */
@@ -388,7 +388,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)get_stats_counter (ring,REG_A6XX_RBBM_PERFCTR_CP (0 ),rbmemptr_stats (ring, index, cpcycles_end)); -get_stats_counter (ring,REG_A6XX_CP_ALWAYS_ON_COUNTER , +get_stats_counter (ring,REG_A6XX_CP_ALWAYS_ON_CONTEXT ,rbmemptr_stats (ring, index, alwayson_end));/* Write the fence to the scratch register */
@@ -457,7 +457,7 @@ static void a7xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)struct adreno_gpu *adreno_gpu =to_adreno_gpu (gpu);struct a6xx_gpu *a6xx_gpu =to_a6xx_gpu (adreno_gpu);struct msm_ringbuffer *ring = submit->ring; -u32 rbbm_perfctr_cp0, cp_always_on_counter; +u32 rbbm_perfctr_cp0, cp_always_on_context;unsigned int i, ibs =0 ;adreno_check_and_reenable_stall (adreno_gpu);
@@ -480,14 +480,14 @@ static void a7xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)if (adreno_is_a8xx (adreno_gpu)) { rbbm_perfctr_cp0 =REG_A8XX_RBBM_PERFCTR_CP (0 ); - cp_always_on_counter =REG_A8XX_CP_ALWAYS_ON_COUNTER ; + cp_always_on_context =REG_A8XX_CP_ALWAYS_ON_CONTEXT ; }else { rbbm_perfctr_cp0 =REG_A7XX_RBBM_PERFCTR_CP (0 ); - cp_always_on_counter =REG_A6XX_CP_ALWAYS_ON_COUNTER ; + cp_always_on_context =REG_A6XX_CP_ALWAYS_ON_CONTEXT ; }get_stats_counter (ring, rbbm_perfctr_cp0,rbmemptr_stats (ring, index, cpcycles_start)); -get_stats_counter (ring, cp_always_on_counter,rbmemptr_stats (ring, index, alwayson_start)); +get_stats_counter (ring, cp_always_on_context,rbmemptr_stats (ring, index, alwayson_start));OUT_PKT7 (ring,CP_THREAD_CONTROL ,1 );OUT_RING (ring,CP_SET_THREAD_BOTH );
@@ -535,7 +535,7 @@ static void a7xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit) }get_stats_counter (ring, rbbm_perfctr_cp0,rbmemptr_stats (ring, index, cpcycles_end)); -get_stats_counter (ring, cp_always_on_counter,rbmemptr_stats (ring, index, alwayson_end)); +get_stats_counter (ring, cp_always_on_context,rbmemptr_stats (ring, index, alwayson_end));/* Write the fence to the scratch register */ if (adreno_is_a8xx (adreno_gpu)) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 361/1146 drm/msm/a6xx: Correct OOB usage
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit d34b6919798c1a8c93e1d7cca297d0e068146bd5 ]
During the GMU resume sequence, using another OOB other than OOB_GPU may confuse the internal state of GMU firmware. To align more strictly with the downstream sequence, move the sysprof related OOB setup after the OOB_GPU is cleared.
Patchwork: https://patchwork.freedesktop.org/patch/714659/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 5 ----- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 6 ++++++ drivers/gpu/drm/msm/adreno/a8xx_gpu.c | 6 ++++++ 3 files changed, 12 insertions(+), 5 deletions(-)
drivers/gpu/drm/msm/adreno/a6xx_gmu.c +0 -5
@@ -1236,11 +1236,6 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu)/* Set the GPU to the current freq */ a6xx_gmu_set_initial_freq (gpu, gmu); -if (refcount_read (&gpu->sysprof_active) >1 ) { - ret =a6xx_gmu_set_oob (gmu,GMU_OOB_PERFCOUNTER_SET ); -if (!ret) -set_bit (GMU_STATUS_OOB_PERF_SET , &gmu->status); - } out:/* On failure, shut down the GMU to leave it in a good state */ if (ret) {
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +6 -0
@@ -1605,6 +1605,12 @@ static int hw_init(struct msm_gpu *gpu)a6xx_gmu_clear_oob (&a6xx_gpu->gmu,GMU_OOB_BOOT_SLUMBER ); } +if (!ret && (refcount_read (&gpu->sysprof_active) >1 )) { + ret =a6xx_gmu_set_oob (gmu,GMU_OOB_PERFCOUNTER_SET ); +if (!ret) +set_bit (GMU_STATUS_OOB_PERF_SET , &gmu->status); + } +return ret; }
drivers/gpu/drm/msm/adreno/a8xx_gpu.c +6 -0
@@ -711,6 +711,12 @@ static int hw_init(struct msm_gpu *gpu)*/ a6xx_gmu_clear_oob (&a6xx_gpu->gmu,GMU_OOB_GPU_SET ); +if (!ret && (refcount_read (&gpu->sysprof_active) >1 )) { + ret =a6xx_gmu_set_oob (gmu,GMU_OOB_PERFCOUNTER_SET ); +if (!ret) +set_bit (GMU_STATUS_OOB_PERF_SET , &gmu->status); + } +return ret; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 362/1146 drm/msm/adreno: Implement gx_is_on() for A8x
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit ae25e6e9cdcac4cfef102b9d6de8bff13ca4d13b ]
A8x has a diverged enough for a separate implementation of gx_is_on() check. Add that and move them to the adreno func table.
Patchwork: https://patchwork.freedesktop.org/patch/714661/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 42 +++++++++++++++++++-- drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 5 ++- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 6 ++- drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 4 +- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 1 + 5 files changed, 50 insertions(+), 8 deletions(-)
drivers/gpu/drm/msm/adreno/a6xx_gmu.c +38 -4
@@ -91,10 +91,10 @@ bool a6xx_gmu_sptprac_is_on(struct a6xx_gmu *gmu) }/* Check to see if the GX rail is still powered */ -bool a6xx_gmu_gx_is_on (struct a6xx_gmu *gmu) +bool a6xx_gmu_gx_is_on (struct adreno_gpu *adreno_gpu) { - struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu); -struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; +struct a6xx_gpu *a6xx_gpu =to_a6xx_gpu (adreno_gpu); +struct a6xx_gmu *gmu = &a6xx_gpu->gmu;u32 val;/* This can be called from gpu state code so make sure GMU is valid */
@@ -117,6 +117,40 @@ bool a6xx_gmu_gx_is_on(struct a6xx_gmu *gmu) A6XX_GMU_SPTPRAC_PWR_CLK_STATUS_GX_HM_CLK_OFF)); } +bool a7xx_gmu_gx_is_on (struct adreno_gpu *adreno_gpu) +{ +struct a6xx_gpu *a6xx_gpu =to_a6xx_gpu (adreno_gpu); +struct a6xx_gmu *gmu = &a6xx_gpu->gmu; +u32 val; + +/* This can be called from gpu state code so make sure GMU is valid */ +if (!gmu->initialized) +return false; + + val =gmu_read (gmu,REG_A6XX_GMU_SPTPRAC_PWR_CLK_STATUS ); + +return !(val & + (A7XX_GMU_SPTPRAC_PWR_CLK_STATUS_GX_HM_GDSC_POWER_OFF | +A7XX_GMU_SPTPRAC_PWR_CLK_STATUS_GX_HM_CLK_OFF )); +} + +bool a8xx_gmu_gx_is_on (struct adreno_gpu *adreno_gpu) +{ +struct a6xx_gpu *a6xx_gpu =to_a6xx_gpu (adreno_gpu); +struct a6xx_gmu *gmu = &a6xx_gpu->gmu; +u32 val; + +/* This can be called from gpu state code so make sure GMU is valid */ +if (!gmu->initialized) +return false; + + val =gmu_read (gmu,REG_A8XX_GMU_PWR_CLK_STATUS ); + +return !(val & + (A8XX_GMU_PWR_CLK_STATUS_GX_HM_GDSC_POWER_OFF | +A8XX_GMU_PWR_CLK_STATUS_GX_HM_CLK_OFF )); +} +void a6xx_gmu_set_freq (struct msm_gpu *gpu,struct dev_pm_opp *opp,bool suspended) {
@@ -240,7 +274,7 @@ static bool a6xx_gmu_check_idle_level(struct a6xx_gmu *gmu)if (val == local) {if (gmu->idle_level !=GMU_IDLE_STATE_IFPC || - !a6xx_gmu_gx_is_on (gmu)) + !adreno_gpu->funcs->gx_is_on (adreno_gpu))return true; }
drivers/gpu/drm/msm/adreno/a6xx_gmu.h +4 -1
@@ -10,6 +10,7 @@#include <linux/notifier.h> #include <linux/soc/qcom/qcom_aoss.h> #include "msm_drv.h" +#include "adreno_gpu.h" #include "a6xx_hfi.h" struct a6xx_gmu_bo {
@@ -231,7 +232,9 @@ void a6xx_hfi_stop(struct a6xx_gmu *gmu);int a6xx_hfi_send_prep_slumber (struct a6xx_gmu *gmu);int a6xx_hfi_set_freq (struct a6xx_gmu *gmu,u32 perf_index,u32 bw_index); -bool a6xx_gmu_gx_is_on (struct a6xx_gmu *gmu); +bool a6xx_gmu_gx_is_on (struct adreno_gpu *adreno_gpu); +bool a7xx_gmu_gx_is_on (struct adreno_gpu *adreno_gpu); +bool a8xx_gmu_gx_is_on (struct adreno_gpu *adreno_gpu);bool a6xx_gmu_sptprac_is_on (struct a6xx_gmu *gmu);void a6xx_sptprac_disable (struct a6xx_gmu *gmu);int a6xx_sptprac_enable (struct a6xx_gmu *gmu);
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +5 -1
@@ -1643,7 +1643,7 @@ static void a6xx_recover(struct msm_gpu *gpu)adreno_dump_info (gpu); -if (a6xx_gmu_gx_is_on (&a6xx_gpu->gmu)) { +if (adreno_gpu->funcs->gx_is_on (adreno_gpu)) {/* Sometimes crashstate capture is skipped, so SQE should be halted here again */ gpu_write (gpu,REG_A6XX_CP_SQE_CNTL ,3 );
@@ -2763,6 +2763,7 @@ const struct adreno_gpu_funcs a6xx_gpu_funcs = { .get_timestamp = a6xx_gmu_get_timestamp, .bus_halt = a6xx_bus_clear_pending_transactions, .mmu_fault_handler = a6xx_fault_handler, + .gx_is_on = a6xx_gmu_gx_is_on, };const struct adreno_gpu_funcs a6xx_gmuwrapper_funcs = {
@@ -2795,6 +2796,7 @@ const struct adreno_gpu_funcs a6xx_gmuwrapper_funcs = { .get_timestamp = a6xx_get_timestamp, .bus_halt = a6xx_bus_clear_pending_transactions, .mmu_fault_handler = a6xx_fault_handler, + .gx_is_on = a6xx_gmu_gx_is_on, };const struct adreno_gpu_funcs a7xx_gpu_funcs = {
@@ -2829,6 +2831,7 @@ const struct adreno_gpu_funcs a7xx_gpu_funcs = { .get_timestamp = a6xx_gmu_get_timestamp, .bus_halt = a6xx_bus_clear_pending_transactions, .mmu_fault_handler = a6xx_fault_handler, + .gx_is_on = a7xx_gmu_gx_is_on, };const struct adreno_gpu_funcs a8xx_gpu_funcs = {
@@ -2856,4 +2859,5 @@ const struct adreno_gpu_funcs a8xx_gpu_funcs = { .get_timestamp = a8xx_gmu_get_timestamp, .bus_halt = a8xx_bus_clear_pending_transactions, .mmu_fault_handler = a8xx_fault_handler, + .gx_is_on = a8xx_gmu_gx_is_on, };
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c +2 -2
@@ -1251,7 +1251,7 @@ static void a6xx_get_gmu_registers(struct msm_gpu *gpu,_a6xx_get_gmu_registers (gpu, a6xx_state, &a6xx_gpucc_reg, &a6xx_state->gmu_registers[2 ], false); -if (!a6xx_gmu_gx_is_on (&a6xx_gpu->gmu)) +if (!adreno_gpu->funcs->gx_is_on (adreno_gpu))return ;/* Set the fence to ALLOW mode so we can access the registers */
@@ -1607,7 +1607,7 @@ struct msm_gpu_state *a6xx_gpu_state_get(struct msm_gpu *gpu) }/* If GX isn't on the rest of the data isn't going to be accessible */ -if (!a6xx_gmu_gx_is_on (&a6xx_gpu->gmu)) +if (!adreno_gpu->funcs->gx_is_on (adreno_gpu))return &a6xx_state->base;/* Halt SQE first */
drivers/gpu/drm/msm/adreno/adreno_gpu.h +1 -0
@@ -82,6 +82,7 @@ struct adreno_gpu_funcs {u64 (*get_timestamp)(struct msm_gpu *gpu);void (*bus_halt)(struct adreno_gpu *adreno_gpu,bool gx_off);int (*mmu_fault_handler)(void *arg,unsigned long iova,int flags,void *data); +bool (*gx_is_on)(struct adreno_gpu *adreno_gpu); };struct adreno_reglist {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 363/1146 drm/msm/a6xx: Fix gpu init from secure world
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit bb9b1d6e945ea90459bda1aac7e2aa7179119887 ]
A7XX_GEN2 and newer GPUs requires initialization of few configurations related to features/power from secure world. The SCM call to do this should be triggered after GDSC and clocks are enabled. So, keep this sequence to a6xx_gmu_resume instead of the probe.
Also, simplify the error handling in a6xx_gmu_resume() using 'goto' labels.
Patchwork: https://patchwork.freedesktop.org/patch/714664/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 93 ++++++++++++++++++++++----- drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 2 + drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 59 ----------------- 3 files changed, 80 insertions(+), 74 deletions(-)
drivers/gpu/drm/msm/adreno/a6xx_gmu.c +78 -15
@@ -3,6 +3,7 @@#include <linux/bitfield.h> #include <linux/clk.h> +#include <linux/firmware/qcom/qcom_scm.h> #include <linux/interconnect.h> #include <linux/of_platform.h> #include <linux/platform_device.h>
@@ -1191,6 +1192,65 @@ static void a6xx_gmu_set_initial_bw(struct msm_gpu *gpu, struct a6xx_gmu *gmu)dev_pm_opp_put (gpu_opp); } +static int a6xx_gmu_secure_init (struct a6xx_gpu *a6xx_gpu) +{ +struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; +struct msm_gpu *gpu = &adreno_gpu->base; +struct a6xx_gmu *gmu = &a6xx_gpu->gmu; +u32 fuse_val; +int ret; + +if (test_bit (GMU_STATUS_SECURE_INIT , &gmu->status)) +return 0 ; + +if (adreno_is_a750 (adreno_gpu) ||adreno_is_a8xx (adreno_gpu)) { +/* +* Assume that if qcom scm isn't available, that whatever +* replacement allows writing the fuse register ourselves. +* Users of alternative firmware need to make sure this +* register is writeable or indicate that it's not somehow. +* Print a warning because if you mess this up you're about to +* crash horribly. +*/ +if (!qcom_scm_is_available ()) { +dev_warn_once (gpu->dev->dev, +"SCM is not available, poking fuse register\n" ); +a6xx_llc_write (a6xx_gpu,REG_A7XX_CX_MISC_SW_FUSE_VALUE , +A7XX_CX_MISC_SW_FUSE_VALUE_RAYTRACING | +A7XX_CX_MISC_SW_FUSE_VALUE_FASTBLEND | +A7XX_CX_MISC_SW_FUSE_VALUE_LPAC ); + adreno_gpu->has_ray_tracing = true; + goto done; + } + + ret =qcom_scm_gpu_init_regs (QCOM_SCM_GPU_ALWAYS_EN_REQ | +QCOM_SCM_GPU_TSENSE_EN_REQ ); +if (ret) { +dev_warn_once (gpu->dev->dev, +"SCM call failed\n" ); +return ret; + } + +/* +* On A7XX_GEN3 and newer, raytracing may be disabled by the +* firmware, find out whether that's the case. The scm call +* above sets the fuse register. +*/ + fuse_val =a6xx_llc_read (a6xx_gpu, +REG_A7XX_CX_MISC_SW_FUSE_VALUE ); + adreno_gpu->has_ray_tracing = + !!(fuse_val &A7XX_CX_MISC_SW_FUSE_VALUE_RAYTRACING ); + }else if (adreno_is_a740 (adreno_gpu)) { +/* Raytracing is always enabled on a740 */ + adreno_gpu->has_ray_tracing = true; + } + +done: +set_bit (GMU_STATUS_SECURE_INIT , &gmu->status); +return 0 ; +} + +int a6xx_gmu_resume (struct a6xx_gpu *a6xx_gpu) {struct adreno_gpu *adreno_gpu = &a6xx_gpu->base;
@@ -1219,11 +1279,12 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu)clk_set_rate (gmu->hub_clk,adreno_is_a740_family (adreno_gpu) ?200000000 :150000000 ); ret =clk_bulk_prepare_enable (gmu->nr_clocks, gmu->clocks); -if (ret) { -pm_runtime_put (gmu->gxpd); -pm_runtime_put (gmu->dev); -return ret; - } +if (ret) + goto rpm_put; + + ret =a6xx_gmu_secure_init (a6xx_gpu); +if (ret) + goto disable_clk;/* Read the slice info on A8x GPUs */ a8xx_gpu_get_slice_info (gpu);
@@ -1253,11 +1314,11 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu) ret =a6xx_gmu_fw_start (gmu, status);if (ret) - goto out; + goto disable_irq; ret =a6xx_hfi_start (gmu, status);if (ret) - goto out; + goto disable_irq;/* * Turn on the GMU firmware fault interrupt after we know the boot
@@ -1270,14 +1331,16 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu)/* Set the GPU to the current freq */ a6xx_gmu_set_initial_freq (gpu, gmu); -out: -/* On failure, shut down the GMU to leave it in a good state */ -if (ret) { -disable_irq (gmu->gmu_irq); -a6xx_rpmh_stop (gmu); -pm_runtime_put (gmu->gxpd); -pm_runtime_put (gmu->dev); - } +return 0 ; + +disable_irq: +disable_irq (gmu->gmu_irq); +a6xx_rpmh_stop (gmu); +disable_clk: +clk_bulk_disable_unprepare (gmu->nr_clocks, gmu->clocks); +rpm_put: +pm_runtime_put (gmu->gxpd); +pm_runtime_put (gmu->dev);return ret; }
drivers/gpu/drm/msm/adreno/a6xx_gmu.h +2 -0
@@ -130,6 +130,8 @@ struct a6xx_gmu {#define GMU_STATUS_PDC_SLEEP 1/* To track Perfcounter OOB set status */ #define GMU_STATUS_OOB_PERF_SET 2 +/* To track whether secure world init was done */ +#define GMU_STATUS_SECURE_INIT 3unsigned long status; };
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +0 -59
77 lines not on this page · raw message
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 364/1146 ALSA: hda/cmedia: Remove duplicate pin configuration parsing
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: wangdicheng <[email protected]>
[ Upstream commit 579e7b820de5dd5124585413bb5e9c278d255436 ]
The cmedia_probe() function calls snd_hda_parse_pin_defcfg() and snd_hda_gen_parse_auto_config() twice unnecessarily. Remove The duplicate code.
--- sound/hda/codecs/cmedia.c | 7 ------- 1 file changed, 7 deletions(-)
sound/hda/codecs/cmedia.c +0 -7
@@ -39,13 +39,6 @@ static int cmedia_probe(struct hda_codec *codec, const struct hda_device_id *id) spec->out_vol_mask = (1ULL <<0x10 ); } - err =snd_hda_parse_pin_defcfg (codec, cfg,NULL ,0 ); -if (err <0 ) - goto error; - err =snd_hda_gen_parse_auto_config (codec, cfg); -if (err <0 ) - goto error; - err =snd_hda_parse_pin_defcfg (codec, cfg,NULL ,0 );if (err <0 ) goto error;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 365/1146 pmdomain: ti: omap_prm: Fix a reference leak on device node
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit 44c28e1c52764fef6dd1c1ada3a248728812e67f ]
When calling of_parse_phandle_with_args(), the caller is responsible to call of_node_put() to release the reference of device node. In omap_prm_domain_attach_dev, it does not release the reference.
--- drivers/pmdomain/ti/omap_prm.c | 1 + 1 file changed, 1 insertion(+)
drivers/pmdomain/ti/omap_prm.c +1 -0
@@ -655,6 +655,7 @@ static int omap_prm_domain_attach_dev(struct generic_pm_domain *domain,if (pd_args.args_count !=0 )dev_warn (dev,"%s: unusupported #power-domain-cells: %i\n" , prmd->pd.name, pd_args.args_count); +of_node_put (pd_args.np); genpd_data =dev_gpd_data (dev); genpd_data->data =NULL ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 366/1146 pmdomain: imx: scu-pd: Fix device_node reference leak during ->probe()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit c8e9b6a55702be6c6d034e973d519c52c3848415 ]
When calling of_parse_phandle_with_args(), the caller is responsible to call of_node_put() to release the reference of device node. In imx_sc_pd_get_console_rsrc(), it does not release the reference.
--- drivers/pmdomain/imx/scu-pd.c | 1 + 1 file changed, 1 insertion(+)
drivers/pmdomain/imx/scu-pd.c +1 -0
@@ -326,6 +326,7 @@ static void imx_sc_pd_get_console_rsrc(void)return ; imx_con_rsrc = specs.args[0 ]; +of_node_put (specs.np); }static int imx_sc_get_pd_power (struct device *dev,u32 rsrc)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 367/1146 PM: domains: De-constify fields in struct dev_pm_domain_attach_data
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 1877d3f258cbb57d64e275754fb9b18b089ce72d ]
It doesn't really make sense to keep u32 fields to be marked as const. Having the const fields prevents their modification in the driver. Instead the whole struct can be defined as const, if it is constant.
--- include/linux/pm_domain.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/pm_domain.h +2 -2
@@ -49,8 +49,8 @@struct dev_pm_domain_attach_data {const char *const *pd_names; -const u32 num_pd_names; -const u32 pd_flags; +u32 num_pd_names; +u32 pd_flags; };struct dev_pm_domain_list {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 368/1146 drm/msm/dpu: drop INTF_0 on MSM8953
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 7090420420d5a7d7c88b21d16962f2a230be3ef3 ]
There is no INTF_0 on MSM8953. Currently catalog lists dummy INTF_NONE entry for it. Drop it from the catalog.
Patchwork: https://patchwork.freedesktop.org/patch/713990/
--- drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h | 7 ------- 1 file changed, 7 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h +0 -7
@@ -121,13 +121,6 @@ static const struct dpu_dspp_cfg msm8953_dspp[] = {static const struct dpu_intf_cfg msm8953_intf[] = { { - .name ="intf_0" , .id =INTF_0 , - .base =0x6a000 , .len =0x268 , - .type =INTF_NONE , - .prog_fetch_lines_worst_case =14 , - .intr_underrun =DPU_IRQ_IDX (MDP_SSPP_TOP0_INTR ,24 ), - .intr_vsync =DPU_IRQ_IDX (MDP_SSPP_TOP0_INTR ,25 ), - }, { .name ="intf_1" , .id =INTF_1 , .base =0x6a800 , .len =0x268 , .type =INTF_DSI ,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 369/1146 ASoC: fsl_micfil: Add access property for "VAD Detected"
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit c7661bfc7422443df394c01e069ae4e5c3a7f04c ]
Add access property SNDRV_CTL_ELEM_ACCESS_READ for control "VAD Detected", which doesn't support put operation, otherwise there will be issue with mixer-test.
--- sound/soc/fsl/fsl_micfil.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
sound/soc/fsl/fsl_micfil.c +7 -1
@@ -503,7 +503,13 @@ static const struct snd_kcontrol_new fsl_micfil_snd_controls[] = {SOC_SINGLE ("HWVAD ZCD Adjustment" ,REG_MICFIL_VAD0_ZCD ,8 ,15 ,0 ),SOC_SINGLE ("HWVAD ZCD And Behavior Switch" , REG_MICFIL_VAD0_ZCD, 4, 1, 0), - SOC_SINGLE_BOOL_EXT("VAD Detected", 0, hwvad_detected, NULL), + { + .iface =SNDRV_CTL_ELEM_IFACE_MIXER , + .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, + .name = "VAD Detected", + .info = snd_soc_info_bool_ext, + .get = hwvad_detected, + }, };static int fsl_micfil_use_verid (struct device *dev)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 370/1146 ASoC: fsl_micfil: Fix event generation in hwvad_put_enable()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 59b9061824f2179fe133e2636203548eaba3e528 ]
ALSA controls should return 1 if the value in the control changed but the control put operation hwvad_put_enable() only returns 0 or a negative error code, causing ALSA to not generate any change events.
Add a suitable check in the function before updating the vad_enabled variable.
--- sound/soc/fsl/fsl_micfil.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
sound/soc/fsl/fsl_micfil.c +6 -1
@@ -377,10 +377,15 @@ static int hwvad_put_enable(struct snd_kcontrol *kcontrol,unsigned int *item = ucontrol->value.enumerated.item;struct fsl_micfil *micfil =snd_soc_component_get_drvdata (comp);int val =snd_soc_enum_item_to_val (e, item[0 ]); +bool change = false; +if (val <0 || val >1 ) +return -EINVAL ; + + change = (micfil->vad_enabled != val); micfil->vad_enabled = val; -return 0 ; +return change; } static int hwvad_get_enable(struct snd_kcontrol *kcontrol,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 371/1146 ASoC: fsl_micfil: Fix event generation in hwvad_put_init_mode()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 7e226209906906421f0d952d7304e48fdb0adabc ]
ALSA controls should return 1 if the value in the control changed but the control put operation hwvad_put_init_mode() only returns 0 or a negative error code, causing ALSA to not generate any change events.
Add a suitable check in the function before updating the vad_init_mode variable.
--- sound/soc/fsl/fsl_micfil.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
sound/soc/fsl/fsl_micfil.c +6 -1
@@ -407,13 +407,18 @@ static int hwvad_put_init_mode(struct snd_kcontrol *kcontrol,unsigned int *item = ucontrol->value.enumerated.item;struct fsl_micfil *micfil =snd_soc_component_get_drvdata (comp);int val =snd_soc_enum_item_to_val (e, item[0 ]); +bool change = false; + +if (val <MICFIL_HWVAD_ENVELOPE_MODE || val >MICFIL_HWVAD_ENERGY_MODE ) +return -EINVAL ;/* 0 - Envelope-based Mode * 1 - Energy-based Mode */ + change = (micfil->vad_init_mode != val); micfil->vad_init_mode = val; -return 0 ; +return change; } static int hwvad_get_init_mode(struct snd_kcontrol *kcontrol,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 372/1146 ASoC: fsl_micfil: Fix event generation in micfil_range_set()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit fc4daaddb276d370b7da3819872044df446a1911 ]
ALSA controls should return 1 if the value in the control changed but the control put operation micfil_range_set() only returns 0 or a negative error code, causing ALSA to not generate any change events.
Use snd_soc_component_update_bits() function to replace the regmap_update_bits(), for snd_soc_component_update_bits() has the capability of return check status.
Also enable pm runtime before calling the function snd_soc_component_update_bits() to make the regmap cache data align with the value in hardware.
--- sound/soc/fsl/fsl_micfil.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
sound/soc/fsl/fsl_micfil.c +10 -2
@@ -210,15 +210,23 @@ static int micfil_range_set(struct snd_kcontrol *kcontrol, (struct soc_mixer_control *)kcontrol->private_value;unsigned int shift = mc->shift;int max_range, new_range; +int ret; new_range = ucontrol->value.integer.value[0 ]; max_range =micfil_get_max_range (micfil);if (new_range > max_range)dev_warn (&micfil->pdev->dev,"range makes channel %d data unreliable\n" , shift /4 ); -regmap_update_bits (micfil->regmap,REG_MICFIL_OUT_CTRL ,0xF << shift, new_range << shift); + ret =pm_runtime_resume_and_get (cmpnt->dev); +if (ret) +return ret; -return 0 ; + ret =snd_soc_component_update_bits (cmpnt,REG_MICFIL_OUT_CTRL ,0xF << shift, + new_range << shift); + +pm_runtime_put_autosuspend (cmpnt->dev); + +return ret; }static int micfil_set_quality (struct fsl_micfil *micfil)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 373/1146 ASoC: fsl_micfil: Fix event generation in micfil_put_dc_remover_state()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 7d2bd35100de370dc326b250e8f6b66bee06a2f3 ]
ALSA controls should return 1 if the value in the control changed but the control put operation micfil_put_dc_remover_state() only returns 0 or a negative error code, causing ALSA to not generate any change events.
return the value of snd_soc_component_update_bits() directly, as it has the capability of return check status of changed or not.
Also enable pm runtime before calling the function snd_soc_component_update_bits() to make the regmap cache data align with the value in hardware.
--- sound/soc/fsl/fsl_micfil.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
sound/soc/fsl/fsl_micfil.c +7 -3
@@ -351,6 +351,10 @@ static int micfil_put_dc_remover_state(struct snd_kcontrol *kcontrol,if (val <0 || val >3 )return -EINVAL ; + ret =pm_runtime_resume_and_get (comp->dev); +if (ret) +return ret; + micfil->dc_remover = val;/* Calculate total value for all channels */
@@ -360,10 +364,10 @@ static int micfil_put_dc_remover_state(struct snd_kcontrol *kcontrol,/* Update DC Remover mode for all channels */ ret =snd_soc_component_update_bits (comp,REG_MICFIL_DC_CTRL ,MICFIL_DC_CTRL_CONFIG , reg_val); -if (ret <0 ) -return ret; -return 0 ; +pm_runtime_put_autosuspend (comp->dev); + +return ret; } static int micfil_get_dc_remover_state(struct snd_kcontrol *kcontrol,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 374/1146 ASoC: fsl_micfil: Fix event generation in micfil_quality_set()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit e5785093b1b45af7ee57d18619b2854a8aed073a ]
ALSA controls should return 1 if the value in the control changed but the control put operation micfil_quality_set() only returns 0 or a negative error code, causing ALSA to not generate any change events.
Add a suitable check in the function before updating the quality variable.
Also enable pm runtime before calling the function micfil_set_quality() to make the regmap cache data align with the value in hardware.
--- sound/soc/fsl/fsl_micfil.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-)
sound/soc/fsl/fsl_micfil.c +26 -2
@@ -289,10 +289,34 @@ static int micfil_quality_set(struct snd_kcontrol *kcontrol, {struct snd_soc_component *cmpnt =snd_kcontrol_chip (kcontrol);struct fsl_micfil *micfil =snd_soc_component_get_drvdata (cmpnt); +int val = ucontrol->value.integer.value[0 ]; +bool change = false; +int old_val; +int ret; + +if (val <QUALITY_HIGH || val >QUALITY_VLOW2 ) +return -EINVAL ; + +if (micfil->quality != val) { + ret =pm_runtime_resume_and_get (cmpnt->dev); +if (ret) +return ret; + + old_val = micfil->quality; + micfil->quality = val; + ret =micfil_set_quality (micfil); - micfil->quality = ucontrol->value.integer.value[0 ]; +pm_runtime_put_autosuspend (cmpnt->dev); -return micfil_set_quality (micfil); +if (ret) { + micfil->quality = old_val; +return ret; + } + + change = true; + } + +return change; }static const char *const micfil_hwvad_enable[] = {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 375/1146 ASoC: fsl_xcvr: Fix event generation in fsl_xcvr_arc_mode_put()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 1b61c8103c9317a9c37fe544c2d83cee1c281149 ]
ALSA controls should return 1 if the value in the control changed but the control put operation fsl_xcvr_arc_mode_put() only returns 0 or a negative error code, causing ALSA to not generate any change events.
Add a suitable check in the function before updating the arc_mode variable.
--- sound/soc/fsl/fsl_xcvr.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
sound/soc/fsl/fsl_xcvr.c +9 -2
@@ -115,10 +115,17 @@ static int fsl_xcvr_arc_mode_put(struct snd_kcontrol *kcontrol,struct fsl_xcvr *xcvr =snd_soc_dai_get_drvdata (dai);struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;unsigned int *item = ucontrol->value.enumerated.item; +int val =snd_soc_enum_item_to_val (e, item[0 ]); +int ret; - xcvr->arc_mode =snd_soc_enum_item_to_val (e, item[0 ]); +if (val <0 || val >1 ) +return -EINVAL ; -return 0 ; + ret = (xcvr->arc_mode != val); + + xcvr->arc_mode = val; + +return ret; } static int fsl_xcvr_arc_mode_get(struct snd_kcontrol *kcontrol,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 376/1146 ASoC: fsl_xcvr: Fix event generation in fsl_xcvr_mode_put()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 64a496ba976324615b845d60739dfcdae3d57434 ]
ALSA controls should return 1 if the value in the control changed but the control put operation fsl_xcvr_mode_put() only returns 0 or a negative error code, causing ALSA to not generate any change events.
Add a suitable check in the function before updating the mode variable.
--- sound/soc/fsl/fsl_xcvr.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
sound/soc/fsl/fsl_xcvr.c +9 -2
@@ -225,10 +225,17 @@ static int fsl_xcvr_mode_put(struct snd_kcontrol *kcontrol,struct fsl_xcvr *xcvr =snd_soc_dai_get_drvdata (dai);struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;unsigned int *item = ucontrol->value.enumerated.item; +int val =snd_soc_enum_item_to_val (e, item[0 ]);struct snd_soc_card *card = dai->component->card;struct snd_soc_pcm_runtime *rtd; +int ret; + +if (val <FSL_XCVR_MODE_SPDIF || val >FSL_XCVR_MODE_EARC ) +return -EINVAL ; - xcvr->mode =snd_soc_enum_item_to_val (e, item[0 ]); + ret = (xcvr->mode != val); + + xcvr->mode = val;fsl_xcvr_activate_ctl (dai, fsl_xcvr_arc_mode_kctl.name, (xcvr->mode ==FSL_XCVR_MODE_ARC ));
@@ -238,7 +245,7 @@ static int fsl_xcvr_mode_put(struct snd_kcontrol *kcontrol, rtd =snd_soc_get_pcm_runtime (card, card->dai_link); rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK ].substream_count = (xcvr->mode ==FSL_XCVR_MODE_SPDIF ?1 :0 ); -return 0 ; +return ret; } static int fsl_xcvr_mode_get(struct snd_kcontrol *kcontrol,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 377/1146 ASoC: fsl_easrc: Check the variable range in fsl_easrc_iec958_put_bits()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 00541b86fb578d4949cfdd6aff1f82d43fcf07af ]
Add check of input value's range in fsl_easrc_iec958_put_bits(), otherwise the wrong value may be written from user space.
--- sound/soc/fsl/fsl_easrc.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/fsl/fsl_easrc.c +3 -0
@@ -54,6 +54,9 @@ static int fsl_easrc_iec958_put_bits(struct snd_kcontrol *kcontrol,unsigned int regval = ucontrol->value.integer.value[0 ];int ret; +if (regval <EASRC_WIDTH_16_BIT || regval >EASRC_WIDTH_24_BIT ) +return -EINVAL ; + ret = (easrc_priv->bps_iec958[mc->regbase] != regval); easrc_priv->bps_iec958[mc->regbase] = regval;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 378/1146 ASoC: fsl_easrc: Fix value type in fsl_easrc_iec958_get_bits()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit aa21fe4a81458cf469c2615b08cbde5997dde25a ]
The value type of controls "Context 0 IEC958 Bits Per Sample" should be integer, not enumerated, the issue is found by the mixer-test.
--- sound/soc/fsl/fsl_easrc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/fsl/fsl_easrc.c +1 -1
@@ -73,7 +73,7 @@ static int fsl_easrc_iec958_get_bits(struct snd_kcontrol *kcontrol,struct soc_mreg_control *mc = (struct soc_mreg_control *)kcontrol->private_value; - ucontrol->value.enumerated.item[0 ] = easrc_priv->bps_iec958[mc->regbase]; + ucontrol->value.integer.value[0 ] = easrc_priv->bps_iec958[mc->regbase];return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 379/1146 ASoC: fsl_easrc: Change the type for iec958 channel status controls
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 47f28a5bd154a95d5aa563dde02a801bd32ddb81 ]
Use the type SNDRV_CTL_ELEM_TYPE_IEC958 for iec958 channel status controls, the original type will cause mixer-test to iterate all 32bit values, which costs a lot of time. And using IEC958 type can reduce the control numbers.
Also enable pm runtime before updating registers to make the regmap cache data align with the value in hardware.
--- sound/soc/fsl/fsl_easrc.c | 118 +++++++++++++++++++++++++++----------- 1 file changed, 84 insertions(+), 34 deletions(-)
sound/soc/fsl/fsl_easrc.c +84 -34
@@ -78,17 +78,47 @@ static int fsl_easrc_iec958_get_bits(struct snd_kcontrol *kcontrol,return 0 ; } +static int fsl_easrc_iec958_info (struct snd_kcontrol *kcontrol, +struct snd_ctl_elem_info *uinfo) +{ + uinfo->type =SNDRV_CTL_ELEM_TYPE_IEC958 ; + uinfo->count =1 ; +return 0 ; +} +static int fsl_easrc_get_reg (struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol) {struct snd_soc_component *component =snd_kcontrol_chip (kcontrol);struct soc_mreg_control *mc = (struct soc_mreg_control *)kcontrol->private_value; -unsigned int regval; +struct fsl_asrc *easrc =snd_soc_component_get_drvdata (component); +unsigned int *regval = (unsigned int *)ucontrol->value.iec958.status; +int ret; + + ret =regmap_read (easrc->regmap,REG_EASRC_CS0 (mc->regbase), ®val[0 ]); +if (ret) +return ret; + + ret =regmap_read (easrc->regmap,REG_EASRC_CS1 (mc->regbase), ®val[1 ]); +if (ret) +return ret; + + ret =regmap_read (easrc->regmap,REG_EASRC_CS2 (mc->regbase), ®val[2 ]); +if (ret) +return ret; - regval =snd_soc_component_read (component, mc->regbase); + ret =regmap_read (easrc->regmap,REG_EASRC_CS3 (mc->regbase), ®val[3 ]); +if (ret) +return ret; + + ret =regmap_read (easrc->regmap,REG_EASRC_CS4 (mc->regbase), ®val[4 ]); +if (ret) +return ret; - ucontrol->value.integer.value[0 ] = regval; + ret =regmap_read (easrc->regmap,REG_EASRC_CS5 (mc->regbase), ®val[5 ]); +if (ret) +return ret;return 0 ; }
@@ -100,22 +130,62 @@ static int fsl_easrc_set_reg(struct snd_kcontrol *kcontrol,struct soc_mreg_control *mc = (struct soc_mreg_control *)kcontrol->private_value;struct fsl_asrc *easrc =snd_soc_component_get_drvdata (component); -unsigned int regval = ucontrol->value.integer.value[0 ]; -bool changed; +unsigned int *regval = (unsigned int *)ucontrol->value.iec958.status; +bool changed, changed_all = false;int ret; - ret =regmap_update_bits_check (easrc->regmap, mc->regbase, -GENMASK (31 ,0 ), regval, &changed); -if (ret !=0 ) + ret =pm_runtime_resume_and_get (component->dev); +if (ret)return ret; -return changed; + ret =regmap_update_bits_check (easrc->regmap,REG_EASRC_CS0 (mc->regbase), +GENMASK (31 ,0 ), regval[0 ], &changed); +if (ret !=0 ) + goto err; + changed_all |= changed; + + ret =regmap_update_bits_check (easrc->regmap,REG_EASRC_CS1 (mc->regbase), +GENMASK (31 ,0 ), regval[1 ], &changed); +if (ret !=0 ) + goto err; + changed_all |= changed; + + ret =regmap_update_bits_check (easrc->regmap,REG_EASRC_CS2 (mc->regbase), +GENMASK (31 ,0 ), regval[2 ], &changed); +if (ret !=0 ) + goto err; + changed_all |= changed; + + ret =regmap_update_bits_check (easrc->regmap,REG_EASRC_CS3 (mc->regbase), +GENMASK (31 ,0 ), regval[3 ], &changed); +if (ret !=0 ) + goto err; + changed_all |= changed; + + ret =regmap_update_bits_check (easrc->regmap,REG_EASRC_CS4 (mc->regbase), +GENMASK (31 ,0 ), regval[4 ], &changed); +if (ret !=0 ) + goto err; + changed_all |= changed; + + ret =regmap_update_bits_check (easrc->regmap,REG_EASRC_CS5 (mc->regbase), +GENMASK (31 ,0 ), regval[5 ], &changed); +if (ret !=0 ) + goto err; + changed_all |= changed; +err: +pm_runtime_put_autosuspend (component->dev); + +if (ret !=0 ) +return ret; +else +return changed_all; }#define SOC_SINGLE_REG_RW (xname, xreg) \ { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = (xname), \ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ - .info = snd_soc_info_xr_sx, .get = fsl_easrc_get_reg, \ + .info = fsl_easrc_iec958_info, .get = fsl_easrc_get_reg, \ .put = fsl_easrc_set_reg, \ .private_value = (unsigned long)&(struct soc_mreg_control) \ { .regbase = xreg, .regcount = 1, .nbits = 32, \
@@ -146,30 +216,10 @@ static const struct snd_kcontrol_new fsl_easrc_snd_controls[] = {SOC_SINGLE_VAL_RW ("Context 2 IEC958 Bits Per Sample" ,2 ),SOC_SINGLE_VAL_RW ("Context 3 IEC958 Bits Per Sample" ,3 ), -SOC_SINGLE_REG_RW ("Context 0 IEC958 CS0" ,REG_EASRC_CS0 (0 )), -SOC_SINGLE_REG_RW ("Context 1 IEC958 CS0" ,REG_EASRC_CS0 (1 )), -SOC_SINGLE_REG_RW ("Context 2 IEC958 CS0" ,REG_EASRC_CS0 (2 )), -SOC_SINGLE_REG_RW ("Context 3 IEC958 CS0" ,REG_EASRC_CS0 (3 )), -SOC_SINGLE_REG_RW ("Context 0 IEC958 CS1" ,REG_EASRC_CS1 (0 )), -SOC_SINGLE_REG_RW ("Context 1 IEC958 CS1" ,REG_EASRC_CS1 (1 )), -SOC_SINGLE_REG_RW ("Context 2 IEC958 CS1" ,REG_EASRC_CS1 (2 )), -SOC_SINGLE_REG_RW ("Context 3 IEC958 CS1" ,REG_EASRC_CS1 (3 )), -SOC_SINGLE_REG_RW ("Context 0 IEC958 CS2" ,REG_EASRC_CS2 (0 )), -SOC_SINGLE_REG_RW ("Context 1 IEC958 CS2" ,REG_EASRC_CS2 (1 )), -SOC_SINGLE_REG_RW ("Context 2 IEC958 CS2" ,REG_EASRC_CS2 (2 )), -SOC_SINGLE_REG_RW ("Context 3 IEC958 CS2" ,REG_EASRC_CS2 (3 )), -SOC_SINGLE_REG_RW ("Context 0 IEC958 CS3" ,REG_EASRC_CS3 (0 )), -SOC_SINGLE_REG_RW ("Context 1 IEC958 CS3" ,REG_EASRC_CS3 (1 )), -SOC_SINGLE_REG_RW ("Context 2 IEC958 CS3" ,REG_EASRC_CS3 (2 )), -SOC_SINGLE_REG_RW ("Context 3 IEC958 CS3" ,REG_EASRC_CS3 (3 )), -SOC_SINGLE_REG_RW ("Context 0 IEC958 CS4" ,REG_EASRC_CS4 (0 )), -SOC_SINGLE_REG_RW ("Context 1 IEC958 CS4" ,REG_EASRC_CS4 (1 )), -SOC_SINGLE_REG_RW ("Context 2 IEC958 CS4" ,REG_EASRC_CS4 (2 )), -SOC_SINGLE_REG_RW ("Context 3 IEC958 CS4" ,REG_EASRC_CS4 (3 )), -SOC_SINGLE_REG_RW ("Context 0 IEC958 CS5" ,REG_EASRC_CS5 (0 )), -SOC_SINGLE_REG_RW ("Context 1 IEC958 CS5" ,REG_EASRC_CS5 (1 )), -SOC_SINGLE_REG_RW ("Context 2 IEC958 CS5" ,REG_EASRC_CS5 (2 )), - SOC_SINGLE_REG_RW("Context 3 IEC958 CS5", REG_EASRC_CS5(3)), +SOC_SINGLE_REG_RW ("Context 0 IEC958 CS" ,0 ), +SOC_SINGLE_REG_RW ("Context 1 IEC958 CS" ,1 ), +SOC_SINGLE_REG_RW ("Context 2 IEC958 CS" ,2 ), + SOC_SINGLE_REG_RW("Context 3 IEC958 CS", 3), };/*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 380/1146 iommu/amd: Fix clone_alias() to use the original devices devid
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vasant Hegde <[email protected]>
[ Upstream commit faad224fe0f0857a04ff2eb3c90f0de57f47d0f3 ]
Currently clone_alias() assumes first argument (pdev) is always the original device pointer. This function is called by pci_for_each_dma_alias() which based on topology decides to send original or alias device details in first argument.
This meant that the source devid used to look up and copy the DTE may be incorrect, leading to wrong or stale DTE entries being propagated to alias device.
Fix this by passing the original pdev as the opaque data argument to both the direct clone_alias() call and pci_for_each_dma_alias(). Inside clone_alias(), retrieve the original device from data and compute devid from it.
--- drivers/iommu/amd/iommu.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/iommu/amd/iommu.c +4 -3
@@ -403,11 +403,12 @@ struct iommu_dev_data *search_dev_data(struct amd_iommu *iommu, u16 devid)return NULL ; } -static int clone_alias (struct pci_dev *pdev,u16 alias,void *data) +static int clone_alias (struct pci_dev *pdev_origin,u16 alias,void *data) {struct dev_table_entry new;struct amd_iommu *iommu;struct iommu_dev_data *dev_data, *alias_data; +struct pci_dev *pdev = data;u16 devid =pci_dev_id (pdev);int ret =0 ;
@@ -454,9 +455,9 @@ static void clone_aliases(struct amd_iommu *iommu, struct device *dev)* part of the PCI DMA aliases if it's bus differs * from the original device. */ -clone_alias (pdev, iommu->pci_seg->alias_table[pci_dev_id (pdev)],NULL ); +clone_alias (pdev, iommu->pci_seg->alias_table[pci_dev_id (pdev)], pdev); -pci_for_each_dma_alias (pdev, clone_alias,NULL ); +pci_for_each_dma_alias (pdev, clone_alias, pdev); }static void setup_aliases (struct amd_iommu *iommu,struct device *dev)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 381/1146 iommu/riscv: Remove overflows on the invalidation path
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
[ Upstream commit 40a13b49957937427bc23e78eb50679df4396a47 ]
Since RISC-V supports a sign extended page table it should support a gather->end of ULONG_MAX, but if this happens it will infinite loop because of the overflow.
Also avoid overflow computing the length by moving the +1 to the other side of the <
--- drivers/iommu/riscv/iommu.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/iommu/riscv/iommu.c +6 -5
@@ -931,8 +931,6 @@ static void riscv_iommu_iotlb_inval(struct riscv_iommu_domain *domain,struct riscv_iommu_bond *bond;struct riscv_iommu_device *iommu, *prev;struct riscv_iommu_command cmd; -unsigned long len = end - start +1 ; -unsigned long iova;/* * For each IOMMU linked with this protection domain (via bonds->dev),
@@ -975,11 +973,14 @@ static void riscv_iommu_iotlb_inval(struct riscv_iommu_domain *domain,riscv_iommu_cmd_inval_vma (&cmd);riscv_iommu_cmd_inval_set_pscid (&cmd, domain->pscid); -if (len && len <RISCV_IOMMU_IOTLB_INVAL_LIMIT ) { -for (iova = start; iova < end; iova +=PAGE_SIZE ) { +if (end - start <RISCV_IOMMU_IOTLB_INVAL_LIMIT -1 ) { +unsigned long iova = start; + +do {riscv_iommu_cmd_inval_set_addr (&cmd, iova);riscv_iommu_cmd_send (iommu, &cmd); - } + }while (!check_add_overflow (iova,PAGE_SIZE , &iova) && + iova < end); }else {riscv_iommu_cmd_send (iommu, &cmd); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 382/1146 ASoC: qcom: qdsp6: topology: check widget type before accessing data
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
[ Upstream commit d5bfdd28e0cdd45043ae6e0ac168a451d59283dc ]
Check widget type before accessing the private data, as this could a virtual widget which is no associated with a dsp graph, container and module. Accessing witout check could lead to incorrect memory access.
--- sound/soc/qcom/qdsp6/topology.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
sound/soc/qcom/qdsp6/topology.c +5 -3
@@ -952,9 +952,6 @@ static int audioreach_widget_unload(struct snd_soc_component *scomp,struct audioreach_container *cont;struct audioreach_module *mod; - mod = dobj->private; - cont = mod->container; -if (w->id == snd_soc_dapm_mixer) {/* virtual widget */ struct snd_ar_control *scontrol = dobj->private;
@@ -963,6 +960,11 @@ static int audioreach_widget_unload(struct snd_soc_component *scomp,kfree (scontrol);return 0 ; } + mod = dobj->private; +if (!mod) +return 0 ; + + cont = mod->container;mutex_lock (&apm->lock);idr_remove (&apm->modules_idr, mod->instance_id);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 383/1146 PCI: dwc: Fix type mismatch for kstrtou32_from_user() return value
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Zhang <[email protected]>
[ Upstream commit 445588a3b18bb0702d746cb61f7a443639027651 ]
kstrtou32_from_user() returns int, but the return value was stored in a u32 variable 'val', risking sign loss. Use a dedicated int variable to correctly handle the return code.
--- .../controller/dwc/pcie-designware-debugfs.c | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-)
drivers/pci/controller/dwc/pcie-designware-debugfs.c +12 -9
@@ -208,10 +208,11 @@ static ssize_t lane_detect_write(struct file *file, const char __user *buf,struct dw_pcie *pci = file->private_data;struct dwc_pcie_rasdes_info *rinfo = pci->debugfs->rasdes_info;u32 lane, val; +int ret; - val =kstrtou32_from_user (buf, count,0 , &lane); -if (val) -return val; + ret =kstrtou32_from_user (buf, count,0 , &lane); +if (ret) +return ret; val =dw_pcie_readl_dbi (pci, rinfo->ras_cap_offset +SD_STATUS_L1LANE_REG ); val &= ~(LANE_SELECT );
@@ -347,10 +348,11 @@ static ssize_t counter_enable_write(struct file *file, const char __user *buf,struct dw_pcie *pci = pdata->pci;struct dwc_pcie_rasdes_info *rinfo = pci->debugfs->rasdes_info;u32 val, enable; +int ret; - val =kstrtou32_from_user (buf, count,0 , &enable); -if (val) -return val; + ret =kstrtou32_from_user (buf, count,0 , &enable); +if (ret) +return ret;mutex_lock (&rinfo->reg_event_lock);set_event_number (pdata, pci, rinfo);
@@ -408,10 +410,11 @@ static ssize_t counter_lane_write(struct file *file, const char __user *buf,struct dw_pcie *pci = pdata->pci;struct dwc_pcie_rasdes_info *rinfo = pci->debugfs->rasdes_info;u32 val, lane; +int ret; - val =kstrtou32_from_user (buf, count,0 , &lane); -if (val) -return val; + ret =kstrtou32_from_user (buf, count,0 , &lane); +if (ret) +return ret;mutex_lock (&rinfo->reg_event_lock);set_event_number (pdata, pci, rinfo);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 384/1146 crypto: qat - disable 4xxx AE cluster when lead engine is fused off
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ahsan Atta <[email protected]>
[ Upstream commit b260d53561dd69b29505222ec44cf386ac2c2ca6 ]
The get_ae_mask() function only disables individual engines based on the fuse register, but engines are organized in clusters of 4. If the lead engine of a cluster is fused off, the entire cluster must be disabled.
Replace the single bitmask inversion with explicit test_bit() checks on the lead engine of each group, disabling the full ADF_AE_GROUP when the lead bit is set.
--- .../crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c +12 -2
@@ -100,9 +100,19 @@ static struct adf_hw_device_class adf_4xxx_class = {static u32 get_ae_mask (struct adf_hw_device_data *self) { -u32 me_disable = self->fuses[ADF_FUSECTL4 ]; +unsigned long fuses = self->fuses[ADF_FUSECTL4 ]; +u32 mask =ADF_4XXX_ACCELENGINES_MASK ; -return ~me_disable &ADF_4XXX_ACCELENGINES_MASK ; +if (test_bit (0 , &fuses)) + mask &= ~ADF_AE_GROUP_0 ; + +if (test_bit (4 , &fuses)) + mask &= ~ADF_AE_GROUP_1 ; + +if (test_bit (8 , &fuses)) + mask &= ~ADF_AE_GROUP_2 ; + +return mask; }static u32 get_accel_cap (struct adf_accel_dev *accel_dev)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 385/1146 crypto: qat - disable 420xx AE cluster when lead engine is fused off
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ahsan Atta <[email protected]>
[ Upstream commit f216e0f2d1787e662bb6662c9c522185aa3b855a ]
The get_ae_mask() function only disables individual engines based on the fuse register, but engines are organized in clusters of 4. If the lead engine of a cluster is fused off, the entire cluster must be disabled.
Replace the single bitmask inversion with explicit test_bit() checks on the lead engine of each group, disabling the full ADF_AE_GROUP when the lead bit is set.
--- .../intel/qat/qat_420xx/adf_420xx_hw_data.c | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c +18 -2
@@ -97,9 +97,25 @@ static struct adf_hw_device_class adf_420xx_class = {static u32 get_ae_mask (struct adf_hw_device_data *self) { -u32 me_disable = self->fuses[ADF_FUSECTL4 ]; +unsigned long fuses = self->fuses[ADF_FUSECTL4 ]; +u32 mask =ADF_420XX_ACCELENGINES_MASK ; -return ~me_disable &ADF_420XX_ACCELENGINES_MASK ; +if (test_bit (0 , &fuses)) + mask &= ~ADF_AE_GROUP_0 ; + +if (test_bit (4 , &fuses)) + mask &= ~ADF_AE_GROUP_1 ; + +if (test_bit (8 , &fuses)) + mask &= ~ADF_AE_GROUP_2 ; + +if (test_bit (12 , &fuses)) + mask &= ~ADF_AE_GROUP_3 ; + +if (test_bit (16 , &fuses)) + mask &= ~ADF_AE_GROUP_4 ; + +return mask; }static u32 uof_get_num_objs (struct adf_accel_dev *accel_dev)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 386/1146 crypto: qat - fix compression instance leak
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giovanni Cabiddu <[email protected]>
[ Upstream commit 795c24c677c7a1c12f5768daf22a874a2890662f ]
qat_comp_alg_init_tfm() acquires a compression instance via qat_compression_get_instance_node() before calling qat_comp_build_ctx() to initialize the compression context. If qat_comp_build_ctx() fails, the function returns an error without releasing the compression instance, causing a resource leak.
When qat_comp_build_ctx() fails, release the compression instance with qat_compression_put_instance() and clear the context to avoid leaving a stale reference to the released instance.
The issue was introduced when build_deflate_ctx() (which always returned void) was replaced by qat_comp_build_ctx() (which can return an error) without adding error handling for the failure path.
--- drivers/crypto/intel/qat/qat_common/qat_comp_algs.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/crypto/intel/qat/qat_common/qat_comp_algs.c +8 -2
@@ -133,7 +133,7 @@ static int qat_comp_alg_init_tfm(struct crypto_acomp *acomp_tfm)struct crypto_tfm *tfm =crypto_acomp_tfm (acomp_tfm);struct qat_compression_ctx *ctx =crypto_tfm_ctx (tfm);struct qat_compression_instance *inst; -int node; +int node, ret;if (tfm->node ==NUMA_NO_NODE ) node =numa_node_id ();
@@ -146,7 +146,13 @@ static int qat_comp_alg_init_tfm(struct crypto_acomp *acomp_tfm)return -EINVAL ; ctx->inst = inst; -return qat_comp_build_ctx (inst->accel_dev, ctx->comp_ctx,QAT_DEFLATE ); + ret =qat_comp_build_ctx (inst->accel_dev, ctx->comp_ctx,QAT_DEFLATE ); +if (ret) { +qat_compression_put_instance (inst); +memset (ctx,0 ,sizeof (*ctx)); + } + +return ret; }static void qat_comp_alg_exit_tfm (struct crypto_acomp *acomp_tfm)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 387/1146 crypto: qat - fix type mismatch in RAS sysfs show functions
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giovanni Cabiddu <[email protected]>
[ Upstream commit ec23d75c4b77ae42af0777ea59599b1d4f611371 ]
ADF_RAS_ERR_CTR_READ() expands to atomic_read(), which returns int. The local variable 'counter' was declared as 'unsigned long', causing a type mismatch on the assignment. The format specifier '%ld' was consequently wrong in two ways: wrong length modifier and wrong signedness.
Use int to match the return type of atomic_read() and update the format specifier to '%d' accordingly.
--- .../intel/qat/qat_common/adf_sysfs_ras_counters.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.c +6 -6
@@ -13,14 +13,14 @@ static ssize_t errors_correctable_show(struct device *dev, char *buf) {struct adf_accel_dev *accel_dev; -unsigned long counter; +int counter; accel_dev =adf_devmgr_pci_to_accel_dev (to_pci_dev (dev));if (!accel_dev)return -EINVAL ; counter =ADF_RAS_ERR_CTR_READ (accel_dev->ras_errors,ADF_RAS_CORR ); -return scnprintf (buf,PAGE_SIZE ,"%ld\n" , counter); +return scnprintf (buf,PAGE_SIZE ,"%d\n" , counter); } static ssize_t errors_nonfatal_show(struct device *dev,
@@ -28,14 +28,14 @@ static ssize_t errors_nonfatal_show(struct device *dev, char *buf) {struct adf_accel_dev *accel_dev; -unsigned long counter; +int counter; accel_dev =adf_devmgr_pci_to_accel_dev (to_pci_dev (dev));if (!accel_dev)return -EINVAL ; counter =ADF_RAS_ERR_CTR_READ (accel_dev->ras_errors,ADF_RAS_UNCORR ); -return scnprintf (buf,PAGE_SIZE ,"%ld\n" , counter); +return scnprintf (buf,PAGE_SIZE ,"%d\n" , counter); } static ssize_t errors_fatal_show(struct device *dev,
@@ -43,14 +43,14 @@ static ssize_t errors_fatal_show(struct device *dev, char *buf) {struct adf_accel_dev *accel_dev; -unsigned long counter; +int counter; accel_dev =adf_devmgr_pci_to_accel_dev (to_pci_dev (dev));if (!accel_dev)return -EINVAL ; counter =ADF_RAS_ERR_CTR_READ (accel_dev->ras_errors,ADF_RAS_FATAL ); -return scnprintf (buf,PAGE_SIZE ,"%ld\n" , counter); +return scnprintf (buf,PAGE_SIZE ,"%d\n" , counter); } static ssize_t reset_error_counters_store(struct device *dev,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 388/1146 crypto: iaa - fix per-node CPU counter reset in rebalance_wq_table()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giovanni Cabiddu <[email protected]>
[ Upstream commit 590fa5d69c27cfaecd2e8287aec78f902417c877 ]
The cpu counter used to compute the IAA device index is reset to zero at the start of each NUMA node iteration. This causes CPUs on every node to map starting from IAA index 0 instead of continuing from the previous node's last index. On multi-node systems, this results in all nodes mapping their CPUs to the same initial set of IAA devices, leaving higher-indexed devices unused.
Move the cpu counter initialization before the for_each_node_with_cpus() loop so that the IAA index computation accumulates correctly across all nodes.
--- drivers/crypto/intel/iaa/iaa_crypto_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/intel/iaa/iaa_crypto_main.c +1 -1
@@ -906,8 +906,8 @@ static void rebalance_wq_table(void)return ; } + cpu =0 ;for_each_node_with_cpus (node) { - cpu =0 ; node_cpus =cpumask_of_node (node);for_each_cpu (node_cpu, node_cpus) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 389/1146 crypto: qat - use swab32 macro
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giovanni Cabiddu <[email protected]>
[ Upstream commit 35ecb77ae0749a2f1b04872c9978d9d7ddbbeb79 ]
Replace __builtin_bswap32() with swab32 in icp_qat_hw_20_comp.h to fix the following build errors on architectures without native byte-swap support:
alpha-linux-ld: drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.o: in function `adf_gen4_build_decomp_block':
drivers/crypto/intel/qat/qat_common/icp_qat_hw_20_comp.h:141:(.text+0xeec): undefined reference to `__bswapsi2'
alpha-linux-ld: drivers/crypto/intel/qat/qat_common/icp_qat_hw_20_comp.h:141:(.text+0xef8): undefined reference to `__bswapsi2'
alpha-linux-ld: drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.o: in function `adf_gen4_build_comp_block':
drivers/crypto/intel/qat/qat_common/icp_qat_hw_20_comp.h:57:(.text+0xf64): undefined reference to `__bswapsi2'
alpha-linux-ld: drivers/crypto/intel/qat/qat_common/icp_qat_hw_20_comp.h:57:(.text+0xf7c): undefined reference to `__bswapsi2'
--- .../crypto/intel/qat/qat_common/icp_qat_hw_20_comp.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/crypto/intel/qat/qat_common/icp_qat_hw_20_comp.h +6 -4
@@ -3,6 +3,8 @@#ifndef _ICP_QAT_HW_20_COMP_H_#define _ICP_QAT_HW_20_COMP_H_ +#include <linux/swab.h> +#include "icp_qat_hw_20_comp_defs.h" #include "icp_qat_fw.h"
@@ -54,7 +56,7 @@ ICP_QAT_FW_COMP_20_BUILD_CONFIG_LOWER(struct icp_qat_hw_comp_20_config_csr_lowerQAT_FIELD_SET (val32, csr.abd,ICP_QAT_HW_COMP_20_CONFIG_CSR_ABD_BITPOS ,ICP_QAT_HW_COMP_20_CONFIG_CSR_ABD_MASK ); -return __builtin_bswap32 (val32); +return swab32 (val32); }struct icp_qat_hw_comp_20_config_csr_upper {
@@ -106,7 +108,7 @@ ICP_QAT_FW_COMP_20_BUILD_CONFIG_UPPER(struct icp_qat_hw_comp_20_config_csr_upperICP_QAT_HW_COMP_20_CONFIG_CSR_NICE_PARAM_BITPOS , ICP_QAT_HW_COMP_20_CONFIG_CSR_NICE_PARAM_MASK); -return __builtin_bswap32 (val32); +return swab32 (val32); }struct icp_qat_hw_decomp_20_config_csr_lower {
@@ -138,7 +140,7 @@ ICP_QAT_FW_DECOMP_20_BUILD_CONFIG_LOWER(struct icp_qat_hw_decomp_20_config_csr_lICP_QAT_HW_DECOMP_20_CONFIG_CSR_LZ4_BLOCK_CHECKSUM_PRESENT_BITPOS , ICP_QAT_HW_DECOMP_20_CONFIG_CSR_LZ4_BLOCK_CHECKSUM_PRESENT_MASK); -return __builtin_bswap32 (val32); +return swab32 (val32); }struct icp_qat_hw_decomp_20_config_csr_upper {
@@ -158,7 +160,7 @@ ICP_QAT_FW_DECOMP_20_BUILD_CONFIG_UPPER(struct icp_qat_hw_decomp_20_config_csr_uICP_QAT_HW_DECOMP_20_CONFIG_CSR_MINI_CAM_CONTROL_BITPOS , ICP_QAT_HW_DECOMP_20_CONFIG_CSR_MINI_CAM_CONTROL_MASK); - return __builtin_bswap32(val32); + return swab32(val32); }#endif
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 390/1146 ALSA: hda: Notify IEC958 Default PCM switch state changes
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cássio Gabriel <[email protected]>
[ Upstream commit 6692ed9b4ced29aa819c95cc4ad9e2dc8720c081 ]
The "IEC958 Default PCM Playback Switch" control is backed directly by mout->share_spdif. The share-switch callbacks currently access that state without serialization, and spdif_share_sw_put() always returns 0, so normal userspace writes never emit the standard ALSA control value notification.
snd_hda_multi_out_analog_open() may also clear mout->share_spdif when the analog PCM capabilities and the SPDIF capabilities no longer intersect. That fallback is still needed to avoid creating an impossible hw constraint set, but it changes the mixer backing value without notifying subscribers.
Protect the share-switch callbacks with spdif_mutex like the other SPDIF control handlers, return the actual change value from spdif_share_sw_put(), and notify the cached control when the open path forcibly disables shared SPDIF mode after dropping spdif_mutex.
This keeps the existing auto-disable behavior while making switch state changes visible to userspace.
--- sound/hda/common/codec.c | 46 +++++++++++++++++++++++++++++------- sound/hda/common/hda_local.h | 1 + 2 files changed, 39 insertions(+), 8 deletions(-)
sound/hda/common/codec.c +38 -8
@@ -2529,7 +2529,10 @@ EXPORT_SYMBOL_GPL(snd_hda_spdif_ctls_assign);static int spdif_share_sw_get (struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol) { -struct hda_multi_out *mout =snd_kcontrol_chip (kcontrol); +struct hda_codec *codec =snd_kcontrol_chip (kcontrol); +struct hda_multi_out *mout = (void *)kcontrol->private_value; + +guard (mutex)(&codec->spdif_mutex); ucontrol->value.integer.value[0 ] = mout->share_spdif;return 0 ; }
@@ -2537,9 +2540,15 @@ static int spdif_share_sw_get(struct snd_kcontrol *kcontrol,static int spdif_share_sw_put (struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol) { -struct hda_multi_out *mout =snd_kcontrol_chip (kcontrol); - mout->share_spdif = !!ucontrol->value.integer.value[0 ]; -return 0 ; +struct hda_codec *codec =snd_kcontrol_chip (kcontrol); +struct hda_multi_out *mout = (void *)kcontrol->private_value; +bool val = !!ucontrol->value.integer.value[0 ]; +int change; + +guard (mutex)(&codec->spdif_mutex); + change = mout->share_spdif != val; + mout->share_spdif = val; +return change; }static const struct snd_kcontrol_new spdif_share_sw = {
@@ -2550,6 +2559,14 @@ static const struct snd_kcontrol_new spdif_share_sw = { .put = spdif_share_sw_put, }; +static void notify_spdif_share_sw (struct hda_codec *codec, +struct hda_multi_out *mout) +{ +if (mout->share_spdif_kctl) +snd_ctl_notify_one (codec->card,SNDRV_CTL_EVENT_MASK_VALUE , + mout->share_spdif_kctl,0 ); +} +/** * snd_hda_create_spdif_share_sw - create Default PCM switch * @codec: the HDA codec
@@ -2559,15 +2576,24 @@ int snd_hda_create_spdif_share_sw(struct hda_codec *codec, struct hda_multi_out *mout) {struct snd_kcontrol *kctl; +int err;if (!mout->dig_out_nid)return 0 ; - kctl =snd_ctl_new1 (&spdif_share_sw, mout); + kctl =snd_ctl_new1 (&spdif_share_sw, codec);if (!kctl)return -ENOMEM ; -/* ATTENTION: here mout is passed as private_data, instead of codec */ -return snd_hda_ctl_add (codec, mout->dig_out_nid, kctl); +/* snd_ctl_new1() stores @codec in private_data; stash @mout in +* private_value for the share-switch callbacks and cache the +* assigned control for forced-disable notifications. +*/ + kctl->private_value = (unsigned long )mout; + err =snd_hda_ctl_add (codec, mout->dig_out_nid, kctl); +if (err <0 ) +return err; + mout->share_spdif_kctl = kctl; +return 0 ; }EXPORT_SYMBOL_GPL (snd_hda_create_spdif_share_sw);
@@ -3701,6 +3727,8 @@ int snd_hda_multi_out_analog_open(struct hda_codec *codec, struct hda_pcm_stream *hinfo) {struct snd_pcm_runtime *runtime = substream->runtime; +bool notify_share_sw = false; + runtime->hw.channels_max = mout->max_channels;if (mout->dig_out_nid) {if (!mout->analog_rates) {
@@ -3729,10 +3757,12 @@ int snd_hda_multi_out_analog_open(struct hda_codec *codec, hinfo->maxbps = mout->spdif_maxbps; }else { mout->share_spdif =0 ; -/* FIXME: need notify? */ + notify_share_sw = true; } } } +if (notify_share_sw) +notify_spdif_share_sw (codec, mout);return snd_pcm_hw_constraint_step (substream->runtime,0 ,SNDRV_PCM_HW_PARAM_CHANNELS ,2 ); }
sound/hda/common/hda_local.h +1 -0
@@ -221,6 +221,7 @@ struct hda_multi_out {unsigned int spdif_rates;unsigned int spdif_maxbps;u64 spdif_formats; +struct snd_kcontrol *share_spdif_kctl;/* cached shared SPDIF switch */ }; int snd_hda_create_spdif_share_sw(struct hda_codec *codec,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 391/1146 ASoC: rsnd: Fix potential out-of-bounds access of component_dais[]
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Denis Rastyogin <[email protected]>
[ Upstream commit f9e437cddf6cf9e603bdaefe148c1f4792aaf39c ]
component_dais[RSND_MAX_COMPONENT] is initially zero-initialized and later populated in rsnd_dai_of_node(). However, the existing boundary check:
if (i >= RSND_MAX_COMPONENT)
does not guarantee that the last valid element remains zero. As a result, the loop can rely on component_dais[RSND_MAX_COMPONENT] being zero, which may lead to an out-of-bounds access.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- sound/soc/renesas/rcar/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/renesas/rcar/core.c +1 -1
@@ -1974,7 +1974,7 @@ static int rsnd_probe(struct platform_device *pdev)* asoc register */ ci =0 ; -for (i =0 ; priv->component_dais[i] >0 ; i++) { +for (i =0 ; i <RSND_MAX_COMPONENT && priv->component_dais[i] >0 ; i++) {int nr = priv->component_dais[i]; ret = devm_snd_soc_register_component(dev, &rsnd_soc_component,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 392/1146 PCI: Enable AtomicOps only if Root Port supports them
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerd Bayer <[email protected]>
[ Upstream commit 1ae8c4ce157037e266184064a182af9ef9af278b ]
When inspecting the config space of a Connect-X physical function in an s390 system after it was initialized by the mlx5_core device driver, we found the function to be enabled to request AtomicOps despite the Root Port lacking support for completing them:
00:00.1 Ethernet controller: Mellanox Technologies MT2894 Family [ConnectX-6 Lx]
Subsystem: Mellanox Technologies Device 0002
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-
AtomicOpsCtl: ReqEn+
On s390 and many virtualized guests, the Endpoint is visible but the Root Port is not. In this case, pci_enable_atomic_ops_to_root() previously enabled AtomicOps in the Endpoint even though it can't tell whether the Root Port supports them as a completer.
Change pci_enable_atomic_ops_to_root() to fail if there's no Root Port or the Root Port doesn't support AtomicOps.
--- drivers/pci/pci.c | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-)
drivers/pci/pci.c +20 -21
@@ -3674,8 +3674,7 @@ void pci_acs_init(struct pci_dev *dev)*/ int pci_enable_atomic_ops_to_root (struct pci_dev *dev,u32 cap_mask) { -struct pci_bus *bus = dev->bus; -struct pci_dev *bridge; +struct pci_dev *root, *bridge;u32 cap, ctl2;/*
@@ -3705,35 +3704,35 @@ int pci_enable_atomic_ops_to_root(struct pci_dev *dev, u32 cap_mask)return -EINVAL ; } -while (bus->parent) { - bridge = bus->self; + root =pcie_find_root_port (dev); +if (!root) +return -EINVAL ; -pcie_capability_read_dword (bridge,PCI_EXP_DEVCAP2 , &cap); +pcie_capability_read_dword (root,PCI_EXP_DEVCAP2 , &cap); +if ((cap & cap_mask) != cap_mask) +return -EINVAL ; + bridge =pci_upstream_bridge (dev); +while (bridge != root) {switch (pci_pcie_type (bridge)) { -/* Ensure switch ports support AtomicOp routing */ case PCI_EXP_TYPE_UPSTREAM : -case PCI_EXP_TYPE_DOWNSTREAM : -if (!(cap &PCI_EXP_DEVCAP2_ATOMIC_ROUTE )) -return -EINVAL ; -break ; - -/* Ensure root port supports all the sizes we care about */ -case PCI_EXP_TYPE_ROOT_PORT : -if ((cap & cap_mask) != cap_mask) -return -EINVAL ; -break ; - } - -/* Ensure upstream ports don't block AtomicOps on egress */ -if (pci_pcie_type (bridge) ==PCI_EXP_TYPE_UPSTREAM ) { +/* Upstream ports must not block AtomicOps on egress */ pcie_capability_read_dword (bridge,PCI_EXP_DEVCTL2 , &ctl2);if (ctl2 &PCI_EXP_DEVCTL2_ATOMIC_EGRESS_BLOCK )return -EINVAL ; + fallthrough; + +/* All switch ports need to route AtomicOps */ +case PCI_EXP_TYPE_DOWNSTREAM : +pcie_capability_read_dword (bridge,PCI_EXP_DEVCAP2 , + &cap); +if (!(cap &PCI_EXP_DEVCAP2_ATOMIC_ROUTE )) +return -EINVAL ; +break ; } - bus = bus->parent; + bridge =pci_upstream_bridge (bridge); } pcie_capability_set_word(dev, PCI_EXP_DEVCTL2,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 393/1146 PCI: imx6: Keep Root Port MSI capability with iMSI-RX to work around hardware bug
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Zhu <[email protected]>
[ Upstream commit 3a4e8302e72f83fd5cc8a916fc6f5c8fe5c8690e ]
On NXP i.MX7D, i.MX8MM, and i.MX8MQ chipsets, MSIs from the endpoints won't be received by the iMSI-RX MSI controller if the Root Port MSI capability is disabled.
Even though the Root Port MSIs won't be received by the iMSI-RX controller due to design, these chipsets have some weird hardware bug that prevents the endpoint MSIs from reaching when the Root Port MSI capability is disabled.
Hence, introduce a new flag, 'dw_pcie_rp::keep_rp_msi_en', set it for the above mentioned SoCs, and always keep the Root Port MSI capability when this flag is set.
Note that by keeping Root Port MSI capability, Root Port MSIs such as AER, PME and others won't be received by default. So users need to use workarounds such as passing 'pcie_pme=nomsi' cmdline param.
--- drivers/pci/controller/dwc/pci-imx6.c | 7 +++++++ drivers/pci/controller/dwc/pcie-designware-host.c | 2 +- drivers/pci/controller/dwc/pcie-designware.h | 1 + 3 files changed, 9 insertions(+), 1 deletion(-)
drivers/pci/controller/dwc/pci-imx6.c +7 -0
@@ -117,6 +117,8 @@ enum imx_pcie_variants {#define IMX_PCIE_FLAG_HAS_LUT BIT(10)#define IMX_PCIE_FLAG_8GT_ECN_ERR051586 BIT(11)#define IMX_PCIE_FLAG_SKIP_L23_READY BIT(12) +/* Preserve MSI capability for platforms that require it */ +#define IMX_PCIE_FLAG_KEEP_MSI_CAP BIT(13)#define imx_check_flag (pci, val) (pci->drvdata->flags & val)
@@ -1830,6 +1832,8 @@ static int imx_pcie_probe(struct platform_device *pdev) }else {if (imx_check_flag (imx_pcie,IMX_PCIE_FLAG_SKIP_L23_READY )) pci->pp.skip_l23_ready = true; +if (imx_check_flag (imx_pcie,IMX_PCIE_FLAG_KEEP_MSI_CAP )) + pci->pp.keep_rp_msi_en = true; pci->pp.use_atu_msg = true; ret =dw_pcie_host_init (&pci->pp);if (ret <0 )
@@ -1908,6 +1912,7 @@ static const struct imx_pcie_drvdata drvdata[] = { [IMX7D] = { .variant = IMX7D, .flags =IMX_PCIE_FLAG_SUPPORTS_SUSPEND | +IMX_PCIE_FLAG_KEEP_MSI_CAP |IMX_PCIE_FLAG_HAS_APP_RESET |IMX_PCIE_FLAG_SKIP_L23_READY | IMX_PCIE_FLAG_HAS_PHY_RESET,
@@ -1920,6 +1925,7 @@ static const struct imx_pcie_drvdata drvdata[] = { [IMX8MQ] = { .variant = IMX8MQ, .flags =IMX_PCIE_FLAG_HAS_APP_RESET | +IMX_PCIE_FLAG_KEEP_MSI_CAP |IMX_PCIE_FLAG_HAS_PHY_RESET | IMX_PCIE_FLAG_SUPPORTS_SUSPEND, .gpr = "fsl,imx8mq-iomuxc-gpr",
@@ -1934,6 +1940,7 @@ static const struct imx_pcie_drvdata drvdata[] = { [IMX8MM] = { .variant = IMX8MM, .flags =IMX_PCIE_FLAG_SUPPORTS_SUSPEND | +IMX_PCIE_FLAG_KEEP_MSI_CAP |IMX_PCIE_FLAG_HAS_PHYDRV | IMX_PCIE_FLAG_HAS_APP_RESET, .gpr = "fsl,imx8mm-iomuxc-gpr",
drivers/pci/controller/dwc/pcie-designware-host.c +1 -1
@@ -1171,7 +1171,7 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp)* the MSI and MSI-X capabilities of the Root Port to allow the drivers * to fall back to INTx instead. */ -if (pp->use_imsi_rx) { +if (pp->use_imsi_rx && !pp->keep_rp_msi_en) {dw_pcie_remove_capability (pci,PCI_CAP_ID_MSI );dw_pcie_remove_capability (pci,PCI_CAP_ID_MSIX ); }
drivers/pci/controller/dwc/pcie-designware.h +1 -0
@@ -421,6 +421,7 @@ struct dw_pcie_host_ops {struct dw_pcie_rp {bool use_imsi_rx:1 ; +bool keep_rp_msi_en:1 ;bool cfg0_io_shared:1 ;u64 cfg0_base;void __iomem *va_cfg0_base;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 394/1146 PCI: aspeed: Fix IRQ domain leak on platform_get_irq() failure
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit c54d5f5b33990f2649c20f35407f340bcadb8a53 ]
The aspeed_pcie_probe() function calls aspeed_pcie_init_irq_domain() which allocates pcie->intx_domain and initializes MSI. However, if platform_get_irq() fails afterwards, the cleanup action was not yet registered via devm_add_action_or_reset(), causing the IRQ domain resources to leak.
Fix this by registering the devm cleanup action immediately after aspeed_pcie_init_irq_domain() succeeds, before calling platform_get_irq(). This ensures proper cleanup on any subsequent failure.
--- drivers/pci/controller/pcie-aspeed.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/pci/controller/pcie-aspeed.c +4 -4
@@ -1052,14 +1052,14 @@ static int aspeed_pcie_probe(struct platform_device *pdev)if (ret)return ret; - irq =platform_get_irq (pdev,0 ); -if (irq <0 ) -return irq; - ret =devm_add_action_or_reset (dev, aspeed_pcie_irq_domain_free, pcie);if (ret)return ret; + irq =platform_get_irq (pdev,0 ); +if (irq <0 ) +return irq; + ret =devm_request_irq (dev, irq, aspeed_pcie_intr_handler,IRQF_SHARED ,dev_name (dev), pcie);if (ret)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 395/1146 dt-bindings: PCI: imx6q-pcie: Fix maxItems of clocks and clock-names
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Zhu <[email protected]>
[ Upstream commit 401359ef44af43b6b775dc01bb7b31396db67aab ]
Commit 1352f58d7c8d ("dt-bindings: PCI: pci-imx6: Add external reference clock input") that added reference clock to the binding was incomplete.
The constraints for "clocks" and "clock-names" still enforce an incorrect number of items. Update maxItems for both properties to 6 to match the actual hardware configuration.
--- .../devicetree/bindings/pci/fsl,imx6q-pcie-common.yaml | 4 ++-- Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.yaml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-)
Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-common.yaml +2 -2
@@ -17,11 +17,11 @@ description: properties: clocks: minItems: 3 - maxItems: 5 + maxItems: 6 clock-names: minItems: 3 - maxItems: 5 + maxItems: 6 num-lanes: const: 1
Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.yaml +2 -1
@@ -40,7 +40,8 @@ properties: - description: PCIe PHY clock. - description: Additional required clock entry for imx6sx-pcie, imx6sx-pcie-ep, imx8mq-pcie, imx8mq-pcie-ep. - - description: PCIe reference clock. + - description: PCIe internal reference clock. + - description: PCIe additional external reference clock. clock-names: minItems: 3
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 396/1146 PCI: mediatek-gen3: Prevent leaking IRQ domains when IRQ not found
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
[ Upstream commit 5573c44cb3fd01a9f62d569ae9ac870ef5f0e0ba ]
In mtk_pcie_setup_irq(), the IRQ domains are allocated before the controller's IRQ is fetched. If the latter fails, the function directly returns an error, without cleaning up the allocated domains.
Hence, reverse the order so that the IRQ domains are allocated after the controller's IRQ is found.
This was flagged by Sashiko during a review of "[PATCH v6 0/7] PCI:
mediatek-gen3: add power control support".
--- drivers/pci/controller/pcie-mediatek-gen3.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/pci/controller/pcie-mediatek-gen3.c +4 -4
@@ -851,14 +851,14 @@ static int mtk_pcie_setup_irq(struct mtk_gen3_pcie *pcie)struct platform_device *pdev =to_platform_device (dev);int err; - err =mtk_pcie_init_irq_domains (pcie); -if (err) -return err; - pcie->irq =platform_get_irq (pdev,0 );if (pcie->irq <0 )return pcie->irq; + err =mtk_pcie_init_irq_domains (pcie); +if (err) +return err; +irq_set_chained_handler_and_data (pcie->irq, mtk_pcie_irq_handler, pcie);return 0 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 397/1146 gpu: nova-core: bitfield: fix broken Default implementation
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eliot Courtney <[email protected]>
[ Upstream commit de0aca13509bf47a2d49bc7a26d56079c758c95f ]
The current implementation does not actually set the default values for the fields in the bitfield.
--- drivers/gpu/nova-core/bitfield.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/gpu/nova-core/bitfield.rs +2 -3
@@ -314,12 +314,11 @@ macro_rules! bitfield {/// Returns a value for the bitfield where all fields are set to their default value. impl ::core::default::Default for $name {fn default () ->Self { -#[allow(unused_mut)] -let mut value =Self (Default ::default ()); +let value =Self (Default ::default ()); ::kernel::macros::paste!( $( - value.[<set_ $field>](Default ::default ()); +let value = value.[<set_ $field>](Default ::default ()); )* );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 398/1146 selftests/mm: skip migration tests if NUMA is unavailable
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: AnishMulay <[email protected]>
[ Upstream commit 54218f10dfbe88c8e41c744fd45a756cde60b8c4 ]
Currently, the migration test asserts that numa_available() returns 0. On systems where NUMA is not available (returning -1), such as certain ARM64 configurations or single-node systems, this assertion fails and crashes the test.
Update the test to check the return value of numa_available(). If it is less than 0, skip the test gracefully instead of failing.
This aligns the behavior with other MM selftests (like rmap) that skip when NUMA support is missing.
--- tools/testing/selftests/mm/migration.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/testing/selftests/mm/migration.c +2 -1
@@ -36,7 +36,8 @@ FIXTURE_SETUP(migration) {int n; -ASSERT_EQ (numa_available (),0 ); +if (numa_available () <0 ) +SKIP (return,"NUMA not available" ); self->nthreads =numa_num_task_cpus () -1 ; self->n1 =-1 ; self->n2 =-1 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 399/1146 Documentation: fix a hugetlbfs reservation statement
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jane Chu <[email protected]>
[ Upstream commit 7a197d346a44384a1a858a98ef03766840e561d4 ]
Documentation/mm/hugetlbfs_reserv.rst has
if (resv_needed <= (resv_huge_pages - free_huge_pages))
resv_huge_pages += resv_needed;
which describes this code in gather_surplus_pages()
needed = (h->resv_huge_pages + delta) - h->free_huge_pages;
if (needed <= 0) {
h->resv_huge_pages += delta;
return 0;
}which means if there are enough free hugepages to account for the new reservation, simply update the global reservation count without further action.
But the description is backwards, it should be
if (resv_needed <= (free_huge_pages - resv_huge_pages))
instead.
--- Documentation/mm/hugetlbfs_reserv.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/mm/hugetlbfs_reserv.rst +1 -1
@@ -155,7 +155,7 @@ are enough free huge pages to accommodate the reservation. If there are, the global reservation count resv_huge_pages is adjusted something like the following:: - if (resv_needed <= (resv_huge_pages - free_huge_pages)) + if (resv_needed <= (free_huge_pages - resv_huge_pages) resv_huge_pages += resv_needed; Note that the global lock hugetlb_lock is held when checking and adjusting
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 400/1146 Docs/admin-guide/mm/damn/lru_sort: fix intervals autotune parameter name
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: SeongJae Park <[email protected]>
[ Upstream commit d7f00084f6863a243b396200c81e83ae302c5a76 ]
The section name should be the same as the parameter name. Fix it.
--- Documentation/admin-guide/mm/damon/lru_sort.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Documentation/admin-guide/mm/damon/lru_sort.rst +2 -2
@@ -95,8 +95,8 @@ increases and decreases the effective level of the quota aiming the LRU Disabled by default. -Auto-tune monitoring intervals ------------------------------- +autotune_monitoring_intervals +----------------------------- If this parameter is set as ``Y``, DAMON_LRU_SORT automatically tunes DAMON's sampling and aggregation intervals. The auto-tuning aims to capture meaningful
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 401/1146 Docs/mm/damon/index: fix typo: autoamted -> automated
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: SeongJae Park <[email protected]>
[ Upstream commit a4e82de81fe59d5bfcc9450145e8e108561f2e07 ]
There is an obvious typo. Fix it (s/autoamted/automated/).
--- Documentation/mm/damon/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/mm/damon/index.rst +1 -1
@@ -12,7 +12,7 @@ DAMON is a Linux kernel subsystem for efficient :ref:`data access monitoring - *light-weight* (for production online usages), - *scalable* (in terms of memory size), - *tunable* (for flexible usages), and - - *autoamted* (for production operation without manual tunings). + - *automated* (for production operation without manual tunings). .. toctree:: :maxdepth: 2
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 402/1146 zram: do not permit params change after init
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Senozhatsky <[email protected]>
[ Upstream commit 241f9005b1c81c2637eef2c836a03c83b4f3eeb9 ]
Patch series "zram: recompression cleanups and tweaks", v2.
This series is a somewhat random mix of fixups, recompression cleanups and improvements partly based on internal conversations. A few patches in the series remove unexpected or confusing behaviour, e.g. auto correction of bad priority= param for recompression, which should have always been just an error. Then it also removes "chain recompression" which has a tricky, unexpected and confusing behaviour at times. We also unify and harden the handling of algo/priority params. There is also an addition of missing device lock in algorithm_params_store() which previously permitted modification of algo params while the device is active.
This patch (of 6):
First, algorithm_params_store(), like any sysfs handler, should grab device lock.
Second, like any write() sysfs handler, it should grab device lock in exclusive mode.
Third, it should not permit change of algos' parameters after device init, as this doesn't make sense - we cannot compress with one C/D dict and then just change C/D dict to a different one, for example.
Another thing to notice is that algorithm_params_store() accesses device's ->comp_algs for algo priority lookup, which should be protected by device lock in exclusive mode in general.
--- drivers/block/zram/zram_drv.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/block/zram/zram_drv.c +4 -0
@@ -1748,6 +1748,10 @@ static ssize_t algorithm_params_store(struct device *dev, } } +guard (rwsem_write)(&zram->dev_lock); +if (init_done (zram)) +return -EBUSY ; +/* Lookup priority by algorithm name */ if (algo) {s32 p;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 403/1146 selftest: memcg: skip memcg_sock test if address family not supported
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Waiman Long <[email protected]>
[ Upstream commit 2d028f3e4bbbfd448928a8d3d2814b0b04c214f4 ]
The test_memcg_sock test in memcontrol.c sets up an IPv6 socket and send data over it to consume memory and verify that memory.stat.sock and memory.current values are close.
On systems where IPv6 isn't enabled or not configured to support SOCK_STREAM, the test_memcg_sock test always fails. When the socket() call fails, there is no way we can test the memory consumption and verify the above claim. I believe it is better to just skip the test in this case instead of reporting a test failure hinting that there may be something wrong with the memcg code.
--- tools/testing/selftests/cgroup/test_memcontrol.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
tools/testing/selftests/cgroup/test_memcontrol.c +10 -1
@@ -1280,8 +1280,11 @@ static int tcp_server(const char *cgroup, void *arg) saddr.sin6_port =htons (srv_args->port); sk =socket (AF_INET6 ,SOCK_STREAM ,0 ); -if (sk <0 ) +if (sk <0 ) { +/* Pass back errno to the ctl_fd */ +write (ctl_fd, &errno,sizeof (errno));return ret; + }if (setsockopt (sk,SOL_SOCKET ,SO_REUSEADDR , &yes,sizeof (yes)) <0 ) goto cleanup;
@@ -1412,6 +1415,12 @@ static int test_memcg_sock(const char *root) goto cleanup;close (args.ctl[0 ]); +/* Skip if address family not supported by protocol */ +if (err ==EAFNOSUPPORT ) { + ret =KSFT_SKIP ; + goto cleanup; + } +if (!err)break ;if (err !=EADDRINUSE )
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 404/1146 gpu: nova-core: remove redundant `.as_ref()` for `dev_*` print
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gary Guo <[email protected]>
[ Upstream commit 8d1a65c2defdc4213a49008d0531bd35d26fdf35 ]
This is now handled by the macro itself.
Stable-dep-of: a7a080bb4236 ("gpu: nova-core: fix missing colon in SEC2 boot debug message")
--- drivers/gpu/nova-core/driver.rs | 2 +- drivers/gpu/nova-core/gpu.rs | 4 ++-- drivers/gpu/nova-core/gsp/boot.rs | 32 +++++++------------------------ 3 files changed, 10 insertions(+), 28 deletions(-)
drivers/gpu/nova-core/driver.rs +1 -1
@@ -70,7 +70,7 @@ impl pci::Driver for NovaCore {fn probe (pdev: &pci::Device <Core >, _info: &Self ::IdInfo ) ->impl PinInit <Self ,Error > { pin_init::pin_init_scope (move || { -dev_dbg! (pdev.as_ref (),"Probe Nova Core GPU driver.\n" ); +dev_dbg! (pdev,"Probe Nova Core GPU driver.\n" ); pdev.enable_device_mem ()?; pdev.set_master ();
drivers/gpu/nova-core/gpu.rs +2 -2
@@ -262,13 +262,13 @@ impl Gpu { ) -> impl PinInit<Self, Error> + 'a {try_pin_init! (Self { spec:Spec ::new (pdev.as_ref (), bar).inspect (|spec| { -dev_info! (pdev.as_ref (),"NVIDIA ({})\n" , spec); +dev_info! (pdev,"NVIDIA ({})\n" , spec); })?,// We must wait for GFW_BOOT completion before doing any significant setup on the GPU. _: { gfw::wait_gfw_boot_completion (bar) - .inspect_err (|_|dev_err! (pdev.as_ref (),"GFW boot did not complete\n" ))?; + .inspect_err (|_|dev_err! (pdev,"GFW boot did not complete\n" ))?; }, sysmem_flush:SysmemFlush ::register (pdev.as_ref (), bar, spec.chipset)?,
drivers/gpu/nova-core/gsp/boot.rs +7 -25
@@ -170,15 +170,10 @@ impl super::Gsp { Some(libos_handle as u32), Some((libos_handle >> 32) as u32), )?; -dev_dbg! ( - pdev.as_ref (), -"GSP MBOX0: {:#x}, MBOX1: {:#x}\n" , - mbox0, - mbox1 - ); +dev_dbg! (pdev,"GSP MBOX0: {:#x}, MBOX1: {:#x}\n" , mbox0, mbox1);dev_dbg! ( - pdev.as_ref (), + pdev,"Using SEC2 to load and run the booter_load firmware...\n" );
@@ -190,19 +185,10 @@ impl super::Gsp { Some(wpr_handle as u32), Some((wpr_handle >> 32) as u32), )?; -dev_dbg! ( - pdev.as_ref (), -"SEC2 MBOX0: {:#x}, MBOX1{:#x}\n" , - mbox0, - mbox1 - ); +dev_dbg! (pdev,"SEC2 MBOX0: {:#x}, MBOX1{:#x}\n" , mbox0, mbox1);if mbox0 !=0 { -dev_err! ( - pdev.as_ref (), -"Booter-load failed with error {:#x}\n" , - mbox0 - ); +dev_err! (pdev,"Booter-load failed with error {:#x}\n" , mbox0);return Err (ENODEV ); }
@@ -216,11 +202,7 @@ impl super::Gsp { Delta::from_secs(5), )?; -dev_dbg! ( - pdev.as_ref (), -"RISC-V active? {}\n" , - gsp_falcon.is_riscv_active (bar), - ); +dev_dbg! (pdev,"RISC-V active? {}\n" , gsp_falcon.is_riscv_active (bar),);// Create and run the GSP sequencer. let seq_params =GspSequencerParams {
@@ -239,8 +221,8 @@ impl super::Gsp {// Obtain and display basic GPU information. let info = commands::get_gsp_info (&mut self.cmdq, bar)?;match info.gpu_name () { -Ok (name) =>dev_info! (pdev.as_ref (),"GPU name: {}\n" , name), -Err (e) =>dev_warn! (pdev.as_ref (),"GPU name unavailable: {:?}\n" , e), +Ok (name) =>dev_info! (pdev,"GPU name: {}\n" , name), +Err (e) =>dev_warn! (pdev,"GPU name unavailable: {:?}\n" , e), }Ok (())
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 405/1146 gpu: nova-core: fix missing colon in SEC2 boot debug message
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Carlier <[email protected]>
[ Upstream commit a7a080bb4236ebe577b6776d940d1717912ff6dd ]
The SEC2 mailbox debug output formats MBOX1 without a colon separator, producing "MBOX10xdead" instead of "MBOX1: 0xdead". The GSP debug message a few lines above uses the correct format.
--- drivers/gpu/nova-core/gsp/boot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/nova-core/gsp/boot.rs +1 -1
@@ -185,7 +185,7 @@ impl super::Gsp { Some(wpr_handle as u32), Some((wpr_handle >> 32) as u32), )?; -dev_dbg! (pdev,"SEC2 MBOX0: {:#x}, MBOX1{:#x}\n" , mbox0, mbox1); +dev_dbg! (pdev,"SEC2 MBOX0: {:#x}, MBOX1: {:#x}\n" , mbox0, mbox1);if mbox0 !=0 {dev_err! (pdev,"Booter-load failed with error {:#x}\n" , mbox0);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 406/1146 ALSA: scarlett2: Add missing sentinel initializer field
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Panagiotis Petrakopoulos <[email protected]>
[ Upstream commit 2428cd6e8b6fa80c36db4652702ca0acd2ce3f08 ]
A "-Wmissing-field-initializers" warning was emitted when compiling the module using the W=2 option. There is a sentinel initializer field missing in the end of scarlett2_devices[]. Tested using a Scarlett Solo 4th gen.
--- sound/usb/mixer_scarlett2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/mixer_scarlett2.c +1 -1
@@ -2262,7 +2262,7 @@ static const struct scarlett2_device_entry scarlett2_devices[] = { { USB_ID(0x1235, 0x820c), &clarett_8pre_info, "Clarett+" },/* End of list */ - { 0, NULL }, + { 0, NULL, NULL }, };/* get the starting port index number for a given port type/direction */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 407/1146 ASoC: qcom: audioreach: explicitly enable speaker protection modules
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ravi Hothi <[email protected]>
[ Upstream commit b481eabe5a193ba8499f446c2ab7e0ac042f8776 ]
Speaker protection and VI feedback modules are disabled by default. Explicitly enable them when configuring speaker protection.
--- sound/soc/qcom/qdsp6/audioreach.c | 5 +++++ 1 file changed, 5 insertions(+)
sound/soc/qcom/qdsp6/audioreach.c +5 -0
@@ -1365,9 +1365,14 @@ int audioreach_set_media_format(struct q6apm_graph *graph,case MODULE_ID_SPEAKER_PROTECTION : rc =audioreach_speaker_protection (graph, module,PARAM_ID_SP_OP_MODE_NORMAL ); +if (!rc) + rc =audioreach_module_enable (graph, module, true); +break ;case MODULE_ID_SPEAKER_PROTECTION_VI : rc =audioreach_speaker_protection_vi (graph, module, cfg); +if (!rc) + rc =audioreach_module_enable (graph, module, true);break ;default :
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 408/1146 ASoC: SOF: compress: return the configured codec from get_params
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cássio Gabriel <[email protected]>
[ Upstream commit 2c4fdd055f92a2fc8602dcd88bcea08c374b7e8b ]
The SOF compressed offload path accepts codec parameters in sof_compr_set_params() and forwards them to firmware as extended data in the SOF IPC stream params message.
However, sof_compr_get_params() still returns success without filling the snd_codec structure. Since the compress core allocates that structure zeroed and copies it back to userspace on success, SNDRV_COMPRESS_GET_PARAMS returns an all-zero codec description even after the stream has been configured successfully.
The stale TODO in this callback conflates get_params() with capability discovery. Supported codec enumeration belongs in get_caps() and get_codec_caps(). get_params() should report the current codec settings.
Cache the codec accepted by sof_compr_set_params() in the per-stream SOF compress state and return it from sof_compr_get_params().
--- sound/soc/sof/compress.c | 8 +++++--- sound/soc/sof/sof-priv.h | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-)
sound/soc/sof/compress.c +5 -3
@@ -255,6 +255,7 @@ static int sof_compr_set_params(struct snd_soc_component *component, sstream->sampling_rate = params->codec.sample_rate; sstream->channels = params->codec.ch_out; sstream->sample_container_bytes = pcm->params.sample_container_bytes; + sstream->codec_params = params->codec; spcm->prepared[cstream->direction] = true;
@@ -267,9 +268,10 @@ static int sof_compr_set_params(struct snd_soc_component *component,static int sof_compr_get_params (struct snd_soc_component *component,struct snd_compr_stream *cstream,struct snd_codec *params) { -/* TODO: we don't query the supported codecs for now, if the -* application asks for an unsupported codec the set_params() will fail. -*/ +struct sof_compr_stream *sstream = cstream->runtime->private_data; + + *params = sstream->codec_params; +return 0 ; }
sound/soc/sof/sof-priv.h +2 -0
@@ -17,6 +17,7 @@#include <sound/sof/info.h> #include <sound/sof/pm.h> #include <sound/sof/trace.h> +#include <sound/compress_params.h> #include <uapi/sound/sof/fw.h> #include <sound/sof/ext_manifest.h>
@@ -111,6 +112,7 @@ struct sof_compr_stream {u32 sampling_rate;u16 channels;u16 sample_container_bytes; +struct snd_codec codec_params;size_t posn_offset; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 409/1146 PCI/NPEM: Set LED_HW_PLUGGABLE for hotplug-capable ports
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Cheng <[email protected]>
[ Upstream commit 16d021c878dca22532c984668c9e8cf4722d6a49 ]
NPEM registers LED classdevs on PCI endpoint that may be behind hotplug-capable ports. During hot-removal, led_classdev_unregister() calls led_set_brightness(LED_OFF) which leads to a PCI config read to a disconnected device, which fails and returns -ENODEV (topology details in msgid.link below):
leds 0003:01:00.0:enclosure:ok: Setting an LED's brightness failed (-19)
The LED core already suppresses this for devices with LED_HW_PLUGGABLE set, but NPEM never sets it. Add the flag since NPEM LEDs are on hot-pluggable hardware by nature.
--- drivers/pci/npem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/npem.c +1 -1
@@ -504,7 +504,7 @@ static int pci_npem_set_led_classdev(struct npem *npem, struct npem_led *nled) led->brightness_get = brightness_get; led->max_brightness =1 ; led->default_trigger ="none" ; - led->flags =0 ; + led->flags =LED_HW_PLUGGABLE ; ret =led_classdev_register (&npem->dev->dev, led);if (ret)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 410/1146 tools/sched_ext: Fix off-by-one in scx_sdt payload zeroing
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cheng-Yang Chou <[email protected]>
[ Upstream commit a3c3fb2f86f8a1f266747622037f90eab58186ad ]
scx_alloc_free_idx() zeroes the payload of a freed arena allocation one word at a time. The loop bound was alloc->pool.elem_size / 8, but elem_size includes sizeof(struct sdt_data) (the 8-byte union sdt_id header). This caused the loop to write one extra u64 past the allocation, corrupting the tid field of the adjacent pool element.
Fix the loop bound to (elem_size - sizeof(struct sdt_data)) / 8 so only the payload portion is zeroed.
Test plan:
- Add a temporary sanity check in scx_task_free() before the free call:
if (mval->data->tid.idx != mval->tid.idx)
scx_bpf_error("tid corruption: arena=%d storage=%d",
mval->data->tid.idx, (int)mval->tid.idx);
- stress-ng --fork 100 -t 10 & sudo ./build/bin/scx_sdt
Without this fix, running scx_sdt under fork-heavy load triggers the corruption error. With the fix applied, the same workload completes without error.
--- tools/sched_ext/scx_sdt.bpf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/sched_ext/scx_sdt.bpf.c +2 -1
@@ -317,7 +317,8 @@ int scx_alloc_free_idx(struct scx_allocator *alloc, __u64 idx) };/* Zero out one word at a time. */ -for (i = zero; i < alloc->pool.elem_size /8 && can_loop; i++) { +for (i = zero; i < (alloc->pool.elem_size -sizeof (struct sdt_data )) /8 + && can_loop; i++) { data->payload[i] =0 ; } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 411/1146 ASoC: soc-component: re-add pcm_new()/pcm_free()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit 68130eef1e0d3c1770952e738f7f8d9f340bd42d ]
Because old pcm_new()/pcm_free() didn't care about parameter component, to avoid name collisions, we have added pcm_construct()/pcm_destruct() by commit c64bfc9066007 ("ASoC: soc-core: add new pcm_construct/pcm_destruct")
Because all driver switch to new pcm_construct()/pcm_destruct(), old pcm_new()/pcm_free() were remoted by commit e9067bb502787 ("ASoC:
soc-component: remove snd_pcm_ops from component driver")
But naming of pcm_construct()/pcm_destruct() are not goot. re-add pcm_new()/pcm_free(), and switch to use it, again.
Stable-dep-of: 3666dc0c47c3 ("ASoC: amd: ps: fix the pcm device numbering for acp pdm dmic")
--- include/sound/soc-component.h | 4 ++++ sound/soc/generic/audio-graph-card.c | 1 + sound/soc/soc-component.c | 10 +++++++++- 3 files changed, 14 insertions(+), 1 deletion(-)
include/sound/soc-component.h +4 -0
@@ -90,6 +90,10 @@ struct snd_soc_component_driver { struct snd_soc_pcm_runtime *rtd);void (*pcm_destruct)(struct snd_soc_component *component,struct snd_pcm *pcm); +int (*pcm_new)(struct snd_soc_component *component, +struct snd_soc_pcm_runtime *rtd); +void (*pcm_free)(struct snd_soc_component *component, +struct snd_pcm *pcm);/* component wide operations */ int (*set_sysclk)(struct snd_soc_component *component,
sound/soc/generic/audio-graph-card.c +1 -0
@@ -77,6 +77,7 @@ static bool soc_component_is_pcm(struct snd_soc_dai_link_component *dlc)struct snd_soc_dai *dai =snd_soc_find_dai_with_mutex (dlc);if (dai && (dai->component->driver->pcm_construct || + dai->component->driver->pcm_new || (dai->driver->ops && dai->driver->ops->pcm_new)))return true;
sound/soc/soc-component.c +9 -1
@@ -1042,6 +1042,11 @@ int snd_soc_pcm_component_new(struct snd_soc_pcm_runtime *rtd)if (ret <0 )return soc_component_ret (component, ret); } +if (component->driver->pcm_new) { + ret = component->driver->pcm_new (component, rtd); +if (ret <0 ) +return soc_component_ret (component, ret); + } }return 0 ;
@@ -1055,9 +1060,12 @@ void snd_soc_pcm_component_free(struct snd_soc_pcm_runtime *rtd)if (!rtd->pcm)return ; -for_each_rtd_components (rtd, i, component) +for_each_rtd_components (rtd, i, component) {if (component->driver->pcm_destruct) component->driver->pcm_destruct (component, rtd->pcm); +if (component->driver->pcm_free) + component->driver->pcm_free (component, rtd->pcm); + } }int snd_soc_pcm_component_prepare (struct snd_pcm_substream *substream)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 412/1146 ASoC: amd: name back to pcm_new()/pcm_free()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit fe33a69681e343999e18893f97bb6cd99b883992 ]
We have been used pcm_new()/pcm_free(), but switched to pcm_construct()/pcm_destruct() to use extra parameters [1].
pcm_new()/free() had been removed [2], but each drivers are still using such function naming. Let's name back to pcm_new()/pcm_free() again.
[1] commit c64bfc906600 ("ASoC: soc-core: add new pcm_construct/pcm_destruct")
[2] commit e9067bb50278 ("ASoC: soc-component: remove snd_pcm_ops fromcomponent driver")
Stable-dep-of: 3666dc0c47c3 ("ASoC: amd: ps: fix the pcm device numbering for acp pdm dmic")
--- sound/soc/amd/acp-pcm-dma.c | 2 +- sound/soc/amd/acp/acp-platform.c | 2 +- sound/soc/amd/ps/ps-pdm-dma.c | 2 +- sound/soc/amd/ps/ps-sdw-dma.c | 2 +- sound/soc/amd/raven/acp3x-pcm-dma.c | 2 +- sound/soc/amd/renoir/acp3x-pdm-dma.c | 2 +- sound/soc/amd/vangogh/acp5x-pcm-dma.c | 2 +- sound/soc/amd/yc/acp6x-pdm-dma.c | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-)
sound/soc/amd/acp-pcm-dma.c +1 -1
@@ -1252,7 +1252,7 @@ static const struct snd_soc_component_driver acp_asoc_platform = { .pointer = acp_dma_pointer, .delay = acp_dma_delay, .prepare = acp_dma_prepare, - .pcm_construct = acp_dma_new, + .pcm_new = acp_dma_new, };static int acp_audio_probe (struct platform_device *pdev)
sound/soc/amd/acp/acp-platform.c +1 -1
@@ -321,7 +321,7 @@ static const struct snd_soc_component_driver acp_pcm_component = { .close = acp_dma_close, .hw_params = acp_dma_hw_params, .pointer = acp_dma_pointer, - .pcm_construct = acp_dma_new, + .pcm_new = acp_dma_new, .legacy_dai_naming = 1, };
sound/soc/amd/ps/ps-pdm-dma.c +1 -1
@@ -351,7 +351,7 @@ static const struct snd_soc_component_driver acp63_pdm_component = { .close = acp63_pdm_dma_close, .hw_params = acp63_pdm_dma_hw_params, .pointer = acp63_pdm_dma_pointer, - .pcm_construct = acp63_pdm_dma_new, + .pcm_new = acp63_pdm_dma_new, };static int acp63_pdm_audio_probe (struct platform_device *pdev)
sound/soc/amd/ps/ps-sdw-dma.c +1 -1
@@ -634,7 +634,7 @@ static const struct snd_soc_component_driver acp63_sdw_component = { .hw_params = acp63_sdw_dma_hw_params, .trigger = acp63_sdw_dma_trigger, .pointer = acp63_sdw_dma_pointer, - .pcm_construct = acp63_sdw_dma_new, + .pcm_new = acp63_sdw_dma_new, .use_dai_pcm_id = true, };
sound/soc/amd/raven/acp3x-pcm-dma.c +1 -1
@@ -363,7 +363,7 @@ static const struct snd_soc_component_driver acp3x_i2s_component = { .close = acp3x_dma_close, .hw_params = acp3x_dma_hw_params, .pointer = acp3x_dma_pointer, - .pcm_construct = acp3x_dma_new, + .pcm_new = acp3x_dma_new, };static int acp3x_audio_probe (struct platform_device *pdev)
sound/soc/amd/renoir/acp3x-pdm-dma.c +1 -1
@@ -376,7 +376,7 @@ static const struct snd_soc_component_driver acp_pdm_component = { .close = acp_pdm_dma_close, .hw_params = acp_pdm_dma_hw_params, .pointer = acp_pdm_dma_pointer, - .pcm_construct = acp_pdm_dma_new, + .pcm_new = acp_pdm_dma_new, .legacy_dai_naming = 1, };
sound/soc/amd/vangogh/acp5x-pcm-dma.c +1 -1
@@ -357,7 +357,7 @@ static const struct snd_soc_component_driver acp5x_i2s_component = { .close = acp5x_dma_close, .hw_params = acp5x_dma_hw_params, .pointer = acp5x_dma_pointer, - .pcm_construct = acp5x_dma_new, + .pcm_new = acp5x_dma_new, };static int acp5x_audio_probe (struct platform_device *pdev)
sound/soc/amd/yc/acp6x-pdm-dma.c +1 -1
@@ -346,7 +346,7 @@ static const struct snd_soc_component_driver acp6x_pdm_component = { .close = acp6x_pdm_dma_close, .hw_params = acp6x_pdm_dma_hw_params, .pointer = acp6x_pdm_dma_pointer, - .pcm_construct = acp6x_pdm_dma_new, + .pcm_new = acp6x_pdm_dma_new, .legacy_dai_naming = 1, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 413/1146 ASoC: amd: ps: fix the pcm device numbering for acp pdm dmic
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Syed Saba Kareem <[email protected]>
[ Upstream commit 3666dc0c47c399695d01fde7c36e08b14f834fa0 ]
Fixed PCM device numbering is required for acp pdm dmic pcm device to have a common UCM changes.
Set the 'use_dai_pcm_id' flag true in acp pdm dma driver for acp 6.3 platform. This will fix the pcm device numbering based on dai_link->id.
--- sound/soc/amd/ps/ps-pdm-dma.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/amd/ps/ps-pdm-dma.c +1 -0
@@ -352,6 +352,7 @@ static const struct snd_soc_component_driver acp63_pdm_component = { .hw_params = acp63_pdm_dma_hw_params, .pointer = acp63_pdm_dma_pointer, .pcm_new = acp63_pdm_dma_new, + .use_dai_pcm_id = true, };static int acp63_pdm_audio_probe (struct platform_device *pdev)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 414/1146 ALSA: usb-audio: qcom: Fix incorrect type in enable_audio_stream
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: songxiebing <[email protected]>
[ Upstream commit 292286b2d229fb732421429b027d38ac3f969383 ]
Fix sparse warning:sound/usb/qcom/qc_audio_offload.c:943:27: sparse: incorrect type in argument 2 expected unsigned int val but got snd_pcm_format_t.
Explicitly cast pcm_format to unsigned int for snd_mask_leave().
--- sound/usb/qcom/qc_audio_offload.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/qcom/qc_audio_offload.c +1 -1
@@ -948,7 +948,7 @@ static int enable_audio_stream(struct snd_usb_substream *subs,_snd_pcm_hw_params_any (¶ms); m =hw_param_mask (¶ms,SNDRV_PCM_HW_PARAM_FORMAT ); -snd_mask_leave (m, pcm_format); +snd_mask_leave (m, (__force unsigned int )pcm_format); i =hw_param_interval (¶ms,SNDRV_PCM_HW_PARAM_CHANNELS );snd_interval_setinteger (i);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 415/1146 PCI: tegra194: Fix polling delay for L2 state
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vidya Sagar <[email protected]>
[ Upstream commit adaffed907f14f954096555665ad6af2ae724d83 ]
As per PCIe r7.0, sec 5.3.3.2.1, after sending PME_Turn_Off message, Root Port should wait for 1-10 msec for PME_TO_Ack message. Currently, driver is polling for 10 msec with 1 usec delay which is aggressive. Use existing macro PCIE_PME_TO_L2_TIMEOUT_US to poll for 10 msec with 1 msec delay. Since this function is used in non-atomic context only, use non-atomic poll function.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +4 -5
@@ -198,8 +198,6 @@#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK GENMASK(11, 8)#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT 8 -#define PME_ACK_TIMEOUT 10000 -#define LTSSM_TIMEOUT 50000/* 50ms */ #define GEN3_GEN4_EQ_PRESET_INIT 5
@@ -1553,9 +1551,10 @@ static int tegra_pcie_try_link_l2(struct tegra_pcie_dw *pcie) val |=APPL_PM_XMT_TURNOFF_STATE ;appl_writel (pcie, val,APPL_RADM_STATUS ); -return readl_poll_timeout_atomic (pcie->appl_base +APPL_DEBUG , val, - val &APPL_DEBUG_PM_LINKST_IN_L2_LAT , -1 ,PME_ACK_TIMEOUT ); +return readl_poll_timeout (pcie->appl_base +APPL_DEBUG , val, + val &APPL_DEBUG_PM_LINKST_IN_L2_LAT , +PCIE_PME_TO_L2_TIMEOUT_US /10 , +PCIE_PME_TO_L2_TIMEOUT_US ); }static void tegra_pcie_dw_pme_turnoff (struct tegra_pcie_dw *pcie)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 416/1146 PCI: tegra194: Increase LTSSM poll time on surprise link down
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manikanta Maddireddy <[email protected]>
[ Upstream commit 74dd8efe4d6cead433162147333af989a568aac7 ]
On surprise link down, LTSSM state transits from L0 -> Recovery.RcvrLock -> Recovery.RcvrSpeed -> Gen1 Recovery.RcvrLock -> Detect. Recovery.RcvrLock and Recovery.RcvrSpeed transit times are 24 ms and 48 ms respectively, so the total time from L0 to Detect is ~96 ms. Increase the poll timeout to 120 ms to account for this.
While at it, add LTSSM state defines for Detect-related states and use them in the poll condition. Use readl_poll_timeout() instead of readl_poll_timeout_atomic() in tegra_pcie_dw_pme_turnoff() since that path runs in non-atomic context.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 36 +++++++++++++--------- 1 file changed, 21 insertions(+), 15 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +21 -15
@@ -137,7 +137,11 @@#define APPL_DEBUG_PM_LINKST_IN_L0 0x11#define APPL_DEBUG_LTSSM_STATE_MASK GENMASK(8, 3)#define APPL_DEBUG_LTSSM_STATE_SHIFT 3 -#define LTSSM_STATE_PRE_DETECT 5 +#define LTSSM_STATE_DETECT_QUIET 0x00 +#define LTSSM_STATE_DETECT_ACT 0x08 +#define LTSSM_STATE_PRE_DETECT_QUIET 0x28 +#define LTSSM_STATE_DETECT_WAIT 0x30 +#define LTSSM_STATE_L2_IDLE 0xa8#define APPL_RADM_STATUS 0xE4#define APPL_PM_XMT_TURNOFF_STATE BIT(0)
@@ -198,7 +202,8 @@#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK GENMASK(11, 8)#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT 8 -#define LTSSM_TIMEOUT 50000/* 50ms */ +#define LTSSM_DELAY_US 10000/* 10 ms */ +#define LTSSM_TIMEOUT_US 120000/* 120 ms */ #define GEN3_GEN4_EQ_PRESET_INIT 5
@@ -1597,15 +1602,14 @@ static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie) data &= ~APPL_CTRL_LTSSM_EN ;writel (data, pcie->appl_base +APPL_CTRL ); - err =readl_poll_timeout_atomic (pcie->appl_base +APPL_DEBUG , - data, - ((data & -APPL_DEBUG_LTSSM_STATE_MASK ) >> -APPL_DEBUG_LTSSM_STATE_SHIFT ) == -LTSSM_STATE_PRE_DETECT , -1 ,LTSSM_TIMEOUT ); + err =readl_poll_timeout (pcie->appl_base +APPL_DEBUG , data, + ((data &APPL_DEBUG_LTSSM_STATE_MASK ) ==LTSSM_STATE_DETECT_QUIET ) || + ((data &APPL_DEBUG_LTSSM_STATE_MASK ) ==LTSSM_STATE_DETECT_ACT ) || + ((data &APPL_DEBUG_LTSSM_STATE_MASK ) ==LTSSM_STATE_PRE_DETECT_QUIET ) || + ((data &APPL_DEBUG_LTSSM_STATE_MASK ) ==LTSSM_STATE_DETECT_WAIT ), +LTSSM_DELAY_US ,LTSSM_TIMEOUT_US );if (err) -dev_info (pcie->dev,"Link didn't go to detect state\n" ); +dev_info (pcie->dev,"LTSSM state: 0x%x detect timeout: %d\n" , data, err); }/* * DBI registers may not be accessible after this as PLL-E would be
@@ -1685,12 +1689,14 @@ static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)appl_writel (pcie, val,APPL_CTRL ); ret =readl_poll_timeout (pcie->appl_base +APPL_DEBUG , val, - ((val &APPL_DEBUG_LTSSM_STATE_MASK ) >> -APPL_DEBUG_LTSSM_STATE_SHIFT ) == -LTSSM_STATE_PRE_DETECT , -1 ,LTSSM_TIMEOUT ); + ((val &APPL_DEBUG_LTSSM_STATE_MASK ) ==LTSSM_STATE_DETECT_QUIET ) || + ((val &APPL_DEBUG_LTSSM_STATE_MASK ) ==LTSSM_STATE_DETECT_ACT ) || + ((val &APPL_DEBUG_LTSSM_STATE_MASK ) ==LTSSM_STATE_PRE_DETECT_QUIET ) || + ((val &APPL_DEBUG_LTSSM_STATE_MASK ) ==LTSSM_STATE_DETECT_WAIT ) || + ((val &APPL_DEBUG_LTSSM_STATE_MASK ) ==LTSSM_STATE_L2_IDLE ), +LTSSM_DELAY_US ,LTSSM_TIMEOUT_US );if (ret) -dev_err (pcie->dev,"Failed to go Detect state: %d\n" , ret); +dev_info (pcie->dev,"LTSSM state: 0x%x detect timeout: %d\n" , val, ret);reset_control_assert (pcie->core_rst);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 417/1146 PCI: tegra194: Disable LTSSM after transition to Detect on surprise link down
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manikanta Maddireddy <[email protected]>
[ Upstream commit 9fa0c242f8d7acf1b124d4462d18f4023573ac1c ]
After the link reaches a Detect-related LTSSM state, disable LTSSM so it does not keep toggling between Polling and Detect. Do this by polling for the Detect state first, then clearing APPL_CTRL_LTSSM_EN in both tegra_pcie_dw_pme_turnoff() and pex_ep_event_pex_rst_assert().
--- drivers/pci/controller/dwc/pcie-tegra194.c | 29 ++++++++++++---------- 1 file changed, 16 insertions(+), 13 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +16 -13
@@ -1594,14 +1594,6 @@ static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie) data &= ~APPL_PINMUX_PEX_RST ;appl_writel (pcie, data,APPL_PINMUX ); -/* -* Some cards do not go to detect state even after de-asserting -* PERST#. So, de-assert LTSSM to bring link to detect state. -*/ - data =readl (pcie->appl_base +APPL_CTRL ); - data &= ~APPL_CTRL_LTSSM_EN ; -writel (data, pcie->appl_base +APPL_CTRL ); - err = readl_poll_timeout(pcie->appl_base + APPL_DEBUG, data, ((data & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_QUIET) || ((data & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_ACT) ||
@@ -1610,6 +1602,14 @@ static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie) LTSSM_DELAY_US, LTSSM_TIMEOUT_US);if (err)dev_info (pcie->dev,"LTSSM state: 0x%x detect timeout: %d\n" , data, err); + +/* +* Deassert LTSSM state to stop the state toggling between +* Polling and Detect. +*/ + data =readl (pcie->appl_base +APPL_CTRL ); + data &= ~APPL_CTRL_LTSSM_EN ; +writel (data, pcie->appl_base +APPL_CTRL ); }/* * DBI registers may not be accessible after this as PLL-E would be
@@ -1683,11 +1683,6 @@ static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)if (pcie->ep_state ==EP_STATE_DISABLED )return ; -/* Disable LTSSM */ - val =appl_readl (pcie,APPL_CTRL ); - val &= ~APPL_CTRL_LTSSM_EN ; -appl_writel (pcie, val,APPL_CTRL ); - ret = readl_poll_timeout(pcie->appl_base + APPL_DEBUG, val, ((val & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_QUIET) || ((val & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_ACT) ||
@@ -1698,6 +1693,14 @@ static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)if (ret)dev_info (pcie->dev,"LTSSM state: 0x%x detect timeout: %d\n" , val, ret); +/* +* Deassert LTSSM state to stop the state toggling between +* Polling and Detect. +*/ + val =appl_readl (pcie,APPL_CTRL ); + val &= ~APPL_CTRL_LTSSM_EN ; +appl_writel (pcie, val,APPL_CTRL ); +reset_control_assert (pcie->core_rst);tegra_pcie_disable_phy (pcie);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 418/1146 PCI: tegra194: Dont force the device into the D0 state before L2
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vidya Sagar <[email protected]>
[ Upstream commit 71d9f67701e1affc82d18ca88ae798c5361beddf ]
As per PCIe CEM r6.0, sec 2.3, the PCIe Endpoint device should be in D3cold to assert WAKE# pin. The previous workaround that forced downstream devices to D0 before taking the link to L2 cited PCIe r4.0, sec 5.2, "Link State Power Management"; however, that spec does not explicitly require putting the device into D0 and only indicates that power removal may be initiated without transitioning to D3hot.
Remove the D0 workaround so that Endpoint devices can use wake functionality (WAKE# from D3). With some Endpoints the link may not enter L2 when they remain in D3, but the Root Port continues with the usual flow after PME timeout, so there is no functional issue.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 41 ---------------------- 1 file changed, 41 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +0 -41
@@ -1258,44 +1258,6 @@ static int tegra_pcie_bpmp_set_pll_state(struct tegra_pcie_dw *pcie,return 0 ; } -static void tegra_pcie_downstream_dev_to_D0 (struct tegra_pcie_dw *pcie) -{ -struct dw_pcie_rp *pp = &pcie->pci.pp; -struct pci_bus *child, *root_port_bus =NULL ; -struct pci_dev *pdev; - -/* -* link doesn't go into L2 state with some of the endpoints with Tegra -* if they are not in D0 state. So, need to make sure that immediate -* downstream devices are in D0 state before sending PME_TurnOff to put -* link into L2 state. -* This is as per PCI Express Base r4.0 v1.0 September 27-2017, -* 5.2 Link State Power Management (Page #428). -*/ - -list_for_each_entry (child, &pp->bridge->bus->children, node) { -if (child->parent == pp->bridge->bus) { - root_port_bus = child; -break ; - } - } - -if (!root_port_bus) { -dev_err (pcie->dev,"Failed to find downstream bus of Root Port\n" ); -return ; - } - -/* Bring downstream devices to D0 if they are not already in */ -list_for_each_entry (pdev, &root_port_bus->devices, bus_list) { -if (PCI_SLOT (pdev->devfn) ==0 ) { -if (pci_set_power_state (pdev,PCI_D0 )) -dev_err (pcie->dev, -"Failed to transition %s to D0 state\n" , -dev_name (&pdev->dev)); - } - } -} -static int tegra_pcie_get_slot_regulators (struct tegra_pcie_dw *pcie) { pcie->slot_ctl_3v3 =devm_regulator_get_optional (pcie->dev,"vpcie3v3" );
@@ -1625,7 +1587,6 @@ static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie)static void tegra_pcie_deinit_controller (struct tegra_pcie_dw *pcie) { -tegra_pcie_downstream_dev_to_D0 (pcie);dw_pcie_host_deinit (&pcie->pci.pp);tegra_pcie_dw_pme_turnoff (pcie);tegra_pcie_unconfig_controller (pcie);
@@ -2336,7 +2297,6 @@ static int tegra_pcie_dw_suspend_noirq(struct device *dev)if (!pcie->link_state)return 0 ; -tegra_pcie_downstream_dev_to_D0 (pcie);tegra_pcie_dw_pme_turnoff (pcie);tegra_pcie_unconfig_controller (pcie);
@@ -2410,7 +2370,6 @@ static void tegra_pcie_dw_shutdown(struct platform_device *pdev)return ;debugfs_remove_recursive (pcie->debugfs); -tegra_pcie_downstream_dev_to_D0 (pcie);disable_irq (pcie->pci.pp.irq);if (IS_ENABLED (CONFIG_PCI_MSI ))
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 419/1146 PCI: tegra194: Disable PERST# IRQ only in Endpoint mode
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manikanta Maddireddy <[email protected]>
[ Upstream commit 40658a31b6e134169c648041efc84944c4c71dcd ]
The PERST# GPIO interrupt is only registered when the controller is operating in Endpoint mode. In Root Port mode, the PERST# GPIO is configured as an output to control downstream devices, and no interrupt is registered for it.
Currently, tegra_pcie_dw_stop_link() unconditionally calls disable_irq() on pex_rst_irq, which causes issues in Root Port mode where this IRQ is not registered.
Fix this by only disabling the PERST# IRQ when operating in Endpoint mode, where the interrupt is actually registered and used to detect PERST# assertion/deassertion from the host.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/pci/controller/dwc/pcie-tegra194.c +2 -1
@@ -1025,7 +1025,8 @@ static void tegra_pcie_dw_stop_link(struct dw_pcie *pci) {struct tegra_pcie_dw *pcie =to_tegra_pcie (pci); -disable_irq (pcie->pex_rst_irq); +if (pcie->of_data->mode ==DW_PCIE_EP_TYPE ) +disable_irq (pcie->pex_rst_irq); }static const struct dw_pcie_ops tegra_dw_pcie_ops = {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 420/1146 PCI: tegra194: Use devm_gpiod_get_optional() to parse "nvidia,refclk-select"
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vidya Sagar <[email protected]>
[ Upstream commit f62bc7917de1374dce86a852ffba8baf9cb7a56a ]
The GPIO DT property "nvidia,refclk-select", to select the PCIe reference clock is optional. Use devm_gpiod_get_optional() to get it.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +3 -3
@@ -1167,9 +1167,9 @@ static int tegra_pcie_dw_parse_dt(struct tegra_pcie_dw *pcie)return err; } - pcie->pex_refclk_sel_gpiod =devm_gpiod_get (pcie->dev, -"nvidia,refclk-select" , -GPIOD_OUT_HIGH ); + pcie->pex_refclk_sel_gpiod =devm_gpiod_get_optional (pcie->dev, +"nvidia,refclk-select" , +GPIOD_OUT_HIGH );if (IS_ERR (pcie->pex_refclk_sel_gpiod)) {int err =PTR_ERR (pcie->pex_refclk_sel_gpiod);const char *level =KERN_ERR ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 421/1146 PCI: tegra194: Disable direct speed change for Endpoint mode
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vidya Sagar <[email protected]>
[ Upstream commit 976f6763f57970388bcd7118931f33f447916927 ]
Pre-silicon simulation showed the controller operating in Endpoint mode initiating link speed change after completing Secondary Bus Reset. Ideally, the Root Port or the Switch Downstream Port should initiate the link speed change post SBR, not the Endpoint.
So, as per the hardware team recommendation, disable direct speed change for the Endpoint mode to prevent it from initiating speed change after the physical layer link is up at Gen1, leaving speed change ownership with the host.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/pci/controller/dwc/pcie-tegra194.c +4 -0
@@ -1805,6 +1805,10 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)reset_control_deassert (pcie->core_rst); + val =dw_pcie_readl_dbi (pci,PCIE_LINK_WIDTH_SPEED_CONTROL ); + val &= ~PORT_LOGIC_SPEED_CHANGE ; +dw_pcie_writel_dbi (pci,PCIE_LINK_WIDTH_SPEED_CONTROL , val); +if (pcie->update_fc_fixup) { val =dw_pcie_readl_dbi (pci,CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF ); val |=0x1 <<CFG_TIMER_CTRL_ACK_NAK_SHIFT ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 422/1146 PCI: tegra194: Set LTR message request before PCIe link up in Endpoint mode
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vidya Sagar <[email protected]>
[ Upstream commit b256493bf8cacf0e524bf4c10b5c4901d0c6cefe ]
LTR message should be sent as soon as the Root Port enables LTR in the Endpoint mode. So set snoop and no-snoop LTR timing and LTR message request before the PCIe link comes up, so that the LTR message is sent upstream as soon as LTR is enabled.
Without programming these values, the Endpoint would send latencies of 0 to the host, which will be inaccurate.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +9 -9
@@ -485,15 +485,6 @@ static irqreturn_t tegra_pcie_ep_irq_thread(int irq, void *arg)if (val &PCI_COMMAND_MASTER ) {ktime_t timeout; -/* 110us for both snoop and no-snoop */ - val =FIELD_PREP (PCI_LTR_VALUE_MASK ,110 ) | -FIELD_PREP (PCI_LTR_SCALE_MASK ,2 ) | -LTR_MSG_REQ | -FIELD_PREP (PCI_LTR_NOSNOOP_VALUE ,110 ) | -FIELD_PREP (PCI_LTR_NOSNOOP_SCALE ,2 ) | -LTR_NOSNOOP_MSG_REQ ; -appl_writel (pcie, val,APPL_LTR_MSG_1 ); -/* Send LTR upstream */ val =appl_readl (pcie,APPL_LTR_MSG_2 ); val |=APPL_LTR_MSG_2_LTR_MSG_REQ_STATE ;
@@ -1803,6 +1794,15 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie) val |=APPL_INTR_EN_L1_0_0_RDLH_LINK_UP_INT_EN ;appl_writel (pcie, val,APPL_INTR_EN_L1_0_0 ); +/* 110us for both snoop and no-snoop */ + val =FIELD_PREP (PCI_LTR_VALUE_MASK ,110 ) | +FIELD_PREP (PCI_LTR_SCALE_MASK ,2 ) | +LTR_MSG_REQ | +FIELD_PREP (PCI_LTR_NOSNOOP_VALUE ,110 ) | +FIELD_PREP (PCI_LTR_NOSNOOP_SCALE ,2 ) | +LTR_NOSNOOP_MSG_REQ ; +appl_writel (pcie, val,APPL_LTR_MSG_1 ); +reset_control_deassert (pcie->core_rst); val =dw_pcie_readl_dbi (pci,PCIE_LINK_WIDTH_SPEED_CONTROL );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 423/1146 PCI: tegra194: Allow system suspend when the Endpoint link is not up
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vidya Sagar <[email protected]>
[ Upstream commit c76f8eae7d4695b1176c4ea5eb93c17e16a20272 ]
Host software initiates the L2 sequence. PCIe link is kept in L2 state during suspend. If Endpoint mode is enabled and the link is up, the software cannot proceed with suspend. However, when the PCIe Endpoint driver is probed, but the PCIe link is not up, Tegra can go into suspend state. So, allow system to suspend in this case.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 31 +++++++++++++++++----- 1 file changed, 25 insertions(+), 6 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +25 -6
@@ -2270,16 +2270,28 @@ static void tegra_pcie_dw_remove(struct platform_device *pdev)gpiod_set_value (pcie->pex_refclk_sel_gpiod,0 ); } -static int tegra_pcie_dw_suspend_late (struct device *dev) +static int tegra_pcie_dw_suspend (struct device *dev) {struct tegra_pcie_dw *pcie =dev_get_drvdata (dev); -u32 val;if (pcie->of_data->mode ==DW_PCIE_EP_TYPE ) { -dev_err (dev,"Failed to Suspend as Tegra PCIe is in EP mode\n" ); -return -EPERM ; +if (pcie->ep_state ==EP_STATE_ENABLED ) { +dev_err (dev,"Tegra PCIe is in EP mode, suspend not allowed\n" ); +return -EPERM ; + } + +disable_irq (pcie->pex_rst_irq); +return 0 ; } +return 0 ; +} + +static int tegra_pcie_dw_suspend_late (struct device *dev) +{ +struct tegra_pcie_dw *pcie =dev_get_drvdata (dev); +u32 val; +if (!pcie->link_state)return 0 ;
@@ -2299,6 +2311,9 @@ static int tegra_pcie_dw_suspend_noirq(struct device *dev) {struct tegra_pcie_dw *pcie =dev_get_drvdata (dev); +if (pcie->of_data->mode ==DW_PCIE_EP_TYPE ) +return 0 ; +if (!pcie->link_state)return 0 ;
@@ -2313,6 +2328,9 @@ static int tegra_pcie_dw_resume_noirq(struct device *dev)struct tegra_pcie_dw *pcie =dev_get_drvdata (dev);int ret; +if (pcie->of_data->mode ==DW_PCIE_EP_TYPE ) +return 0 ; +if (!pcie->link_state)return 0 ;
@@ -2345,8 +2363,8 @@ static int tegra_pcie_dw_resume_early(struct device *dev)u32 val;if (pcie->of_data->mode ==DW_PCIE_EP_TYPE ) { -dev_err (dev,"Suspend is not supported in EP mode" ); -return -ENOTSUPP ; +enable_irq (pcie->pex_rst_irq); +return 0 ; }if (!pcie->link_state)
@@ -2451,6 +2469,7 @@ static const struct of_device_id tegra_pcie_dw_of_match[] = { };static const struct dev_pm_ops tegra_pcie_dw_pm_ops = { + .suspend = tegra_pcie_dw_suspend, .suspend_late = tegra_pcie_dw_suspend_late, .suspend_noirq = tegra_pcie_dw_suspend_noirq, .resume_noirq = tegra_pcie_dw_resume_noirq,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 424/1146 PCI: tegra194: Free up Endpoint resources during remove()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vidya Sagar <[email protected]>
[ Upstream commit 8870f02f7868209eb9bdc5dc53540a6262cf9227 ]
Free up the resources during remove() that were acquired by the DesignWare driver for the Endpoint mode during probe().
--- drivers/pci/controller/dwc/pcie-tegra194.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pci/controller/dwc/pcie-tegra194.c +2 -0
@@ -2251,6 +2251,7 @@ static int tegra_pcie_dw_probe(struct platform_device *pdev)static void tegra_pcie_dw_remove (struct platform_device *pdev) {struct tegra_pcie_dw *pcie =platform_get_drvdata (pdev); +struct dw_pcie_ep *ep = &pcie->pci.ep;if (pcie->of_data->mode ==DW_PCIE_RC_TYPE ) {if (!pcie->link_state)
@@ -2262,6 +2263,7 @@ static void tegra_pcie_dw_remove(struct platform_device *pdev) }else {disable_irq (pcie->pex_rst_irq);pex_ep_event_pex_rst_assert (pcie); +dw_pcie_ep_deinit (ep); }pm_runtime_disable (pcie->dev);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 425/1146 PCI: tegra194: Use DWC IP core version
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manikanta Maddireddy <[email protected]>
[ Upstream commit ea60ca067f0f098043610c96a915d162113c1aac ]
Tegra194 PCIe driver used custom version numbers to detect Tegra194 and Tegra234 IPs. With version detect logic added, version check results in mismatch warnings:
tegra194-pcie 14100000.pcie: Versions don't match (0000562a != 3536322a)
Use HW version numbers which match to PORT_LOGIC.PCIE_VERSION_OFF in Tegra194 driver to avoid these kernel warnings.
--- drivers/pci/controller/dwc/pcie-designware.h | 2 ++ drivers/pci/controller/dwc/pcie-tegra194.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-)
drivers/pci/controller/dwc/pcie-designware.h +2 -0
@@ -34,8 +34,10 @@#define DW_PCIE_VER_470A 0x3437302a#define DW_PCIE_VER_480A 0x3438302a#define DW_PCIE_VER_490A 0x3439302a +#define DW_PCIE_VER_500A 0x3530302a#define DW_PCIE_VER_520A 0x3532302a#define DW_PCIE_VER_540A 0x3534302a +#define DW_PCIE_VER_562A 0x3536322a#define __dw_pcie_ver_cmp (_pci, _ver, _op) \ ((_pci)->version _op DW_PCIE_VER_ ## _ver)
drivers/pci/controller/dwc/pcie-tegra194.c +2 -2
@@ -35,8 +35,8 @@#include <soc/tegra/bpmp-abi.h> #include "../../pci.h" -#define TEGRA194_DWC_IP_VER 0x490A -#define TEGRA234_DWC_IP_VER 0x562A +#define TEGRA194_DWC_IP_VER DW_PCIE_VER_500A +#define TEGRA234_DWC_IP_VER DW_PCIE_VER_562A#define APPL_PINMUX 0x0#define APPL_PINMUX_PEX_RST BIT(0)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 426/1146 PCI: dwc: Apply ECRC workaround to DesignWare 5.00a as well
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manikanta Maddireddy <[email protected]>
[ Upstream commit 40805f32dceadebb7381d911003100bec7b8cd51 ]
The ECRC (TLP digest) workaround was originally added for DesignWare version 4.90a. Tegra234 SoC has 5.00a DWC HW version, which has the same ATU TD override behaviour, so apply the workaround for 5.00a too.
--- drivers/pci/controller/dwc/pcie-designware.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/pci/controller/dwc/pcie-designware.c +8 -8
@@ -487,13 +487,13 @@ static inline void dw_pcie_writel_atu_ob(struct dw_pcie *pci, u32 index, u32 regstatic inline u32 dw_pcie_enable_ecrc (u32 val) {/* -* DesignWare core version 4.90A has a design issue where the 'TD' -* bit in the Control register-1 of the ATU outbound region acts -* like an override for the ECRC setting, i.e., the presence of TLP -* Digest (ECRC) in the outgoing TLPs is solely determined by this -* bit. This is contrary to the PCIe spec which says that the -* enablement of the ECRC is solely determined by the AER -* registers. +* DWC versions 0x3530302a and 0x3536322a have a design issue where +* the 'TD' bit in the Control register-1 of the ATU outbound +* region acts like an override for the ECRC setting, i.e., the +* presence of TLP Digest (ECRC) in the outgoing TLPs is solely +* determined by this bit. This is contrary to the PCIe spec which +* says that the enablement of the ECRC is solely determined by the +* AER registers. * * Because of this, even when the ECRC is enabled through AER * registers, the transactions going through ATU won't have TLP
@@ -563,7 +563,7 @@ int dw_pcie_prog_outbound_atu(struct dw_pcie *pci,if (upper_32_bits (limit_addr) >upper_32_bits (parent_bus_addr) && dw_pcie_ver_is_ge(pci, 460A)) val |=PCIE_ATU_INCREASE_REGION_SIZE ; - if (dw_pcie_ver_is(pci, 490A)) + if (dw_pcie_ver_is(pci, 490A) || dw_pcie_ver_is(pci, 500A)) val =dw_pcie_enable_ecrc (val);dw_pcie_writel_atu_ob (pci, atu->index,PCIE_ATU_REGION_CTRL1 , val);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 427/1146 PCI: tegra194: Disable L1.2 capability of Tegra234 EP
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vidya Sagar <[email protected]>
[ Upstream commit f59df1d9e6bdb6bd7ef65fb5d200900ac40c20ba ]
When Tegra234 is operating in the Endpoint mode with L1.2 enabled, PCIe link goes down during L1.2 exit. This is because Tegra234 powers up UPHY PLL immediately without making sure that the REFCLK is stable.
This causes UPHY PLL to fail to lock to the correct frequency and leads to link going down. There is no hardware fix for this, hence do not advertise the L1.2 capability in the Endpoint mode.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
drivers/pci/controller/dwc/pcie-tegra194.c +19 -0
@@ -234,6 +234,7 @@ struct tegra_pcie_dw_of_data {bool has_sbr_reset_fix;bool has_l1ss_exit_fix;bool has_ltr_req_fix; +bool disable_l1_2;u32 cdm_chk_int_en_bit;u32 gen4_preset_vec;u8 n_fts[2 ];
@@ -679,6 +680,23 @@ static void init_host_aspm(struct tegra_pcie_dw *pcie)if (pcie->supports_clkreq) pci->l1ss_support = true; +/* +* Disable L1.2 capability advertisement for Tegra234 Endpoint mode. +* Tegra234 has a hardware bug where during L1.2 exit, the UPHY PLL is +* powered up immediately without waiting for REFCLK to stabilize. This +* causes the PLL to fail to lock to the correct frequency, resulting in +* PCIe link loss. Since there is no hardware fix available, we prevent +* the Endpoint from advertising L1.2 support by clearing the L1.2 bits +* in the L1 PM Substates Capabilities register. This ensures the host +* will not attempt to enter L1.2 state with this Endpoint. +*/ +if (pcie->of_data->disable_l1_2 && + pcie->of_data->mode ==DW_PCIE_EP_TYPE ) { + val =dw_pcie_readl_dbi (pci, l1ss +PCI_L1SS_CAP ); + val &= ~(PCI_L1SS_CAP_PCIPM_L1_2 |PCI_L1SS_CAP_ASPM_L1_2 ); +dw_pcie_writel_dbi (pci, l1ss +PCI_L1SS_CAP , val); + } +/* Program L0s and L1 entrance latencies */ val =dw_pcie_readl_dbi (pci,PCIE_PORT_AFR ); val &= ~PORT_AFR_L0S_ENTRANCE_LAT_MASK ;
@@ -2444,6 +2462,7 @@ static const struct tegra_pcie_dw_of_data tegra234_pcie_dw_ep_of_data = { .mode = DW_PCIE_EP_TYPE, .has_l1ss_exit_fix = true, .has_ltr_req_fix = true, + .disable_l1_2 = true, .cdm_chk_int_en_bit = BIT(18),/* Gen4 - 6, 8 and 9 presets enabled */ .gen4_preset_vec = 0x340,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 428/1146 PCI: tegra194: Fix CBB timeout caused by DBI access before core power-on
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manikanta Maddireddy <[email protected]>
[ Upstream commit 34b3eef48d980cd37b876e128bbf314f69fb5d70 ]
When PERST# is deasserted twice (assert -> deassert -> assert -> deassert), a CBB (Control Backbone) timeout occurs at DBI register offset 0x8bc (PCIE_MISC_CONTROL_1_OFF). This happens because pci_epc_deinit_notify() and dw_pcie_ep_cleanup() are called before reset_control_deassert() powers on the controller core.
The call chain that causes the timeout:
pex_ep_event_pex_rst_deassert()
pci_epc_deinit_notify()
pci_epf_test_epc_deinit()
pci_epf_test_clear_bar()
pci_epc_clear_bar()
dw_pcie_ep_clear_bar()
__dw_pcie_ep_reset_bar()
dw_pcie_dbi_ro_wr_en() <- Accesses 0x8bc DBI register
reset_control_deassert(pcie->core_rst) <- Core powered on HEREThe DBI registers, including PCIE_MISC_CONTROL_1_OFF (0x8bc), are only accessible after the controller core is powered on via reset_control_deassert(pcie->core_rst). Accessing them before this point results in a CBB timeout because the hardware is not yet operational.
Fix this by moving pci_epc_deinit_notify() and dw_pcie_ep_cleanup() to after reset_control_deassert(pcie->core_rst), ensuring the controller is fully powered on before any DBI register accesses occur.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +4 -4
@@ -1750,10 +1750,6 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie) goto fail_phy; } -/* Perform cleanup that requires refclk */ -pci_epc_deinit_notify (pcie->pci.ep.epc); -dw_pcie_ep_cleanup (&pcie->pci.ep); -/* Clear any stale interrupt statuses */ appl_writel (pcie,0xFFFFFFFF ,APPL_INTR_STATUS_L0 );appl_writel (pcie,0xFFFFFFFF ,APPL_INTR_STATUS_L1_0_0 );
@@ -1823,6 +1819,10 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)reset_control_deassert (pcie->core_rst); +/* Perform cleanup that requires refclk and core reset deasserted */ +pci_epc_deinit_notify (pcie->pci.ep.epc); +dw_pcie_ep_cleanup (&pcie->pci.ep); + val =dw_pcie_readl_dbi (pci,PCIE_LINK_WIDTH_SPEED_CONTROL ); val &= ~PORT_LOGIC_SPEED_CHANGE ;dw_pcie_writel_dbi (pci,PCIE_LINK_WIDTH_SPEED_CONTROL , val);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 429/1146 drm/fb-helper: Fix a locking bug in an error path
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
[ Upstream commit bd64240dc88caaf7b96dd869f36f165f51b52039 ]
The name of the function __drm_fb_helper_initial_config_and_unlock() and also the comment above that function make it clear that all code paths in this function should unlock fb_helper->lock before returning. Add a mutex_unlock() call in the only code path where it is missing. This has been detected by the Clang thread-safety analyzer.
--- drivers/gpu/drm/drm_fb_helper.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_fb_helper.c +3 -1
@@ -1641,8 +1641,10 @@ __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper)drm_client_modeset_probe (&fb_helper->client, width, height); info =drm_fb_helper_alloc_info (fb_helper); -if (IS_ERR (info)) +if (IS_ERR (info)) { +mutex_unlock (&fb_helper->lock);return PTR_ERR (info); + } ret =drm_fb_helper_single_fb_probe (fb_helper);if (ret <0 ) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 430/1146 PCI: cadence: Add flags for disabling ASPM capability for broken Root Ports
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yao Zi <[email protected]>
[ Upstream commit 5ccc76a87f1ec2422811e61be44165bfc9e7cf54 ]
Add flags for disabling the ASPM L0s/L1 capability for broken Root Ports by clearing the corresponding bits in Link Capabilities Register through the local management bus. This allows ASPM to be disabled on platforms which don't support it.
Stable-dep-of: 988ef706cdd8 ("PCI: sg2042: Avoid L0s and L1 on Sophgo 2042 PCIe Root Ports")
--- .../controller/cadence/pcie-cadence-host.c | 7 +++++++ drivers/pci/controller/cadence/pcie-cadence.h | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+)
drivers/pci/controller/cadence/pcie-cadence-host.c +7 -0
@@ -147,6 +147,13 @@ static int cdns_pcie_host_init_root_port(struct cdns_pcie_rc *rc)cdns_pcie_rp_writeb (pcie,PCI_CLASS_PROG ,0 );cdns_pcie_rp_writew (pcie,PCI_CLASS_DEVICE ,PCI_CLASS_BRIDGE_PCI ); + value =cdns_pcie_rp_readl (pcie,CDNS_PCIE_RP_CAP_OFFSET +PCI_EXP_LNKCAP ); +if (rc->quirk_broken_aspm_l0s) + value &= ~PCI_EXP_LNKCAP_ASPM_L0S ; +if (rc->quirk_broken_aspm_l1) + value &= ~PCI_EXP_LNKCAP_ASPM_L1 ; +cdns_pcie_rp_writel (pcie,CDNS_PCIE_RP_CAP_OFFSET +PCI_EXP_LNKCAP , value); +return 0 ; }
drivers/pci/controller/cadence/pcie-cadence.h +19 -0
@@ -115,6 +115,8 @@ struct cdns_pcie {* @quirk_detect_quiet_flag: LTSSM Detect Quiet min delay set as quirk * @ecam_supported: Whether the ECAM is supported * @no_inbound_map: Whether inbound mapping is supported +* @quirk_broken_aspm_l0s: Disable ASPM L0s support as quirk +* @quirk_broken_aspm_l1: Disable ASPM L1 support as quirk */ struct cdns_pcie_rc {struct cdns_pcie pcie;
@@ -127,6 +129,8 @@ struct cdns_pcie_rc { unsigned int quirk_detect_quiet_flag:1; unsigned int ecam_supported:1; unsigned int no_inbound_map:1; + unsigned int quirk_broken_aspm_l0s:1; + unsigned int quirk_broken_aspm_l1:1; };/**
@@ -338,6 +342,21 @@ static inline u16 cdns_pcie_rp_readw(struct cdns_pcie *pcie, u32 reg)return cdns_pcie_read_sz (addr,0x2 ); } +static inline void cdns_pcie_rp_writel (struct cdns_pcie *pcie, +u32 reg,u32 value) +{ +void __iomem *addr = pcie->reg_base +CDNS_PCIE_RP_BASE + reg; + +cdns_pcie_write_sz (addr,0x4 , value); +} + +static inline u32 cdns_pcie_rp_readl (struct cdns_pcie *pcie,u32 reg) +{ +void __iomem *addr = pcie->reg_base +CDNS_PCIE_RP_BASE + reg; + +return cdns_pcie_read_sz (addr,0x4 ); +} +static inline void cdns_pcie_hpa_rp_writeb (struct cdns_pcie *pcie,u32 reg,u8 value) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 431/1146 PCI: sg2042: Avoid L0s and L1 on Sophgo 2042 PCIe Root Ports
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yao Zi <[email protected]>
[ Upstream commit 988ef706cdd8a72e61dd90c0d0554eec4df7594a ]
Since commit f3ac2ff14834 ("PCI/ASPM: Enable all ClockPM and ASPM states for devicetree platforms") force enables ASPM on all device tree platforms, the SG2042 Root Ports are breaking as they advertise L0s and L1 capabilities without supporting them.
Set ASPM quirks to disable the L0s and L1 capabilities for the Root Ports so that these broken link states won't be enabled.
--- drivers/pci/controller/cadence/pcie-sg2042.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pci/controller/cadence/pcie-sg2042.c +2 -0
@@ -48,6 +48,8 @@ static int sg2042_pcie_probe(struct platform_device *pdev) bridge->child_ops = &sg2042_pcie_child_ops; rc =pci_host_bridge_priv (bridge); + rc->quirk_broken_aspm_l0s =1 ; + rc->quirk_broken_aspm_l1 =1 ; pcie = &rc->pcie; pcie->dev = dev;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 432/1146 ASoC: SDCA: Fix cleanup inversion in class driver
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Fitzgerald <[email protected]>
[ Upstream commit 7936490e04733ade80d0d445529c0a6de0f95515 ]
Fix inverted cleanup of the SoundWire IRQ and the function drivers that use it.
The devm cleanup function to call sdca_dev_unregister_functions() was being registered at the end of class_sdw_probe(). The bus core creates the parent SoundWire IRQ handler after class_sdw_probe() has returned, and it registers a devm cleanup handler at the same time.
This led to a cleanup inversion where the devm cleanup for the parent Soundwire IRQ runs before the handler that removes the function drivers. So the parent IRQ is destroyed before the function drivers had a chance to do any cleanup and remove their IRQ handlers.
Move the registrations of the function driver cleanup into class_boot_work() after the function drivers are registered, so that it runs before the cleanup of the parent SoundWire IRQ handler.
--- sound/soc/sdca/sdca_class.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-)
sound/soc/sdca/sdca_class.c +21 -13
@@ -137,6 +137,13 @@ static const struct regmap_config class_dev_regmap_config = { .unlock = class_regmap_unlock, }; +static void class_remove_functions (void *data) +{ +struct sdca_class_drv *drv = data; + +sdca_dev_unregister_functions (drv->sdw); +} +static void class_boot_work (struct work_struct *work) { struct sdca_class_drv *drv = container_of(work,
@@ -157,6 +164,11 @@ static void class_boot_work(struct work_struct *work)if (ret) goto err; +/* Ensure function drivers are removed before the IRQ is destroyed */ + ret =devm_add_action_or_reset (drv->dev, class_remove_functions, drv); +if (ret) + goto err; +dev_dbg (drv->dev,"boot work complete\n" );pm_runtime_mark_last_busy (drv->dev);
@@ -168,15 +180,6 @@ static void class_boot_work(struct work_struct *work)pm_runtime_put_sync (drv->dev); } -static void class_dev_remove (void *data) -{ -struct sdca_class_drv *drv = data; - -cancel_work_sync (&drv->boot_work); - -sdca_dev_unregister_functions (drv->sdw); -} -static int class_sdw_probe (struct sdw_slave *sdw,const struct sdw_device_id *id) {struct device *dev = &sdw->dev;
@@ -230,15 +233,19 @@ static int class_sdw_probe(struct sdw_slave *sdw, const struct sdw_device_id *idif (ret)return ret; - ret =devm_add_action_or_reset (dev, class_dev_remove, drv); -if (ret) -return ret; -queue_work (system_long_wq, &drv->boot_work);return 0 ; } +static void class_sdw_remove (struct sdw_slave *sdw) +{ +struct device *dev = &sdw->dev; +struct sdca_class_drv *drv =dev_get_drvdata (dev); + +cancel_work_sync (&drv->boot_work); +} +static int class_suspend (struct device *dev) {struct sdca_class_drv *drv =dev_get_drvdata (dev);
@@ -328,6 +335,7 @@ static struct sdw_driver class_sdw_driver = { }, .probe = class_sdw_probe, + .remove = class_sdw_remove, .id_table = class_sdw_id, .ops = &class_sdw_ops, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 433/1146 spi: rzv2h-rspi: Fix invalid SPR=0/BRDV=0 clock configuration
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lad Prabhakar <[email protected]>
[ Upstream commit 0335767dd8e7ade8a8e3028d08c4621515d47388 ]
The combination of SPR=0 and BRDV=0 results in the minimum division ratio of 2, producing the maximum possible bit rate for a given clock source. This combination is not supported in two cases:
- On RZ/G3E, RZ/G3L, RZ/V2H(P) and RZ/V2N, RSPI_n_TCLK is fixed at 200MHz, which would yield 100Mbps. The next hardware manual update will explicitly state that since the maximum frequency of the RSPICKn clock signal is 50MHz, settings with N=0 and n=0 resulting in 100Mbps are prohibited.
- On RZ/T2H and RZ/N2H, when PCLK (125MHz) is used as the clock source, SPR=0 and BRDV=0 is explicitly listed as unsupported in the hardware manual (Table 36.7).
Skip the SPR=0/BRDV=0 combination in rzv2h_rspi_find_rate_fixed() to prevent the driver from selecting an invalid clock configuration on the affected SoCs.
Additionally, remove the now redundant RSPI_SPBR_SPR_PCLK_MIN define which was previously set to 1 to work around the PCLK restriction, but was overly broad as it incorrectly blocked valid combinations such as SPR=0/BRDV=1 (31.25Mbps on PCLK=125MHz).
--- drivers/spi/spi-rzv2h-rspi.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/spi/spi-rzv2h-rspi.c +12 -6
@@ -50,7 +50,6 @@/* Register SPBR */ #define RSPI_SPBR_SPR_MIN 0 -#define RSPI_SPBR_SPR_PCLK_MIN 1#define RSPI_SPBR_SPR_MAX 255/* Register SPCMD */
@@ -533,6 +532,17 @@ static void rzv2h_rspi_find_rate_fixed(struct clk *clk, u32 hz,for (brdv =RSPI_SPCMD_BRDV_MIN ; brdv <=RSPI_SPCMD_BRDV_MAX ; brdv++) { spr =DIV_ROUND_UP (clk_rate, hz * (1 << (brdv +1 ))); spr--; +/* +* Skip SPR=0 and BRDV=0 as it is not a valid combination: +* - On RZ/G3E, RZ/G3L, RZ/V2H(P) and RZ/V2N, RSPI_n_TCLK is +* fixed at 200MHz and SPR=0 and BRDV=0 results in the maximum +* bit rate of 100Mbps which is prohibited. +* - On RZ/T2H and RZ/N2H, when PCLK (125MHz) is used as +* the clock source, SPR=0 and BRDV=0 is explicitly listed +* as unsupported in the hardware manual (Table 36.7). +*/ +if (!spr && !brdv) +continue ;if (spr >= spr_min && spr <= spr_max) goto clock_found; }
@@ -566,12 +576,8 @@ static u32 rzv2h_rspi_setup_clock(struct rzv2h_rspi_priv *rspi, u32 hz) rspi->info->find_tclk_rate (rspi->tclk, hz,RSPI_SPBR_SPR_MIN ,RSPI_SPBR_SPR_MAX , &best_clock); -/* -* T2H and N2H can also use PCLK as a source, which is 125MHz, but not -* when both SPR and BRDV are 0. -*/ if (best_clock.error && rspi->info->find_pclk_rate) - rspi->info->find_pclk_rate (rspi->pclk, hz,RSPI_SPBR_SPR_PCLK_MIN , + rspi->info->find_pclk_rate (rspi->pclk, hz,RSPI_SPBR_SPR_MIN ,RSPI_SPBR_SPR_MAX , &best_clock);if (!best_clock.clk_rate)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 434/1146 spi: mtk-snfi: unregister ECC engine on probe failure and remove() callback
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pei Xiao <[email protected]>
[ Upstream commit ab00febad191d7a4400aa1c3468279fb508258d4 ]
mtk_snand_probe() registers the on-host NAND ECC engine, but teardown was missing from both probe unwind and remove-time cleanup. Add a devm cleanup action after successful registration so nand_ecc_unregister_on_host_hw_engine() runs automatically on probe failures and during device removal.
--- drivers/spi/spi-mtk-snfi.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
drivers/spi/spi-mtk-snfi.c +14 -0
@@ -1303,6 +1303,13 @@ static const struct spi_controller_mem_caps mtk_snand_mem_caps = { .ecc = true, }; +static void mtk_unregister_ecc_engine (void *data) +{ +struct nand_ecc_engine *eng = data; + +nand_ecc_unregister_on_host_hw_engine (eng); +} +static irqreturn_t mtk_snand_irq (int irq,void *id) {struct mtk_snand *snf = id;
@@ -1443,6 +1450,13 @@ static int mtk_snand_probe(struct platform_device *pdev) goto release_ecc; } + ret =devm_add_action_or_reset (&pdev->dev, mtk_unregister_ecc_engine, + &ms->ecc_eng); +if (ret) { +dev_err_probe (&pdev->dev, ret,"failed to add ECC unregister action\n" ); + goto release_ecc; + } + ctlr->num_chipselect =1 ; ctlr->mem_ops = &mtk_snand_mem_ops; ctlr->mem_caps = &mtk_snand_mem_caps;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 435/1146 ALSA: sc6000: Keep the programmed board state in card-private data
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cássio Gabriel <[email protected]>
[ Upstream commit fb79bf127ac2577b4876132da6dba768018aad4c ]
The driver may auto-select IRQ and DMA resources at probe time, but sc6000_init_board() still derives the SC-6000 soft configuration from the module parameter arrays. When irq=auto or dma=auto is used, the codec is created with the selected resources while the board is programmed with the unresolved values.
Store the mapped ports and generated SC-6000 board configuration in card-private data, build that configuration from the live probe results instead of the raw module parameters, and keep the probe-time board programming in a shared helper.
This fixes the resource-programming mismatch and leaves the driver with a stable board-state block that can be reused by suspend/resume.
--- sound/isa/sc6000.c | 152 +++++++++++++++++++++++++++------------------ 1 file changed, 92 insertions(+), 60 deletions(-)
sound/isa/sc6000.c +92 -60
@@ -100,6 +100,15 @@ MODULE_PARM_DESC(joystick, "Enable gameport.");#define PFX "sc6000: "#define DRV_NAME "SC-6000" +struct snd_sc6000 { +char __iomem *vport; +char __iomem *vmss_port; +u8 mss_config; +u8 config; +u8 hw_cfg[2 ]; +bool old_dsp; +}; +/* hardware dependent functions */ /*
@@ -267,7 +276,7 @@ static int sc6000_dsp_reset(char __iomem *vport)/* detection and initialization */ static int sc6000_hw_cfg_write (struct device *devptr, -char __iomem *vport,const int *cfg) +char __iomem *vport,const u8 *cfg) {if (sc6000_write (devptr, vport,COMMAND_6C ) <0 ) {dev_warn (devptr,"CMD 0x%x: failed!\n" ,COMMAND_6C );
@@ -353,8 +362,7 @@ static int sc6000_init_mss(struct device *devptr,return 0 ; } -static void sc6000_hw_cfg_encode (struct device *devptr, -char __iomem *vport,int *cfg, +static void sc6000_hw_cfg_encode (struct device *devptr,u8 *cfg,long xport,long xmpu,long xmss_port,int joystick) {
@@ -376,27 +384,83 @@ static void sc6000_hw_cfg_encode(struct device *devptr,dev_dbg (devptr,"hw cfg %x, %x\n" , cfg[0 ], cfg[1 ]); } -static int sc6000_init_board (struct device *devptr, -char __iomem *vport, -char __iomem *vmss_port,int dev) +static void sc6000_prepare_board (struct device *devptr, +struct snd_sc6000 *sc6000, +unsigned int dev,int xirq,int xdma) +{ + sc6000->mss_config =sc6000_irq_to_softcfg (xirq) | +sc6000_dma_to_softcfg (xdma); + sc6000->config = sc6000->mss_config | +sc6000_mpu_irq_to_softcfg (mpu_irq[dev]); +sc6000_hw_cfg_encode (devptr, sc6000->hw_cfg, port[dev], mpu_port[dev], + mss_port[dev], joystick[dev]); +} + +static void sc6000_detect_old_dsp (struct device *devptr, +struct snd_sc6000 *sc6000) +{ +sc6000_write (devptr, sc6000->vport,COMMAND_5C ); + sc6000->old_dsp =sc6000_read (sc6000->vport) <0 ; +} + +static int sc6000_program_board (struct device *devptr, +struct snd_sc6000 *sc6000) +{ +int err; + +if (!sc6000->old_dsp) { +if (sc6000_hw_cfg_write (devptr, sc6000->vport, + sc6000->hw_cfg) <0 ) { +dev_err (devptr,"sc6000_hw_cfg_write: failed!\n" ); +return -EIO ; + } + } + + err =sc6000_setup_board (devptr, sc6000->vport, sc6000->config); +if (err <0 ) { +dev_err (devptr,"sc6000_setup_board: failed!\n" ); +return -ENODEV ; + } + +sc6000_dsp_reset (sc6000->vport); + +if (!sc6000->old_dsp) { +sc6000_write (devptr, sc6000->vport,COMMAND_60 ); +sc6000_write (devptr, sc6000->vport,0x02 ); +sc6000_dsp_reset (sc6000->vport); + } + + err =sc6000_setup_board (devptr, sc6000->vport, sc6000->config); +if (err <0 ) { +dev_err (devptr,"sc6000_setup_board: failed!\n" ); +return -ENODEV ; + } + + err =sc6000_init_mss (devptr, sc6000->vport, sc6000->config, + sc6000->vmss_port, sc6000->mss_config); +if (err <0 ) { +dev_err (devptr,"Cannot initialize Microsoft Sound System mode.\n" ); +return -ENODEV ; + } + +return 0 ; +} + +static int sc6000_init_board (struct device *devptr,struct snd_sc6000 *sc6000) {char answer[15 ];char version[2 ]; -int mss_config =sc6000_irq_to_softcfg (irq[dev]) | -sc6000_dma_to_softcfg (dma[dev]); -int config = mss_config | -sc6000_mpu_irq_to_softcfg (mpu_irq[dev]);int err; -int old =0 ; - err =sc6000_dsp_reset (vport); + err =sc6000_dsp_reset (sc6000->vport);if (err <0 ) {dev_err (devptr,"sc6000_dsp_reset: failed!\n" );return err; }memset (answer,0 ,sizeof (answer)); - err =sc6000_dsp_get_answer (devptr, vport,GET_DSP_COPYRIGHT , answer,15 ); + err =sc6000_dsp_get_answer (devptr, sc6000->vport,GET_DSP_COPYRIGHT , + answer,15 );if (err <=0 ) {dev_err (devptr,"sc6000_dsp_copyright: failed!\n" );return -ENODEV ;
@@ -408,54 +472,17 @@ static int sc6000_init_board(struct device *devptr,if (strncmp ("SC-6000" , answer,7 ))dev_warn (devptr,"Warning: non SC-6000 audio card!\n" ); -if (sc6000_dsp_get_answer (devptr, vport,GET_DSP_VERSION , version,2 ) <2 ) { +if (sc6000_dsp_get_answer (devptr, sc6000->vport, +GET_DSP_VERSION , version,2 ) <2 ) {dev_err (devptr,"sc6000_dsp_version: failed!\n" );return -ENODEV ; }dev_info (devptr,"Detected model: %s, DSP version %d.%d\n" , answer, version[0 ], version[1 ]); -/* set configuration */ -sc6000_write (devptr, vport,COMMAND_5C ); -if (sc6000_read (vport) <0 ) - old =1 ; - -if (!old) { -int cfg[2 ]; -sc6000_hw_cfg_encode (devptr, - vport, &cfg[0 ], port[dev], mpu_port[dev], - mss_port[dev], joystick[dev]); -if (sc6000_hw_cfg_write (devptr, vport, cfg) <0 ) { -dev_err (devptr,"sc6000_hw_cfg_write: failed!\n" ); -return -EIO ; - } - } - err =sc6000_setup_board (devptr, vport, config); -if (err <0 ) { -dev_err (devptr,"sc6000_setup_board: failed!\n" ); -return -ENODEV ; - } - -sc6000_dsp_reset (vport); - -if (!old) { -sc6000_write (devptr, vport,COMMAND_60 ); -sc6000_write (devptr, vport,0x02 ); -sc6000_dsp_reset (vport); - } +sc6000_detect_old_dsp (devptr, sc6000); - err =sc6000_setup_board (devptr, vport, config); -if (err <0 ) { -dev_err (devptr,"sc6000_setup_board: failed!\n" ); -return -ENODEV ; - } - err =sc6000_init_mss (devptr, vport, config, vmss_port, mss_config); -if (err <0 ) { -dev_err (devptr,"Cannot initialize Microsoft Sound System mode.\n" ); -return -ENODEV ; - } - -return 0 ; +return sc6000_program_board (devptr, sc6000); }static int snd_sc6000_mixer (struct snd_wss *chip)
@@ -538,10 +565,10 @@ static int snd_sc6000_match(struct device *devptr, unsigned int dev)static void snd_sc6000_free (struct snd_card *card) { -char __iomem *vport = (char __force __iomem *)card->private_data; +struct snd_sc6000 *sc6000 = card->private_data; -if (vport) -sc6000_setup_board (card->dev, vport,0 ); +if (sc6000->vport) +sc6000_setup_board (card->dev, sc6000->vport,0 ); }static int __snd_sc6000_probe (struct device *devptr,unsigned int dev)
@@ -552,15 +579,17 @@ static int __snd_sc6000_probe(struct device *devptr, unsigned int dev)int xirq = irq[dev];int xdma = dma[dev];struct snd_card *card; +struct snd_sc6000 *sc6000;struct snd_wss *chip;struct snd_opl3 *opl3;char __iomem *vport;char __iomem *vmss_port; err =snd_devm_card_new (devptr, index[dev], id[dev],THIS_MODULE , -0 , &card); +sizeof (*sc6000), &card);if (err <0 )return err; + sc6000 = card->private_data;if (xirq ==SNDRV_AUTO_IRQ ) { xirq =snd_legacy_find_free_irq (possible_irqs);
@@ -587,7 +616,7 @@ static int __snd_sc6000_probe(struct device *devptr, unsigned int dev)dev_err (devptr,"I/O port cannot be iomapped.\n" );return -EBUSY ; } - card->private_data = (void __force *)vport; + sc6000->vport = vport;/* to make it marked as used */ if (!devm_request_region (devptr, mss_port[dev],4 ,DRV_NAME )) {
@@ -600,12 +629,15 @@ static int __snd_sc6000_probe(struct device *devptr, unsigned int dev)dev_err (devptr,"MSS port I/O cannot be iomapped.\n" );return -EBUSY ; } + sc6000->vmss_port = vmss_port;dev_dbg (devptr,"Initializing BASE[0x%lx] IRQ[%d] DMA[%d] MIRQ[%d]\n" , port[dev], xirq, xdma, mpu_irq[dev] ==SNDRV_AUTO_IRQ ?0 : mpu_irq[dev]); - err =sc6000_init_board (devptr, vport, vmss_port, dev); +sc6000_prepare_board (devptr, sc6000, dev, xirq, xdma); + + err =sc6000_init_board (devptr, sc6000);if (err <0 )return err; card->private_free = snd_sc6000_free;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 436/1146 dm cache: fix missing return in invalidate_committeds error path
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming-Hung Tsai <[email protected]>
[ Upstream commit 8c0ee19db81f0fa1ff25fd75b22b17c0cc2acde3 ]
In passthrough mode, dm-cache defers write submission until after metadata commit completes via the invalidate_committed() continuation. On commit error, invalidate_committed() calls invalidate_complete() to end the bio and free the migration struct, after which it should return immediately.
The patch 4ca8b8bd952d ("dm cache: fix write hang in passthrough mode") omitted this early return, causing execution to fall through into the success path on error. This results in use-after-free on the migration struct in the subsequent calls.
Fix by adding the missing return after the invalidate_complete() call.
--- drivers/md/dm-cache-target.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/md/dm-cache-target.c +3 -1
@@ -1521,8 +1521,10 @@ static void invalidate_committed(struct work_struct *ws)struct bio *bio = mg->overwrite_bio;struct per_bio_data *pb =get_per_bio_data (bio); -if (mg->k.input) +if (mg->k.input) {invalidate_complete (mg, false); +return ; + }init_continuation (&mg->k, invalidate_completed);remap_to_origin_clear_discard (cache, bio, mg->invalidate_oblock);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 437/1146 sched_ext: Track @ps rq lock across set_cpus_allowed_scx -> ops.set_cpumask
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
[ Upstream commit 9fb457074f6d118b30458624223abef985725a88 ]
The SCX_CALL_OP_TASK call site passes rq=NULL incorrectly, leaving scx_locked_rq() unset. Pass task_rq(p) instead so update_locked_rq() reflects reality.
v2: Add Fixes: tag (Andrea Righi).
--- kernel/sched/ext.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/ext.c +1 -1
@@ -2742,7 +2742,7 @@ static void set_cpus_allowed_scx(struct task_struct *p,* designation pointless. Cast it away when calling the operation. */ if (SCX_HAS_OP (sch, set_cpumask)) -SCX_CALL_OP_TASK (sch,SCX_KF_REST , set_cpumask,NULL , +SCX_CALL_OP_TASK (sch,SCX_KF_REST , set_cpumask,task_rq (p), p, (struct cpumask *)p->cpus_ptr); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 438/1146 sched_ext: Fix ops.cgroup_move() invocation kf_mask and rq tracking
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
[ Upstream commit b470e37c1fad72731be6f437e233cb6b16618f41 ]
sched_move_task() invokes ops.cgroup_move() inside task_rq_lock(tsk), so @p's rq lock is held. The SCX_CALL_OP_TASK invocation mislabels this:
- kf_mask = SCX_KF_UNLOCKED (== 0), claiming no lock is held.
- rq = NULL, so update_locked_rq() doesn't run and scx_locked_rq() returns NULL.
Switch to SCX_KF_REST and pass task_rq(p), matching ops.set_cpumask() from set_cpus_allowed_scx().
Three effects:
- scx_bpf_task_cgroup() becomes callable (was rejected by scx_kf_allowed(__SCX_KF_RQ_LOCKED)). Safe; rq lock is held.
- scx_bpf_dsq_move() is now rejected (was allowed via the unlocked branch). Calling it while holding an unrelated task's rq lock is risky; rejection is correct.
- scx_bpf_select_cpu_*() previously took the unlocked branch in select_cpu_from_kfunc() and called task_rq_lock(p, &rf), which would deadlock against the already-held pi_lock. Now it takes the locked-rq branch and is rejected with -EPERM via the existing kf_allowed(SCX_KF_SELECT_CPU | SCX_KF_ENQUEUE) check. Latent deadlock fix.
No in-tree scheduler is known to call any of these from ops.cgroup_move().
v2: Add Fixes: tag (Andrea Righi).
--- kernel/sched/ext.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/ext.c +1 -1
@@ -3406,7 +3406,7 @@ void scx_cgroup_move_task(struct task_struct *p)*/ if (SCX_HAS_OP (sch, cgroup_move) && !WARN_ON_ONCE (!p->scx.cgrp_moving_from)) -SCX_CALL_OP_TASK (sch,SCX_KF_UNLOCKED , cgroup_move,NULL , +SCX_CALL_OP_TASK (sch,SCX_KF_REST , cgroup_move,task_rq (p), p, p->scx.cgrp_moving_from,tg_cgrp (task_group (p))); p->scx.cgrp_moving_from =NULL ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 439/1146 spi: cadence-qspi: Revert the filtering of certain opcodes in ODTR
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miquel Raynal <[email protected]>
[ Upstream commit 5e75c1d4d386fb7d64e2b19355e4d38dd4fd8845 ]
I got mislead while analyzing the driver by the fact that the second opcode byte was in all cases smashed:
if (op->cmd.dtr)
opcode = op->cmd.opcode >> 8;
else
opcode = op->cmd.opcode;While at a first glance this doesn't let a chance to the second byte to be shifted out on the bus, this is actually the second step of an initialization, where the byte being apparently "ignored" in DTR mode has already been written in a dedicated "extended opcode" register. As such, the comment and the extra check that I proposed were entirely wrong, remove them.
--- drivers/spi/spi-cadence-quadspi.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/spi/spi-cadence-quadspi.c +0 -4
@@ -1544,10 +1544,6 @@ static bool cqspi_supports_mem_op(struct spi_mem *mem,if (op->data.nbytes && op->data.buswidth !=8 )return false; -/* A single opcode is supported, it will be repeated */ -if ((op->cmd.opcode >>8 ) != (op->cmd.opcode &0xFF )) -return false; -if (cqspi->is_rzn1)return false; }else if (!all_false) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 440/1146 crypto: jitterentropy - replace long-held spinlock with mutex
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haixin Xu <[email protected]>
[ Upstream commit 01d798e9feb30212952d4e992801ba6bd6a82351 ]
jent_kcapi_random() serializes the shared jitterentropy state, but it currently holds a spinlock across the jent_read_entropy() call. That path performs expensive jitter collection and SHA3 conditioning, so parallel readers can trigger stalls as contending waiters spin for the same lock.
To prevent non-preemptible lock hold, replace rng->jent_lock with a mutex so contended readers sleep instead of spinning on a shared lock held across expensive entropy generation.
--- crypto/jitterentropy-kcapi.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
crypto/jitterentropy-kcapi.c +7 -7
@@ -42,6 +42,7 @@#include <linux/fips.h> #include <linux/kernel.h> #include <linux/module.h> +#include <linux/mutex.h> #include <linux/slab.h> #include <linux/time.h> #include <crypto/internal/rng.h>
@@ -193,7 +194,7 @@ int jent_read_random_block(void *hash_state, char *dst, unsigned int dst_len)***************************************************************************/ struct jitterentropy { -spinlock_t jent_lock; +struct mutex jent_lock;struct rand_data *entropy_collector;struct crypto_shash *tfm;struct shash_desc *sdesc;
@@ -203,7 +204,7 @@ static void jent_kcapi_cleanup(struct crypto_tfm *tfm) {struct jitterentropy *rng =crypto_tfm_ctx (tfm); -spin_lock (&rng->jent_lock); +mutex_lock (&rng->jent_lock);if (rng->sdesc) {shash_desc_zero (rng->sdesc);
@@ -218,7 +219,7 @@ static void jent_kcapi_cleanup(struct crypto_tfm *tfm)if (rng->entropy_collector)jent_entropy_collector_free (rng->entropy_collector); rng->entropy_collector =NULL ; -spin_unlock (&rng->jent_lock); +mutex_unlock (&rng->jent_lock); }static int jent_kcapi_init (struct crypto_tfm *tfm)
@@ -228,7 +229,7 @@ static int jent_kcapi_init(struct crypto_tfm *tfm)struct shash_desc *sdesc;int size, ret =0 ; -spin_lock_init (&rng->jent_lock); +mutex_init (&rng->jent_lock);/* Use SHA3-256 as conditioner */ hash =crypto_alloc_shash (JENT_CONDITIONING_HASH ,0 ,0 );
@@ -257,7 +258,6 @@ static int jent_kcapi_init(struct crypto_tfm *tfm) goto err; } -spin_lock_init (&rng->jent_lock);return 0 ; err:
@@ -272,7 +272,7 @@ static int jent_kcapi_random(struct crypto_rng *tfm,struct jitterentropy *rng =crypto_rng_ctx (tfm);int ret =0 ; -spin_lock (&rng->jent_lock); +mutex_lock (&rng->jent_lock); ret =jent_read_entropy (rng->entropy_collector, rdata, dlen);
@@ -298,7 +298,7 @@ static int jent_kcapi_random(struct crypto_rng *tfm, ret = -EINVAL ; } -spin_unlock (&rng->jent_lock); +mutex_unlock (&rng->jent_lock);return ret; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 441/1146 ALSA: usb-audio: Exclude Scarlett 18i20 1st Gen from SKIP_IFACE_SETUP
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit a47306a74c31557b1e5cab54642950bbb20294cb ]
Same issue as the other 1st Gen Scarletts: QUIRK_FLAG_SKIP_IFACE_SETUP causes distorted audio on the Scarlett 18i20 1st Gen (1235:800c).
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -2435,6 +2435,7 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_VALIDATE_RATES),DEVICE_FLG (0x1235 ,0x8006 ,0 ),/* Focusrite Scarlett 2i2 1st Gen */ DEVICE_FLG (0x1235 ,0x800a ,0 ),/* Focusrite Scarlett 2i4 1st Gen */ +DEVICE_FLG (0x1235 ,0x800c ,0 ),/* Focusrite Scarlett 18i20 1st Gen */ DEVICE_FLG (0x1235 ,0x8016 ,0 ),/* Focusrite Scarlett 2i2 1st Gen */ DEVICE_FLG (0x1235 ,0x801c ,0 ),/* Focusrite Scarlett Solo 1st Gen */ VENDOR_FLG(0x1235, /* Focusrite Novation */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 442/1146 ALSA: hda/realtek - fixed speaker no sound update
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
[ Upstream commit 46c862f5419e0a86b60b9f9558d247f6084c99f9 ]
Fixed speaker has pop noise on Lenovo Thinkpad X11 Carbon Gen 12.
--- sound/hda/codecs/realtek/alc269.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)
sound/hda/codecs/realtek/alc269.c +5 -11
@@ -3674,22 +3674,11 @@ static void alc287_alc1318_playback_pcm_hook(struct hda_pcm_stream *hinfo, struct snd_pcm_substream *substream, int action) { -static const struct coef_fw dis_coefs[] = { -WRITE_COEF (0x24 ,0x0013 ),WRITE_COEF (0x25 ,0x0000 ),WRITE_COEF (0x26 ,0xC203 ), -WRITE_COEF (0x28 ,0x0004 ),WRITE_COEF (0x29 ,0xb023 ), - };/* Disable AMP silence detection */ -static const struct coef_fw en_coefs[] = { -WRITE_COEF (0x24 ,0x0013 ),WRITE_COEF (0x25 ,0x0000 ),WRITE_COEF (0x26 ,0xC203 ), -WRITE_COEF (0x28 ,0x0084 ),WRITE_COEF (0x29 ,0xb023 ), - };/* Enable AMP silence detection */ - switch (action) {case HDA_GEN_PCM_ACT_OPEN : -alc_process_coef_fw (codec, dis_coefs);alc_write_coefex_idx (codec,0x5a ,0x00 ,0x954f );/* write gpio3 to high */ break ;case HDA_GEN_PCM_ACT_CLOSE : -alc_process_coef_fw (codec, en_coefs);alc_write_coefex_idx (codec,0x5a ,0x00 ,0x554f );/* write gpio3 as default value */ break ; }
@@ -3712,10 +3701,15 @@ static void alc287_fixup_lenovo_thinkpad_with_alc1318(struct hda_codec *codec,WRITE_COEF (0x24 ,0x0013 ),WRITE_COEF (0x25 ,0x0000 ),WRITE_COEF (0x26 ,0xC301 ), WRITE_COEF(0x28, 0x0001), WRITE_COEF(0x29, 0xb023), }; +static const struct coef_fw dis_coefs[] = { +WRITE_COEF (0x24 ,0x0013 ),WRITE_COEF (0x25 ,0x0000 ),WRITE_COEF (0x26 ,0xC203 ), +WRITE_COEF (0x28 ,0x0004 ),WRITE_COEF (0x29 ,0xb023 ), + };/* Disable AMP silence detection */ if (action !=HDA_FIXUP_ACT_PRE_PROBE )return ;alc_update_coef_idx (codec,0x10 ,1 <<11 ,1 <<11 ); +alc_process_coef_fw (codec, dis_coefs);alc_process_coef_fw (codec, coefs); spec->power_hook = alc287_s4_power_gpio3_default; spec->gen.pcm_playback_hook = alc287_alc1318_playback_pcm_hook;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 443/1146 gfs2: Call unlock_new_inode before d_instantiate
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Gruenbacher <[email protected]>
[ Upstream commit 2ff7cf7e0640ff071ebc5c7e3dc2df024a7c91e6 ]
As Neil Brown describes in detail in the link referenced below, new inodes must be unlocked before they can be instantiated.
An even better fix is to use d_instantiate_new(), which combines d_instantiate() and unlock_new_inode().
--- fs/gfs2/inode.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/gfs2/inode.c +1 -2
@@ -892,7 +892,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, goto fail_gunlock4;mark_inode_dirty (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);/* After instantiate, errors should result in evict which will destroy * both inode and iopen glocks properly. */ if (file) {
@@ -904,7 +904,6 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,gfs2_glock_dq_uninit (&gh);gfs2_glock_put (io_gl);gfs2_qa_put (dip); -unlock_new_inode (inode);return error; fail_gunlock4:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 444/1146 fanotify: avoid/silence premature LSM capability checks
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ondrej Mosnacek <[email protected]>
[ Upstream commit 0d5ee3373426395478c355f3e93ba4b1118a04e9 ]
Make sure calling capable()/ns_capable() actually leads to access denied when false is returned, because these functions emit an audit record when a Linux Security Module denies the capability, which makes it difficult to avoid allowing/silencing unnecessary permissions in security policies (namely with SELinux).
Where the return value just used to set a flag, use the non-auditing ns_capable_noaudit() instead.
--- fs/notify/fanotify/fanotify_user.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-)
fs/notify/fanotify/fanotify_user.c +13 -12
@@ -1615,17 +1615,18 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags)pr_debug ("%s: flags=%x event_f_flags=%x\n" , __func__, flags, event_f_flags); -if (!capable (CAP_SYS_ADMIN )) { -/* -* An unprivileged user can setup an fanotify group with -* limited functionality - an unprivileged group is limited to -* notification events with file handles or mount ids and it -* cannot use unlimited queue/marks. -*/ -if ((flags &FANOTIFY_ADMIN_INIT_FLAGS ) || - !(flags & (FANOTIFY_FID_BITS |FAN_REPORT_MNT ))) -return -EPERM ; +/* +* An unprivileged user can setup an fanotify group with limited +* functionality - an unprivileged group is limited to notification +* events with file handles or mount ids and it cannot use unlimited +* queue/marks. +*/ +if (((flags &FANOTIFY_ADMIN_INIT_FLAGS ) || + !(flags & (FANOTIFY_FID_BITS |FAN_REPORT_MNT ))) && + !capable (CAP_SYS_ADMIN )) +return -EPERM ; +if (!ns_capable_noaudit (&init_user_ns,CAP_SYS_ADMIN )) {/* * Setting the internal flag FANOTIFY_UNPRIV on the group * prevents setting mount/filesystem marks on this group and
@@ -1990,8 +1991,8 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,* A user is allowed to setup sb/mount/mntns marks only if it is * capable in the user ns where the group was created. */ -if (!ns_capable (group->user_ns,CAP_SYS_ADMIN ) && - mark_type !=FAN_MARK_INODE ) +if (mark_type !=FAN_MARK_INODE && + !ns_capable (group->user_ns,CAP_SYS_ADMIN ))return -EPERM ;/*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 445/1146 fanotify: call fanotify_events_supported() before path_permission() and security_path_notify()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ondrej Mosnacek <[email protected]>
[ Upstream commit 66052a768d4726a31e939b5ac902f2b0b452c8d5 ]
The latter trigger LSM (e.g. SELinux) checks, which will log a denial when permission is denied, so it's better to do them after validity checks to avoid logging a denial when the operation would fail anyway.
--- fs/notify/fanotify/fanotify_user.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-)
fs/notify/fanotify/fanotify_user.c +10 -15
@@ -1210,6 +1210,7 @@ static int fanotify_find_path(int dfd, const char __user *filename, *path =fd_file (f)->f_path;path_get (path); + ret =0 ; }else {unsigned int lookup_flags =0 ;
@@ -1219,22 +1220,7 @@ static int fanotify_find_path(int dfd, const char __user *filename, lookup_flags |=LOOKUP_DIRECTORY ; ret =user_path_at (dfd, filename, lookup_flags, path); -if (ret) - goto out; } - -/* you can only watch an inode if you have read permissions on it */ - ret =path_permission (path,MAY_READ ); -if (ret) { -path_put (path); - goto out; - } - - ret =security_path_notify (path, mask, obj_type); -if (ret) -path_put (path); - -out:return ret; }
@@ -2058,6 +2044,15 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, goto path_put_and_out; } +/* you can only watch an inode if you have read permissions on it */ + ret =path_permission (&path,MAY_READ ); +if (ret) + goto path_put_and_out; + + ret =security_path_notify (&path, mask, obj_type); +if (ret) + goto path_put_and_out; +if (fid_mode) { ret =fanotify_test_fsid (path.dentry, flags, &__fsid);if (ret)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 446/1146 fuse: fix premature writetrhough request for large folio
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jingbo Xu <[email protected]>
[ Upstream commit 5223e0470e7bb7910038fe3d31171490e00fbbb9 ]
When large folio is enabled and the initial folio offset exceeds PAGE_SIZE, e.g. the position resides in the second page of a large folio, after the folio copying the offset (in the page) won't be updated to 0 even though the expected range is successfully copied until the end of the folio. In this case fuse_fill_write_pages() exits prematurelly before the request has reached the max_write/max_pages limit.
Fix this by eliminating page offset entirely and use folio offset instead.
--- fs/fuse/file.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
fs/fuse/file.c +4 -6
@@ -1242,7 +1242,6 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, {struct fuse_args_pages *ap = &ia->ap;struct fuse_conn *fc =get_fuse_conn (mapping->host); -unsigned offset = pos & (PAGE_SIZE -1 );size_t count =0 ;unsigned int num;int err =0 ;
@@ -1269,7 +1268,7 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,if (mapping_writably_mapped (mapping))flush_dcache_folio (folio); - folio_offset = ((index - folio->index) <<PAGE_SHIFT ) + offset; + folio_offset =offset_in_folio (folio, pos); bytes =min (folio_size (folio) - folio_offset, num); tmp =copy_folio_from_iter_atomic (folio, folio_offset, bytes, ii);
@@ -1299,9 +1298,6 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, count += tmp; pos += tmp; num -= tmp; - offset += tmp; -if (offset ==folio_size (folio)) - offset =0 ;/* If we copied full folio, mark it uptodate */ if (tmp ==folio_size (folio))
@@ -1313,7 +1309,9 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, ia->write.folio_locked = true;break ; } -if (!fc->big_writes || offset !=0 ) +if (!fc->big_writes) +break ; +if (folio_offset + tmp !=folio_size (folio))break ; }
Signature · 1 line
2.53.0
Re: [PATCH 7.0 0446/1146] fuse: fix premature writetrhough request for large folio
Quoted 2 lines · Greg Kroah-Hartman
7.0-stable review patch. If anyone has any objections, please let me know.
I don't think this is needed for 7.0-stable or 6.18-stable as the bug isn't triggerable until large folios are enabled, which fuse doesn't support yet [1].
Thanks,
Joanne
[1] https://lore.kernel.org/linux-fsdevel/[email protected]/#t
Quoted 74 lines
------------------
From: Jingbo Xu <[email protected]>
[ Upstream commit
5223e0470e7bb7910038fe3d31171490e00fbbb9]When large folio is enabled and the initial folio offset exceeds
PAGE_SIZE, e.g. the position resides in the second page of a large folio, after the folio copying the offset (in the page) won't be updated to 0 even though the expected range is successfully copied until the end of the folio. In this casefuse_fill_write_pages()exits prematurelly before the request has reached the max_write/max_pages limit.Fix this by eliminating page offset entirely and use folio offset instead.
Fixes d60a6015e1a2 ("fuse: support large folios for writethrough writes")Reviewed-by Horst Birthelmer <[email protected]>Reviewed-by Joanne Koong <[email protected]>Signed-off-by Jingbo Xu <[email protected]>Signed-off-by Miklos Szeredi <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/fuse/file.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)fs/fuse/file.c +4
-7@@ -1242,7 +1242,6 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, {struct fuse_args_pages *ap = &ia->ap;struct fuse_conn *fc =get_fuse_conn (mapping->host); -unsigned offset = pos & (PAGE_SIZE -1 );size_t count =0 ;unsigned int num;int err =0 ;@@ -1269,7 +1268,7 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,if (mapping_writably_mapped (mapping))flush_dcache_folio (folio); - folio_offset = ((index - folio->index) <<PAGE_SHIFT ) + offset; + folio_offset =offset_in_folio (folio, pos); bytes =min (folio_size (folio) - folio_offset, num); tmp =copy_folio_from_iter_atomic (folio, folio_offset, bytes, ii);@@ -1299,9 +1298,6 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, count += tmp; pos += tmp; num -= tmp; - offset += tmp; -if (offset ==folio_size (folio)) - offset =0 ;/* If we copied full folio, mark it uptodate */ if (tmp ==folio_size (folio))@@ -1313,7 +1309,9 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, ia->write.folio_locked = true;break ; } -if (!fc->big_writes || offset !=0 ) +if (!fc->big_writes) +break ; +if (folio_offset + tmp !=folio_size (folio))break ; } --2.53.0
Sasha Levin
maintainerRe: [PATCH 7.0 0446/1146] fuse: fix premature writetrhough request for large folio
Quoted 3 lines · Joanne Koong
I don't think this is needed for 7.0-stable or 6.18-stable as the bug isn't triggerable until large folios are enabled, which fuse doesn't support yet [1].
Dropped from the 7.0 and 6.18 queues, thanks.
--
Thanks,
Sasha
Greg Kroah-Hartman
maintainerPATCH 447/1146 fuse: fix uninit-value in fuse_dentry_revalidate()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luis Henriques <[email protected]>
[ Upstream commit 5a6baf204610589f8a5b5a1cd69d1fe661d9d3cd ]
fuse_dentry_revalidate() may be called with a dentry that didn't had ->d_time initialised. The issue was found with KMSAN, where lookup_open() calls __d_alloc(), followed by d_revalidate(), as shown below:
=====================================================
BUG: KMSAN: uninit-value in fuse_dentry_revalidate+0x150/0x13d0 fs/fuse/dir.c:394 fuse_dentry_revalidate+0x150/0x13d0 fs/fuse/dir.c:394 d_revalidate fs/namei.c:1030 [inline] lookup_open fs/namei.c:4405 [inline] open_last_lookups fs/namei.c:4583 [inline] path_openat+0x1614/0x64c0 fs/namei.c:4827 do_file_open+0x2aa/0x680 fs/namei.c:4859
[...]
Uninit was created at:
slab_post_alloc_hook mm/slub.c:4466 [inline] slab_alloc_node mm/slub.c:4788 [inline] kmem_cache_alloc_lru_noprof+0x382/0x1280 mm/slub.c:4807 __d_alloc+0x55/0xa00 fs/dcache.c:1740 d_alloc_parallel+0x99/0x2740 fs/dcache.c:2604 lookup_open fs/namei.c:4398 [inline] open_last_lookups fs/namei.c:4583 [inline] path_openat+0x135f/0x64c0 fs/namei.c:4827 do_file_open+0x2aa/0x680 fs/namei.c:4859
[...]
=====================================================
--- fs/fuse/dir.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/fuse/dir.c +5 -0
@@ -481,6 +481,11 @@ static int fuse_dentry_init(struct dentry *dentry) fd->dentry = dentry;RB_CLEAR_NODE (&fd->node); dentry->d_fsdata = fd; +/* +* Initialising d_time (epoch) to '0' ensures the dentry is invalid +* if compared to fc->epoch, which is initialized to '1'. +*/ + dentry->d_time =0 ;return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 448/1146 ktest: Avoid undef warning when WARNINGS_FILE is unset
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo B. Marlière <[email protected]>
[ Upstream commit 057854f8a595160656fe77ed7bf0d2403724b915 ]
check_buildlog() probes $warnings_file with -f even when WARNINGS_FILE is not configured. Perl warns about the uninitialized value and adds noise to the test log, which can hide the output we actually care about.
Check that WARNINGS_FILE is defined before testing whether the file exists.
--- tools/testing/ktest/ktest.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/ktest/ktest.pl +1 -1
@@ -2508,7 +2508,7 @@ sub check_buildlog { my $save_no_reboot = $no_reboot; $no_reboot = 1; - if (-f $warnings_file) { + if (defined($warnings_file) && -f $warnings_file) { open(IN, $warnings_file) or dodie "Error opening $warnings_file";
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 449/1146 ktest: Honor empty per-test option overrides
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo B. Marlière <[email protected]>
[ Upstream commit a2de57a3c8192dcd67cccaff6c341b93748d799b ]
A per-test override can clear an inherited default option by assigning an empty value, but __set_test_option() still used option_defined() to decide whether a per-test key existed. That turned an empty per-test assignment back into "fall back to the default", so tests still could not clear inherited settings.
For example:
DEFAULTS
(...)
LOG_FILE = /tmp/ktest-empty-override.log
CLEAR_LOG = 1
ADD_CONFIG = /tmp/.config
TEST_START
TEST_TYPE = build
BUILD_TYPE = nobuild
ADD_CONFIG =
This would run the test with ADD_CONFIG[1] = /tmp/.config
Fix by checking whether the per-test key exists before falling back. If it does exist but is empty, treat it as unset for that test and stop the fallback chain there.
--- tools/testing/ktest/ktest.pl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
tools/testing/ktest/ktest.pl +4 -2
@@ -4183,7 +4183,8 @@ sub __set_test_option { my $option = "$name\[$i\]"; - if (option_defined($option)) { + if (exists($opt{$option})) { + return undef if (!option_defined($option)); return $opt{$option}; }
@@ -4191,7 +4192,8 @@ sub __set_test_option { if ($i >= $test && $i < $test + $repeat_tests{$test}) { $option = "$name\[$test\]"; - if (option_defined($option)) { + if (exists($opt{$option})) { + return undef if (!option_defined($option)); return $opt{$option}; } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 450/1146 ktest: Run POST_KTEST hooks on failure and cancellation
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo B. Marlière <[email protected]>
[ Upstream commit bc6e165a452da909cef0efbc286e6695624db372 ]
PRE_KTEST can be useful for setting up the environment and POST_KTEST to tear it down, however POST_KTEST only runs on the normal end-of-run path. It is skipped when ktest exits through dodie() or cancel_test(). Final cleanup hooks are skipped.
Factor the final hook execution into run_post_ktest(), call it from the normal exit path and from the early exit paths, and guard it so the hook runs at most once.
--- tools/testing/ktest/ktest.pl | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-)
tools/testing/ktest/ktest.pl +22 -5
@@ -100,6 +100,7 @@ my $test_type; my $build_type; my $build_options; my $final_post_ktest; +my $post_ktest_done = 0; my $pre_ktest; my $post_ktest; my $pre_test;
@@ -1575,6 +1576,24 @@ sub get_test_name() { return $name; } +sub run_post_ktest { + my $cmd; + + return if ($post_ktest_done); + + if (defined($final_post_ktest)) { + $cmd = $final_post_ktest; + } elsif (defined($post_ktest)) { + $cmd = $post_ktest; + } else { + return; + } + + my $cp_post_ktest = eval_kernel_version($cmd); + run_command $cp_post_ktest; + $post_ktest_done = 1; +} + sub dodie { # avoid recursion return if ($in_die);
@@ -1634,6 +1653,7 @@ sub dodie { if (defined($post_test)) { run_command $post_test; } + run_post_ktest; die @_, "\n"; }
@@ -4300,6 +4320,7 @@ sub cancel_test { send_email("KTEST: Your [$name] test was cancelled", "Your test started at $script_start_time was cancelled: sig int"); } + run_post_ktest; die "\nCaught Sig Int, test interrupted: $!\n" }
@@ -4661,11 +4682,7 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { success $i; } -if (defined($final_post_ktest)) { - - my $cp_final_post_ktest = eval_kernel_version $final_post_ktest; - run_command $cp_final_post_ktest; -} +run_post_ktest; if ($opt{"POWEROFF_ON_SUCCESS"}) { halt;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 451/1146 vfio: selftests: fix crash in vfio_dma_mapping_mmio_test
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Mastro <[email protected]>
[ Upstream commit f183963891b4b0126f19aa0993ed931f3f3f9520 ]
Remove the __iommu_unmap() call on a region that was never mapped. When __iommu_map() fails (expected for MMIO vaddrs in non-VFIO modes), the region is not added to the dma_regions list, leaving its list_head zero-initialized. If the unmap ioctl returns success, __iommu_unmap() calls list_del_init() on this zeroed node and crashes.
This fixes the iommufd_compat_type1 and iommufd_compat_type1v2 test variants.
--- tools/testing/selftests/vfio/vfio_dma_mapping_mmio_test.c | 1 - 1 file changed, 1 deletion(-)
tools/testing/selftests/vfio/vfio_dma_mapping_mmio_test.c +0 -1
@@ -100,7 +100,6 @@ static void do_mmio_map_test(struct iommu *iommu,iommu_unmap (iommu, ®ion); }else {VFIO_ASSERT_NE (__iommu_map (iommu, ®ion),0 ); -VFIO_ASSERT_NE (__iommu_unmap (iommu, ®ion,NULL ),0 ); } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 452/1146 rtla: Simplify code by caching string lengths
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wander Lairson Costa <[email protected]>
[ Upstream commit f79720e25b793691dcc46e1f1cd64d01578075c2 ]
Simplify trace_event_save_hist() and set_comm_cgroup() by computing string lengths once and storing them in local variables, rather than calling strlen() multiple times on the same unchanged strings. This makes the code clearer by eliminating redundant function calls and improving readability.
In trace_event_save_hist(), the write loop previously called strlen() on the hist buffer twice per iteration for both the size calculation and loop condition. Store the length in hist_len before entering the loop. In set_comm_cgroup(), strlen() was called on cgroup_path up to three times in succession. Store the result in cg_path_len to use in both the offset calculation and size parameter for subsequent append operations.
This simplification makes the code easier to read and maintain without changing program behavior.
Stable-dep-of: 4bf4ef5292b9 ("rtla/trace: Fix write loop in trace_event_save_hist()")
--- tools/tracing/rtla/src/trace.c | 6 ++++-- tools/tracing/rtla/src/utils.c | 11 +++++++---- 2 files changed, 11 insertions(+), 6 deletions(-)
tools/tracing/rtla/src/trace.c +4 -2
@@ -362,6 +362,7 @@ static void trace_event_save_hist(struct trace_instance *instance,mode_t mode =0644 ;char path[1024 ];char *hist; +size_t hist_len;if (!tevent)return ;
@@ -392,9 +393,10 @@ static void trace_event_save_hist(struct trace_instance *instance, } index =0 ; + hist_len =strlen (hist);do { - index +=write (out_fd, &hist[index],strlen (hist) - index); - }while (index <strlen (hist)); + index +=write (out_fd, &hist[index], hist_len - index); + }while (index < hist_len);free (hist); out_close:
tools/tracing/rtla/src/utils.c +7 -4
@@ -809,6 +809,7 @@ static int open_cgroup_procs(const char *cgroup)char cgroup_procs[MAX_PATH ];int retval;int cg_fd; +size_t cg_path_len; retval =find_mount ("cgroup2" , cgroup_path,sizeof (cgroup_path));if (!retval) {
@@ -816,16 +817,18 @@ static int open_cgroup_procs(const char *cgroup)return -1 ; } + cg_path_len =strlen (cgroup_path); +if (!cgroup) { - retval =get_self_cgroup (&cgroup_path[strlen (cgroup_path)], -sizeof (cgroup_path) -strlen (cgroup_path)); + retval =get_self_cgroup (&cgroup_path[cg_path_len], +sizeof (cgroup_path) - cg_path_len);if (!retval) {err_msg ("Did not find self cgroup\n" );return -1 ; } }else { -snprintf (&cgroup_path[strlen (cgroup_path)], -sizeof (cgroup_path) -strlen (cgroup_path),"%s/" , cgroup); +snprintf (&cgroup_path[cg_path_len], +sizeof (cgroup_path) - cg_path_len,"%s/" , cgroup); }snprintf (cgroup_procs,MAX_PATH ,"%s/cgroup.procs" , cgroup_path);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 453/1146 rtla: Use str_has_prefix() for prefix checks
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wander Lairson Costa <[email protected]>
[ Upstream commit 265905df83a4c1e78c1a912e1699d7c81d9540e6 ]
The code currently uses strncmp() combined with strlen() to check if a string starts with a specific prefix. This pattern is verbose and prone to errors if the length does not match the prefix string.
Replace this pattern with the str_has_prefix() helper function in both trace.c and utils.c. This improves code readability and safety by handling the prefix length calculation automatically.
In addition, remove the unused retval variable from trace_event_save_hist() in trace.c to clean up the function and silence potential compiler warnings.
Stable-dep-of: 4bf4ef5292b9 ("rtla/trace: Fix write loop in trace_event_save_hist()")
--- tools/tracing/rtla/src/trace.c | 5 ++--- tools/tracing/rtla/src/utils.c | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-)
tools/tracing/rtla/src/trace.c +2 -3
@@ -358,7 +358,7 @@ static void trace_event_disable_filter(struct trace_instance *instance,static void trace_event_save_hist (struct trace_instance *instance,struct trace_events *tevent) { -int retval, index, out_fd; +int index, out_fd;mode_t mode =0644 ;char path[1024 ];char *hist;
@@ -372,8 +372,7 @@ static void trace_event_save_hist(struct trace_instance *instance,return ;/* is this a hist: trigger? */ - retval =strncmp (tevent->trigger,"hist:" ,strlen ("hist:" )); -if (retval) +if (!str_has_prefix (tevent->trigger,"hist:" ))return ;snprintf (path,1024 ,"%s_%s_hist.txt" , tevent->system, tevent->event);
tools/tracing/rtla/src/utils.c +1 -2
@@ -316,8 +316,7 @@ static int procfs_is_workload_pid(const char *comm_prefix, struct dirent *proc_ereturn 0 ; buffer[MAX_PATH -1 ] ='\0' ; - retval =strncmp (comm_prefix, buffer,strlen (comm_prefix)); -if (retval) +if (!str_has_prefix (buffer, comm_prefix))return 0 ;/* comm already have \n */
Signature · 1 line
2.53.0
Re: [PATCH 7.0 0453/1146] rtla: Use str_has_prefix() for prefix checks
Hi Greg,
st 20. 5. 2026 v 18:45 odesílatel Greg Kroah-Hartman <[email protected]> napsal:
Quoted 9 lines
7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wander Lairson Costa <[email protected]>
[ Upstream commit
265905df83a4c1e78c1a912e1699d7c81d9540e6]
Quoted 8 lines
The code currently uses
strncmp()combined withstrlen()to check if a string starts with a specific prefix. This pattern is verbose and prone to errors if the length does not match the prefix string.Replace this pattern with the
str_has_prefix()helper function in bothtrace.candutils.c. This improves code readability and safety by handling the prefix length calculation automatically.
This commit breaks rtla build as there is no str_has_prefix() in rtla in 7.0-stable. It was introduced upstream in commit 0f4bc9d67a6 ("rtla: Add str_has_prefix() helper function") which is not in stable, see [1] - same error can now be reproduced also on linux-stable-rc/queue/7.0. Please drop this commit and also the dependency that pulled it in, commit 4bf4ef5292b9 ("rtla/trace: Fix write loop in trace_event_save_hist()"), which does not apply without this.
Not sure what the policy is about 56317dd01bd6 ("rtla: Simplify code by caching string lengths"), that's another "Stable-dep-of" referencing 4bf4ef5292b9. It doesn't break anything but was only pulled as a dependency of what will now be dropped.
[1] https://lore.kernel.org/stable/CAP4=nvTootCBXa1VxJLGACVtVNuY_RiiAWVOrh+jED=4OD0SSA@mail.gmail.com/
Quoted 7 lines
In addition, remove the unused retval variable from
trace_event_save_hist()intrace.cto clean up the function and silence potential compiler warnings.Signed-off-by Wander Lairson Costa <[email protected]>Signed-off-by Tomas Glozar <[email protected]>
Quoted 7 lines
Stable-dep-of:
4bf4ef5292b9("rtla/trace: Fix write loop intrace_event_save_hist()")Signed-off-by Sasha Levin <[email protected]>--- tools/tracing/rtla/src/trace.c | 5 ++--- tools/tracing/rtla/src/utils.c | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-)
Thanks,
Tomas
Sasha Levin
maintainerRe: [PATCH 7.0 0453/1146] rtla: Use str_has_prefix() for prefix checks
Quoted 7 lines · Tomas Glozar
This commit breaks rtla build as there is no
str_has_prefix()in rtla in 7.0-stable. [...] Please drop this commit and also the dependency that pulled it in, commit4bf4ef5292b9("rtla/trace: Fix write loop intrace_event_save_hist()"), which does not apply without this.Not sure what the policy is about
56317dd01bd6("rtla: Simplify code by caching string lengths") [...]
Dropped all three from the 7.0 queue:
- rtla: Use str_has_prefix() for prefix checks
- rtla/trace: Fix write loop in trace_event_save_hist()
- rtla: Simplify code by caching string lengths
Thanks for the report.
--
Thanks,
Sasha
Greg Kroah-Hartman
maintainerPATCH 454/1146 rtla/trace: Fix write loop in trace_event_save_hist()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wander Lairson Costa <[email protected]>
[ Upstream commit 4bf4ef5292b9253d8607c61a875d9f6b14129976 ]
The write loop in trace_event_save_hist() does not correctly handle errors from the write() system call. If write() returns -1, this value is added to the loop index, leading to an incorrect memory access on the next iteration and potentially an infinite loop. The loop also fails to handle EINTR.
Fix the write loop by introducing proper error handling. The return value of write() is now stored in a ssize_t variable and checked for errors. The loop retries the call if interrupted by a signal and breaks on any other error after logging it with strerror().
Additionally, change the index variable type from int to size_t to match the type used for buffer sizes and by strlen(), improving type safety.
--- tools/tracing/rtla/src/trace.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
tools/tracing/rtla/src/trace.c +11 -3
@@ -358,11 +358,11 @@ static void trace_event_disable_filter(struct trace_instance *instance,static void trace_event_save_hist (struct trace_instance *instance,struct trace_events *tevent) { -int index, out_fd; +size_t index, hist_len;mode_t mode =0644 ;char path[1024 ];char *hist; -size_t hist_len; +int out_fd;if (!tevent)return ;
@@ -394,7 +394,15 @@ static void trace_event_save_hist(struct trace_instance *instance, index =0 ; hist_len =strlen (hist);do { - index +=write (out_fd, &hist[index], hist_len - index); +const ssize_t written =write (out_fd, &hist[index], hist_len - index); + +if (written <0 ) { +if (errno ==EINTR ) +continue ; +err_msg (" Error writing hist file: %s\n" ,strerror (errno)); +break ; + } + index += written; }while (index < hist_len);free (hist);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 455/1146 rtla/utils: Fix resource leak in set_comm_sched_attr()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wander Lairson Costa <[email protected]>
[ Upstream commit 5b6dc659ad792c72b3ff1be8039ae2945e030928 ]
The set_comm_sched_attr() function opens the /proc directory via opendir() but fails to call closedir() on its successful exit path. If the function iterates through all processes without error, it returns 0 directly, leaking the DIR stream pointer.
Fix this by refactoring the function to use a single exit path. A retval variable is introduced to track the success or failure status. All exit points now jump to a unified out label that calls closedir() before the function returns, ensuring the resource is always freed.
--- tools/tracing/rtla/src/utils.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
tools/tracing/rtla/src/utils.c +6 -5
@@ -360,22 +360,23 @@ int set_comm_sched_attr(const char *comm_prefix, struct sched_attr *attr)if (strtoi (proc_entry->d_name, &pid)) {err_msg ("'%s' is not a valid pid" , proc_entry->d_name); - goto out_err; + retval =1 ; + goto out; }/* procfs_is_workload_pid confirmed it is a pid */ retval =__set_sched_attr (pid, attr);if (retval) {err_msg ("Error setting sched attributes for pid:%s\n" , proc_entry->d_name); - goto out_err; + goto out; }debug_msg ("Set sched attributes for pid:%s\n" , proc_entry->d_name); } -return 0 ; -out_err: + retval =0 ; +out:closedir (procfs); -return 1 ; +return retval; }#define INVALID_VAL (~0L)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 456/1146 tools/rtla: Generate optstring from long options
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Costa Shulyupin <[email protected]>
[ Upstream commit 4a1cec7450b7159a0ee57403f44460ac4d618b4f ]
getopt_long() processes short and long options independently. RTLA, like the majority of applications, uses both short and long variants for each logical option.
Since the val member of struct option holds the letter of the short variant, the string of short options can be reconstructed from the array of long options.
Add getopt_auto() to generate optstring from an array of long options, eliminating the need to maintain separate short option strings.
Stable-dep-of: be8058f31b4e ("rtla: Fix segfault on multiple SIGINTs")
--- tools/tracing/rtla/src/common.c | 32 +++++++++++++++++++++++++- tools/tracing/rtla/src/common.h | 2 ++ tools/tracing/rtla/src/osnoise_hist.c | 3 +-- tools/tracing/rtla/src/osnoise_top.c | 3 +-- tools/tracing/rtla/src/timerlat_hist.c | 3 +-- tools/tracing/rtla/src/timerlat_top.c | 3 +-- 6 files changed, 37 insertions(+), 9 deletions(-)
tools/tracing/rtla/src/common.c +31 -1
@@ -39,6 +39,36 @@ static void set_signals(struct common_params *params) } } +/* +* getopt_auto - auto-generates optstring from long_options +*/ +int getopt_auto (int argc,char **argv,const struct option *long_opts) +{ +char opts[256 ]; +int n =0 ; + +for (int i =0 ; long_opts[i].name; i++) { +if (long_opts[i].val <32 || long_opts[i].val >127 ) +continue ; + +if (n +4 >=sizeof (opts)) +fatal ("optstring buffer overflow" ); + + opts[n++] = long_opts[i].val; + +if (long_opts[i].has_arg == required_argument) + opts[n++] =':' ; +else if (long_opts[i].has_arg == optional_argument) { + opts[n++] =':' ; + opts[n++] =':' ; + } + } + + opts[n] ='\0' ; + +return getopt_long (argc, argv, opts, long_opts,NULL ); +} +/* * common_parse_options - parse common command line options *
@@ -69,7 +99,7 @@ int common_parse_options(int argc, char **argv, struct common_params *common) }; opterr =0 ; - c =getopt_long (argc, argv,"c:C::Dd:e:H:P:" , long_options,NULL ); + c =getopt_auto (argc, argv, long_options); opterr =1 ;switch (c) {
tools/tracing/rtla/src/common.h +2 -0
@@ -1,6 +1,7 @@/* SPDX-License-Identifier: GPL-2.0 */ #pragma once +#include <getopt.h> #include "actions.h" #include "timerlat_u.h" #include "trace.h"
@@ -156,6 +157,7 @@ int osnoise_set_stop_us(struct osnoise_context *context, long long stop_us);int osnoise_set_stop_total_us (struct osnoise_context *context,long long stop_total_us); +int getopt_auto (int argc,char **argv,const struct option *long_opts);int common_parse_options (int argc,char **argv,struct common_params *common);int common_apply_config (struct osnoise_tool *tool,struct common_params *params);int top_main_loop (struct osnoise_tool *tool);
tools/tracing/rtla/src/osnoise_hist.c +1 -2
@@ -506,8 +506,7 @@ static struct common_paramsif (common_parse_options (argc, argv, ¶ms->common))continue ; - c =getopt_long (argc, argv,"a:b:E:hp:r:s:S:t::T:01234:5:6:7:" , - long_options,NULL ); + c =getopt_auto (argc, argv, long_options);/* detect the end of the options. */ if (c ==-1 )
tools/tracing/rtla/src/osnoise_top.c +1 -2
@@ -358,8 +358,7 @@ struct common_params *osnoise_top_parse_args(int argc, char **argv)if (common_parse_options (argc, argv, ¶ms->common))continue ; - c =getopt_long (argc, argv,"a:hp:qr:s:S:t::T:0:1:2:3:" , - long_options,NULL ); + c =getopt_auto (argc, argv, long_options);/* Detect the end of the options. */ if (c ==-1 )
tools/tracing/rtla/src/timerlat_hist.c +1 -2
@@ -825,8 +825,7 @@ static struct common_paramsif (common_parse_options (argc, argv, ¶ms->common))continue ; - c =getopt_long (argc, argv,"a:b:E:hi:knp:s:t::T:uU0123456:7:8:9\1\2:\3:" , - long_options,NULL ); + c =getopt_auto (argc, argv, long_options);/* detect the end of the options. */ if (c ==-1 )
tools/tracing/rtla/src/timerlat_top.c +1 -2
@@ -588,8 +588,7 @@ static struct common_paramsif (common_parse_options (argc, argv, ¶ms->common))continue ; - c =getopt_long (argc, argv,"a:hi:knp:qs:t::T:uU0:1:2:345:6:7:" , - long_options,NULL ); + c =getopt_auto (argc, argv, long_options);/* detect the end of the options. */ if (c ==-1 )
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 457/1146 rtla: Fix segfault on multiple SIGINTs
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomas Glozar <[email protected]>
[ Upstream commit be8058f31b4e237604e4ce7599593ab68dc69ae7 ]
Detach stop_trace() from SIGINT/SIGALRM on tool clean-up to prevent it from crashing RTLA by accessing freed memory.
This prevents a crash when multiple SIGINTs are received.
--- tools/tracing/rtla/src/common.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
tools/tracing/rtla/src/common.c +15 -1
@@ -39,6 +39,18 @@ static void set_signals(struct common_params *params) } } +/* +* unset_signals - unsets the signals to stop the tool +*/ +static void unset_signals (struct common_params *params) +{ +signal (SIGINT ,SIG_DFL ); +if (params->duration) { +alarm (0 ); +signal (SIGALRM ,SIG_DFL ); + } +} +/* * getopt_auto - auto-generates optstring from long_options */
@@ -314,7 +326,7 @@ int run_tool(struct tool_ops *ops, int argc, char *argv[]) retval = ops->main (tool);if (retval) - goto out_trace; + goto out_signals;if (params->user_workload && !params->user.stopped_running) { params->user.should_run =0 ;
@@ -336,6 +348,8 @@ int run_tool(struct tool_ops *ops, int argc, char *argv[])if (ops->analyze) ops->analyze (tool, stopped); +out_signals: +unset_signals (params); out_trace:trace_events_destroy (&tool->record->trace, params->events); params->events =NULL ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 458/1146 vfio: selftests: Build tests on aarch64
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ted Logan <[email protected]>
[ Upstream commit 1347a742a1e1b080e2e8d200312ae45b8d6ac859 ]
Fix vfio selftests on aarch64, allowing native builds on aarch64 hosts.
--- tools/testing/selftests/vfio/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/vfio/Makefile +1 -1
@@ -1,6 +1,6 @@ ARCH ?= $(shell uname -m) -ifeq (,$(filter $(ARCH),arm64 x86_64)) +ifeq (,$(filter $(ARCH),aarch64 arm64 x86_64)) # Do nothing on unsupported architectures include ../lib.mk else
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 459/1146 gfs2: less aggressive low-memory log flushing
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Gruenbacher <[email protected]>
[ Upstream commit 7288185ce87ec70133b7bc3b694b0f74bf46a0ee ]
It turns out that for some workloads, the fix in commit b74cd55aa9a9d ("gfs2: low-memory forced flush fixes") causes the number of forced log flushes to increase to a degree that the overall filesystem performance drops significantly. Address that by forcing a log flush only when gfs2_writepages cannot make any progress rather than when it cannot make "enough" progress.
--- fs/gfs2/aops.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/gfs2/aops.c +3 -2
@@ -158,6 +158,7 @@ static int gfs2_writepages(struct address_space *mapping, struct writeback_control *wbc) {struct gfs2_sbd *sdp =gfs2_mapping2sbd (mapping); +long initial_nr_to_write = wbc->nr_to_write;struct iomap_writepage_ctx wpc = { .inode = mapping->host, .wbc = wbc,
@@ -166,13 +167,13 @@ static int gfs2_writepages(struct address_space *mapping,int ret;/* -* Even if we didn't write enough pages here, we might still be holding +* Even if we didn't write any pages here, we might still be holding * dirty pages in the ail. We forcibly flush the ail because we don't * want balance_dirty_pages() to loop indefinitely trying to write out * pages held in the ail that it can't find. */ ret =iomap_writepages (&wpc); -if (ret ==0 && wbc->nr_to_write >0 ) +if (ret ==0 && wbc->nr_to_write == initial_nr_to_write)set_bit (SDF_FORCE_AIL_FLUSH , &sdp->sd_flags);return ret; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 460/1146 quota: Fix race of dquot_scan_active() with quota deactivation
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
[ Upstream commit e93ab401da4b2e2c1b8ef2424de2f238d51c8b2d ]
dquot_scan_active() can race with quota deactivation in quota_release_workfn() like:
CPU0 (quota_release_workfn) CPU1 (dquot_scan_active)
============================== ==============================
spin_lock(&dq_list_lock);
list_replace_init(
&releasing_dquots, &rls_head);
/* dquot X on rls_head,
dq_count == 0,
DQ_ACTIVE_B still set */
spin_unlock(&dq_list_lock);
synchronize_srcu(&dquot_srcu);
spin_lock(&dq_list_lock);
list_for_each_entry(dquot,
&inuse_list, dq_inuse) {
/* finds dquot X */
dquot_active(X) -> true
atomic_inc(&X->dq_count);
}
spin_unlock(&dq_list_lock);
spin_lock(&dq_list_lock);
dquot = list_first_entry(&rls_head);
WARN_ON_ONCE(atomic_read(&dquot->dq_count));The problem is not only a cosmetic one as under memory pressure the caller of dquot_scan_active() can end up working on freed dquot.
Fix the problem by making sure the dquot is removed from releasing list when we acquire a reference to it.
--- fs/quota/dquot.c | 38 ++++++++++++++++++++++++++++++-------- include/linux/quotaops.h | 9 +-------- 2 files changed, 31 insertions(+), 16 deletions(-)
fs/quota/dquot.c +30 -8
@@ -363,6 +363,31 @@ static inline int dquot_active(struct dquot *dquot)return test_bit (DQ_ACTIVE_B , &dquot->dq_flags); } +static struct dquot *__dqgrab (struct dquot *dquot) +{ +lockdep_assert_held (&dq_list_lock); +if (!atomic_read (&dquot->dq_count)) +remove_free_dquot (dquot); +atomic_inc (&dquot->dq_count); +return dquot; +} + +/* +* Get reference to dquot when we got pointer to it by some other means. The +* dquot has to be active and the caller has to make sure it cannot get +* deactivated under our hands. +*/ +struct dquot *dqgrab (struct dquot *dquot) +{ +spin_lock (&dq_list_lock); +WARN_ON_ONCE (!dquot_active (dquot)); + dquot =__dqgrab (dquot); +spin_unlock (&dq_list_lock); + +return dquot; +} +EXPORT_SYMBOL_GPL (dqgrab); +static inline int dquot_dirty (struct dquot *dquot) {return test_bit (DQ_MOD_B , &dquot->dq_flags);
@@ -641,15 +666,14 @@ int dquot_scan_active(struct super_block *sb,continue ;if (dquot->dq_sb != sb)continue ; -/* Now we have active dquot so we can just increase use count */ -atomic_inc (&dquot->dq_count); +__dqgrab (dquot);spin_unlock (&dq_list_lock);dqput (old_dquot); old_dquot = dquot;/* * ->release_dquot() can be racing with us. Our reference -* protects us from new calls to it so just wait for any -* outstanding call and recheck the DQ_ACTIVE_B after that. +* protects us from dquot_release() proceeding so just wait for +* any outstanding call and recheck the DQ_ACTIVE_B after that. */ wait_on_dquot (dquot);if (dquot_active (dquot)) {
@@ -717,7 +741,7 @@ int dquot_writeback_dquots(struct super_block *sb, int type)/* Now we have active dquot from which someone is * holding reference so we can safely just increase * use count */ -dqgrab (dquot); +__dqgrab (dquot);spin_unlock (&dq_list_lock); err =dquot_write_dquot (dquot);if (err && !ret)
@@ -963,9 +987,7 @@ struct dquot *dqget(struct super_block *sb, struct kqid qid)spin_unlock (&dq_list_lock);dqstats_inc (DQST_LOOKUPS ); }else { -if (!atomic_read (&dquot->dq_count)) -remove_free_dquot (dquot); -atomic_inc (&dquot->dq_count); +__dqgrab (dquot);spin_unlock (&dq_list_lock);dqstats_inc (DQST_CACHE_HITS );dqstats_inc (DQST_LOOKUPS );
include/linux/quotaops.h +1 -8
@@ -44,14 +44,7 @@ int dquot_initialize(struct inode *inode);bool dquot_initialize_needed (struct inode *inode);void dquot_drop (struct inode *inode);struct dquot *dqget (struct super_block *sb,struct kqid qid); -static inline struct dquot *dqgrab (struct dquot *dquot) -{ -/* Make sure someone else has active reference to dquot */ -WARN_ON_ONCE (!atomic_read (&dquot->dq_count)); -WARN_ON_ONCE (!test_bit (DQ_ACTIVE_B , &dquot->dq_flags)); -atomic_inc (&dquot->dq_count); -return dquot; -} +struct dquot *dqgrab (struct dquot *dquot);static inline bool dquot_is_busy (struct dquot *dquot) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 461/1146 vfio: unhide vdev->debug_root
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 555aa178f8d22261d71da74df6267e6e6e97f95a ]
When debugfs is disabled, the hisilicon driver now fails to build:
drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c: In function 'hisi_acc_vfio_debug_init':drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1671:62: error: 'struct vfio_device' has no member named 'debug_root'
1671 | vfio_dev_migration = debugfs_lookup("migration", vdev->debug_root);
| ^~
The driver otherwise relies on dead-code elimination, but this reference fails. The single struct member is not going to make much of a difference for memory consumption, so just keep this visible unconditionally.
--- include/linux/vfio.h | 2 -- 1 file changed, 2 deletions(-)
include/linux/vfio.h +0 -2
@@ -72,13 +72,11 @@ struct vfio_device { u8 iommufd_attached:1;#endif u8 cdev_opened:1; -#ifdef CONFIG_DEBUG_FS /* * debug_root is a static property of the vfio_device * which must be set prior to registering the vfio_device. */ struct dentry *debug_root; -#endif };/**
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 462/1146 gfs2: add some missing log locking
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Gruenbacher <[email protected]>
[ Upstream commit fe2c8d051150b90b3ccb85f89e3b1d636cb88ec8 ]
Function gfs2_logd() calls the log flushing functions gfs2_ail1_start(), gfs2_ail1_wait(), and gfs2_ail1_empty() without holding sdp->sd_log_flush_lock, but these functions require exclusion against concurrent transactions.
To fix that, add a non-locking __gfs2_log_flush() function. Then, in gfs2_logd(), take sdp->sd_log_flush_lock before calling the above mentioned log flushing functions and __gfs2_log_flush().
--- fs/gfs2/log.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-)
fs/gfs2/log.c +20 -8
@@ -1018,14 +1018,15 @@ static void trans_drain(struct gfs2_trans *tr) }/** -* gfs2_log_flush - flush incore transaction(s) +* __gfs2_log_flush - flush incore transaction(s) * @sdp: The filesystem * @gl: The glock structure to flush. If NULL, flush the whole incore log * @flags: The log header flags: GFS2_LOG_HEAD_FLUSH_* and debug flags * */ -void gfs2_log_flush (struct gfs2_sbd *sdp,struct gfs2_glock *gl,u32 flags) +static void __gfs2_log_flush (struct gfs2_sbd *sdp,struct gfs2_glock *gl, +u32 flags) {struct gfs2_trans *tr =NULL ;unsigned int reserved_blocks =0 , used_blocks =0 ;
@@ -1033,7 +1034,6 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)unsigned int first_log_head;unsigned int reserved_revokes =0 ; -down_write (&sdp->sd_log_flush_lock);trace_gfs2_log_flush (sdp,1 , flags); repeat:
@@ -1145,7 +1145,6 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)gfs2_assert_withdraw (sdp, used_blocks < reserved_blocks);gfs2_log_release (sdp, reserved_blocks - used_blocks); } -up_write (&sdp->sd_log_flush_lock);gfs2_trans_free (sdp, tr);trace_gfs2_log_flush (sdp,0 , flags);return ;
@@ -1166,6 +1165,13 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags) goto out_end; } +void gfs2_log_flush (struct gfs2_sbd *sdp,struct gfs2_glock *gl,u32 flags) +{ +down_write (&sdp->sd_log_flush_lock); +__gfs2_log_flush (sdp, gl, flags); +up_write (&sdp->sd_log_flush_lock); +} +/** * gfs2_merge_trans - Merge a new transaction into a cached transaction * @sdp: the filesystem
@@ -1297,19 +1303,25 @@ int gfs2_logd(void *data)break ;if (gfs2_jrnl_flush_reqd (sdp) || t ==0 ) { +down_write (&sdp->sd_log_flush_lock);gfs2_ail1_empty (sdp,0 ); -gfs2_log_flush (sdp,NULL ,GFS2_LOG_HEAD_FLUSH_NORMAL | -GFS2_LFC_LOGD_JFLUSH_REQD ); +__gfs2_log_flush (sdp,NULL , +GFS2_LOG_HEAD_FLUSH_NORMAL | +GFS2_LFC_LOGD_JFLUSH_REQD ); +up_write (&sdp->sd_log_flush_lock); }if (test_bit (SDF_FORCE_AIL_FLUSH , &sdp->sd_flags) ||gfs2_ail_flush_reqd (sdp)) {clear_bit (SDF_FORCE_AIL_FLUSH , &sdp->sd_flags); +down_write (&sdp->sd_log_flush_lock);gfs2_ail1_start (sdp);gfs2_ail1_wait (sdp);gfs2_ail1_empty (sdp,0 ); -gfs2_log_flush (sdp,NULL ,GFS2_LOG_HEAD_FLUSH_NORMAL | -GFS2_LFC_LOGD_AIL_FLUSH_REQD ); +__gfs2_log_flush (sdp,NULL , +GFS2_LOG_HEAD_FLUSH_NORMAL | +GFS2_LFC_LOGD_AIL_FLUSH_REQD ); +up_write (&sdp->sd_log_flush_lock); } t =gfs2_tune_get (sdp, gt_logd_secs) *HZ ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 463/1146 gfs2: prevent NULL pointer dereference during unmount
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Gruenbacher <[email protected]>
[ Upstream commit 74b4dbb946060a3233604d91859a9abd3708141d ]
When flushing out outstanding glock work during an unmount, gfs2_log_flush() can be called when sdp->sd_jdesc has already been deallocated and sdp->sd_jdesc is NULL. Commit 35264909e9d1 ("gfs2: Fix NULL pointer dereference in gfs2_log_flush") added a check for that to gfs2_log_flush() itself, but it missed the sdp->sd_jdesc dereference in gfs2_log_release(). Fix that.
--- fs/gfs2/log.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/gfs2/log.c +3 -2
@@ -467,8 +467,9 @@ void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks) {atomic_add (blks, &sdp->sd_log_blks_free);trace_gfs2_log_blocks (sdp, blks); -gfs2_assert_withdraw (sdp,atomic_read (&sdp->sd_log_blks_free) <= - sdp->sd_jdesc->jd_blocks); +gfs2_assert_withdraw (sdp, !sdp->sd_jdesc || +atomic_read (&sdp->sd_log_blks_free) <= + sdp->sd_jdesc->jd_blocks);if (atomic_read (&sdp->sd_log_blks_needed))wake_up (&sdp->sd_log_waitq); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 464/1146 efi/capsule-loader: fix incorrect sizeof in phys array reallocation
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Huth <[email protected]>
[ Upstream commit 48a428215782321b56956974f23593e40ce84b7a ]
The krealloc() call for cap_info->phys in __efi_capsule_setup_info() uses sizeof(phys_addr_t *) instead of sizeof(phys_addr_t), which might be causing an undersized allocation.
The allocation is also inconsistent with the initial array allocation in efi_capsule_open() that allocates one entry with sizeof(phys_addr_t), and the efi_capsule_write() function that stores phys_addr_t values (not pointers) via page_to_phys().
On 64-bit systems where sizeof(phys_addr_t) == sizeof(phys_addr_t *), this goes unnoticed. On 32-bit systems with PAE where phys_addr_t is 64-bit but pointers are 32-bit, this allocates half the required space, which might lead to a heap buffer overflow when storing physical addresses.
This is similar to the bug fixed in commit fccfa646ef36 ("efi/capsule-loader:
fix incorrect allocation size") which fixed the same issue at the initial allocation site.
--- drivers/firmware/efi/capsule-loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/firmware/efi/capsule-loader.c +1 -1
@@ -67,7 +67,7 @@ int __efi_capsule_setup_info(struct capsule_info *cap_info) cap_info->pages = temp_page; temp_page =krealloc (cap_info->phys, - pages_needed *sizeof (phys_addr_t *), + pages_needed *sizeof (phys_addr_t),GFP_KERNEL | __GFP_ZERO);if (!temp_page)return -ENOMEM ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 465/1146 ksmbd: fix use-after-free from async crypto on Qualcomm crypto engine
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joshua Klinesmith <[email protected]>
[ Upstream commit 3e298897f41c61450c2e7a4f457e8b2485eb35b3 ]
ksmbd_crypt_message() sets a NULL completion callback on AEAD requests and does not handle the -EINPROGRESS return code from async hardware crypto engines like the Qualcomm Crypto Engine (QCE). When QCE returns -EINPROGRESS, ksmbd treats it as an error and immediately frees the request while the hardware DMA operation is still in flight. The DMA completion callback then dereferences freed memory, causing a NULL pointer crash:
pc : qce_skcipher_done+0x24/0x174 lr : vchan_complete+0x230/0x27c ... el1h_64_irq+0x68/0x6c ksmbd_free_work_struct+0x20/0x118 [ksmbd] ksmbd_exit_file_cache+0x694/0xa4c [ksmbd]
Use the standard crypto_wait_req() pattern with crypto_req_done() as the completion callback, matching the approach used by the SMB client in fs/smb/client/smb2ops.c. This properly handles both synchronous engines (immediate return) and async engines (-EINPROGRESS followed by callback notification).
--- fs/smb/server/auth.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
fs/smb/server/auth.c +6 -5
@@ -827,6 +827,7 @@ int ksmbd_crypt_message(struct ksmbd_work *work, struct kvec *iov,struct smb2_transform_hdr *tr_hdr =smb_get_msg (iov[0 ].iov_base);unsigned int assoc_data_len =sizeof (struct smb2_transform_hdr ) -20 ;int rc; +DECLARE_CRYPTO_WAIT (wait);struct scatterlist *sg;u8 sign[SMB2_SIGNATURE_SIZE ] = {};u8 key[SMB3_ENC_DEC_KEY_SIZE ];
@@ -913,12 +914,12 @@ int ksmbd_crypt_message(struct ksmbd_work *work, struct kvec *iov,aead_request_set_crypt (req, sg, sg, crypt_len, iv);aead_request_set_ad (req, assoc_data_len); -aead_request_set_callback (req,CRYPTO_TFM_REQ_MAY_SLEEP ,NULL ,NULL ); +aead_request_set_callback (req,CRYPTO_TFM_REQ_MAY_BACKLOG | +CRYPTO_TFM_REQ_MAY_SLEEP , + crypto_req_done, &wait); -if (enc) - rc =crypto_aead_encrypt (req); -else - rc =crypto_aead_decrypt (req); + rc =crypto_wait_req (enc ?crypto_aead_encrypt (req) : +crypto_aead_decrypt (req), &wait);if (rc) goto free_iv;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 466/1146 arm64: dts: mediatek: mt8365: Describe infracfg-nao as a pure syscon
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nícolas F. R. A. Prado <[email protected]>
[ Upstream commit 0651c24658360706c30588cec0a12c05edb03e9a ]
The infracfg-nao register space at 0x1020e000 has different registers than the infracfg space at 0x10001000, and most importantly, doesn't contain any clock controls. Therefore it shouldn't use the same compatible used for the mt8365 infracfg clocks driver:
mediatek,mt8365-infracfg. Since it currently does, probe errors are reported in the kernel logs:
[ 0.245959] Failed to register clk ifr_pmic_tmr: -EEXIST [ 0.245998] clk-mt8365 1020e000.infracfg: probe with driver clk-mt8365 failed with error -17
This register space is used only as a syscon for bus control by the power domain controller, so in order to properly describe it and fix the errors, set its compatible to a distinct compatible used exclusively as a syscon, drop the clock-cells, and while at it rename the node to 'syscon' following the naming convention.
--- arch/arm64/boot/dts/mediatek/mt8365.dtsi | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/mediatek/mt8365.dtsi +2 -3
@@ -536,10 +536,9 @@ iommu: iommu@10205000 { #iommu-cells = <1>; }; - infracfg_nao: infracfg@1020e000 { - compatible = "mediatek,mt8365-infracfg", "syscon"; + infracfg_nao: syscon@1020e000 { + compatible = "mediatek,mt8365-infracfg-nao", "syscon"; reg = <0 0x1020e000 0 0x1000>; - #clock-cells = <1>; }; rng: rng@1020f000 {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 467/1146 ARM: dts: mediatek: mt7623: fix efuse fallback compatible
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 5978ff33cc6f0988388a2830dc5cd2ea4e81f36a ]
Fix following validation error:arch/arm/boot/dts/mediatek/mt7623a-rfb-emmc.dtb: efuse@10206000: compatible: 'oneOf' conditional failed, one must be fixed:
['mediatek,mt7623-efuse', 'mediatek,mt8173-efuse'] is too long
'mediatek,mt8173-efuse' was expected
'mediatek,efuse' was expected
from schema $id: http://devicetree.org/schemas/nvmem/mediatek,efuse.yaml#arch/arm/boot/dts/mediatek/mt7623a-rfb-emmc.dtb: efuse@10206000: Unevaluated properties are not allowed ('compatible' was unexpected)
from schema $id: http://devicetree.org/schemas/nvmem/mediatek,efuse.yaml#
--- arch/arm/boot/dts/mediatek/mt7623.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/mediatek/mt7623.dtsi +1 -1
@@ -328,7 +328,7 @@ sysirq: interrupt-controller@10200100 { efuse: efuse@10206000 { compatible = "mediatek,mt7623-efuse", - "mediatek,mt8173-efuse"; + "mediatek,efuse"; reg = <0 0x10206000 0 0x1000>; #address-cells = <1>; #size-cells = <1>;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 468/1146 memory: tegra124-emc: Fix dll_change check
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikko Perttunen <[email protected]>
[ Upstream commit 9597ab9a8296ab337e6820f8a717ff621078b632 ]
The code checking whether the specified memory timing enables DLL in the EMRS register was reversed. DLL is enabled if bit A0 is low. Fix the check.
--- drivers/memory/tegra/tegra124-emc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/memory/tegra/tegra124-emc.c +1 -1
@@ -608,7 +608,7 @@ static int tegra124_emc_prepare_timing_change(struct tegra_emc *emc,if ((last->emc_mode_1 &0x1 ) == (timing->emc_mode_1 &0x1 )) dll_change =DLL_CHANGE_NONE ; -else if (timing->emc_mode_1 &0x1 ) +else if (!(timing->emc_mode_1 &0x1 )) dll_change =DLL_CHANGE_ON ;else dll_change =DLL_CHANGE_OFF ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 469/1146 memory: tegra30-emc: Fix dll_change check
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikko Perttunen <[email protected]>
[ Upstream commit 0a93f2355cf4922ad2399dbef5ea1049fef116d4 ]
The code checking whether the specified memory timing enables DLL in the EMRS register was reversed. DLL is enabled if bit A0 is low. Fix the check.
--- drivers/memory/tegra/tegra30-emc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/memory/tegra/tegra30-emc.c +3 -3
@@ -554,14 +554,14 @@ static int emc_prepare_timing_change(struct tegra_emc *emc, unsigned long rate) emc->emc_cfg =readl_relaxed (emc->regs +EMC_CFG ); emc_dbg =readl_relaxed (emc->regs +EMC_DBG ); -if (emc->dll_on == !!(timing->emc_mode_1 &0x1 )) +if (emc->dll_on == !(timing->emc_mode_1 &0x1 )) dll_change =DLL_CHANGE_NONE ; -else if (timing->emc_mode_1 &0x1 ) +else if (!(timing->emc_mode_1 &0x1 )) dll_change =DLL_CHANGE_ON ;else dll_change =DLL_CHANGE_OFF ; - emc->dll_on = !!(timing->emc_mode_1 &0x1 ); + emc->dll_on = !(timing->emc_mode_1 &0x1 );if (timing->data[80 ] && !readl_relaxed (emc->regs +EMC_ZCAL_INTERVAL )) emc->zcal_long = true;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 470/1146 arm64: dts: imx8-apalis: Fix LEDs name collision
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Francesco Dolcini <[email protected]>
[ Upstream commit 92ab53b9bb2a72581c32073755077af916eb9aee ]
Ixora boards have multiple instances of status leds, to avoid a name collision add the function-enumerator property.
This fixes the following Linux kernel warnings:
leds-gpio leds: Led green:status renamed to green:status_1 due to name collision leds-gpio leds: Led red:status renamed to red:status_1 due to name collision
--- arch/arm64/boot/dts/freescale/imx8-apalis-ixora-v1.1.dtsi | 4 ++++ arch/arm64/boot/dts/freescale/imx8-apalis-ixora-v1.2.dtsi | 4 ++++ 2 files changed, 8 insertions(+)
arch/arm64/boot/dts/freescale/imx8-apalis-ixora-v1.1.dtsi +4 -0
@@ -21,6 +21,7 @@ led-1 { color = <LED_COLOR_ID_GREEN>; default-state = "off"; function = LED_FUNCTION_STATUS; + function-enumerator = <1>; gpios = <&lsio_gpio5 27 GPIO_ACTIVE_HIGH>; };
@@ -29,6 +30,7 @@ led-2 { color = <LED_COLOR_ID_RED>; default-state = "off"; function = LED_FUNCTION_STATUS; + function-enumerator = <1>; gpios = <&lsio_gpio5 29 GPIO_ACTIVE_HIGH>; };
@@ -37,6 +39,7 @@ led-3 { color = <LED_COLOR_ID_GREEN>; default-state = "off"; function = LED_FUNCTION_STATUS; + function-enumerator = <2>; gpios = <&lsio_gpio5 20 GPIO_ACTIVE_HIGH>; };
@@ -45,6 +48,7 @@ led-4 { color = <LED_COLOR_ID_RED>; default-state = "off"; function = LED_FUNCTION_STATUS; + function-enumerator = <2>; gpios = <&lsio_gpio5 21 GPIO_ACTIVE_HIGH>; }; };
arch/arm64/boot/dts/freescale/imx8-apalis-ixora-v1.2.dtsi +4 -0
@@ -21,6 +21,7 @@ led-1 { color = <LED_COLOR_ID_GREEN>; default-state = "off"; function = LED_FUNCTION_STATUS; + function-enumerator = <1>; gpios = <&lsio_gpio5 27 GPIO_ACTIVE_HIGH>; };
@@ -29,6 +30,7 @@ led-2 { color = <LED_COLOR_ID_RED>; default-state = "off"; function = LED_FUNCTION_STATUS; + function-enumerator = <1>; gpios = <&lsio_gpio5 29 GPIO_ACTIVE_HIGH>; };
@@ -37,6 +39,7 @@ led-3 { color = <LED_COLOR_ID_GREEN>; default-state = "off"; function = LED_FUNCTION_STATUS; + function-enumerator = <2>; gpios = <&lsio_gpio5 20 GPIO_ACTIVE_HIGH>; };
@@ -45,6 +48,7 @@ led-4 { color = <LED_COLOR_ID_RED>; default-state = "off"; function = LED_FUNCTION_STATUS; + function-enumerator = <2>; gpios = <&lsio_gpio5 21 GPIO_ACTIVE_HIGH>; }; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 471/1146 arm64: dts: imx91-11x11-evk: change usdhc tuning step for eMMC and SD
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luke Wang <[email protected]>
[ Upstream commit 5ab0c76df2403137a6d0fb27a55e03cedf47f44c ]
During system resume, the following errors occurred:
[ 430.638625] mmc1: error -84 writing Cache Enable bit [ 430.643618] mmc1: error -84 doing runtime resume
For eMMC and SD, there are two tuning pass windows and the gap between those two windows may only have one cell. If tuning step > 1, the gap may just be skipped and host assumes those two windows as a continuous windows. This will cause a wrong delay cell near the gap to be selected.
Set the tuning step to 1 to avoid selecting the wrong delay cell.
For SDIO, the gap is sufficiently large, so the default tuning step does not cause this issue.
--- arch/arm64/boot/dts/freescale/imx91-11x11-evk.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/freescale/imx91-11x11-evk.dts +2 -0
@@ -514,6 +514,7 @@ &usdhc1 { pinctrl-1 = <&pinctrl_usdhc1_100mhz>; pinctrl-2 = <&pinctrl_usdhc1_200mhz>; pinctrl-names = "default", "state_100mhz", "state_200mhz"; + fsl,tuning-step = <1>; status = "okay"; };
@@ -528,6 +529,7 @@ &usdhc2 { pinctrl-3 = <&pinctrl_usdhc2_sleep>, <&pinctrl_usdhc2_gpio_sleep>; pinctrl-names = "default", "state_100mhz", "state_200mhz", "sleep"; vmmc-supply = <®_usdhc2_vmmc>; + fsl,tuning-step = <1>; status = "okay"; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 472/1146 riscv: dts: spacemit: pcie: fix missing power regulator
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yixun Lan <[email protected]>
[ Upstream commit 8a9071299dec817a544c0fb48f7302396fafdc4b ]
The PCIe port require 3.3v power regulator for device to work properly, So explicitly add it to fix the DT warning:
arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dtb: pcie@ca400000 (spacemit,k1-pcie): pcie@0: 'vpcie3v3-supply' is a required property
from schema $id: http://devicetree.org/schemas/pci/spacemit,k1-pcie-host.yaml
--- arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts +2 -0
@@ -305,6 +305,7 @@ &pcie1_phy { &pcie1_port { phys = <&pcie1_phy>; + vpcie3v3-supply = <&pcie_vcc_3v3>; }; &pcie1 {
@@ -320,6 +321,7 @@ &pcie2_phy { &pcie2_port { phys = <&pcie2_phy>; + vpcie3v3-supply = <&pcie_vcc_3v3>; }; &pcie2 {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 473/1146 arm64: dts: mediatek: mt7988a-bpi-r4pro: fix model string
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Wunderlich <[email protected]>
[ Upstream commit e4e6f0c5a4dc238684acef079e792c81d37e3226 ]
Fix incorrect model string in Devicetree for BPI-R4-Pro.
--- arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-4e.dts | 2 +- arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-8x.dts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-4e.dts +1 -1
@@ -9,7 +9,7 @@ #include "mt7988a-bananapi-bpi-r4-pro.dtsi" / { - model = "Bananapi BPI-R4"; + model = "Bananapi BPI-R4 Pro 4E"; compatible = "bananapi,bpi-r4-pro-4e", "bananapi,bpi-r4-pro", "mediatek,mt7988a";
arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-8x.dts +1 -1
@@ -9,7 +9,7 @@ #include "mt7988a-bananapi-bpi-r4-pro.dtsi" / { - model = "Bananapi BPI-R4"; + model = "Bananapi BPI-R4 Pro 8X"; compatible = "bananapi,bpi-r4-pro-8x", "bananapi,bpi-r4-pro", "mediatek,mt7988a";
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 474/1146 arm64: dts: rockchip: Make Jaguar PCIe-refclk pin use pull-up config
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Stuebner <[email protected]>
[ Upstream commit f45d4356feeba1c8dac3414b688f59292ddfc9f9 ]
The hardware PU/PD config of the pin after reset is to pull-up and on Jaguar this will also keep the device in reset until the driver actually enables the pin. So restore this boot pull-up config of the pin on Jaguar instead of setting it to pull-none.
--- arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts +1 -1
@@ -588,7 +588,7 @@ led1_pin: led1-pin { pcie30x4 { pcie30x4_clkreqn_m0: pcie30x4-clkreqn-m0 { - rockchip,pins = <0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>; + rockchip,pins = <0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>; }; pcie30x4_perstn_m0: pcie30x4-perstn-m0 {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 475/1146 arm64: dts: imx8mp-evk: Enable pull select bit for PCIe regulator GPIO (M.2 W_DISABLE1)
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sherry Sun <[email protected]>
[ Upstream commit d1e7eab6033f9885a02c4b4e8f09e34d8e9d21ab ]
The current pin configuration for MX8MP_IOMUXC_SD1_DATA4__GPIO2_IO06 sets the weak pull-up but does not enable the pull select field. Bit 8 in the IOMUX register must be set in order for the weak pull-up to actually take effect.
Update the pinctrl setting from 0x40 to 0x140 to enable both the pull select and the weak pull-up, ensuring the line behaves as expected.
--- arch/arm64/boot/dts/freescale/imx8mp-evk.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mp-evk.dts +1 -1
@@ -1064,7 +1064,7 @@ MX8MP_IOMUXC_SD1_DATA5__GPIO2_IO07 0x40 pinctrl_pcie0_reg: pcie0reggrp { fsl,pins = < - MX8MP_IOMUXC_SD1_DATA4__GPIO2_IO06 0x40 + MX8MP_IOMUXC_SD1_DATA4__GPIO2_IO06 0x140 >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 476/1146 iommufd: vfio compatibility extension check for noiommu mode
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Pan <[email protected]>
[ Upstream commit 7147ec874ea08c322d779d8eba28946e294ed1f3 ]
VFIO_CHECK_EXTENSION should return false for TYPE1_IOMMU variants when in NO-IOMMU mode and IOMMUFD compat container is set. This change makes the behavior match VFIO_CONTAINER in noiommu mode. It also prevents userspace from incorrectly attempting to use TYPE1 IOMMU operations in a no-iommu context.
--- drivers/iommu/iommufd/vfio_compat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iommu/iommufd/vfio_compat.c +1 -1
@@ -283,7 +283,7 @@ static int iommufd_vfio_check_extension(struct iommufd_ctx *ictx,case VFIO_TYPE1_IOMMU :case VFIO_TYPE1v2_IOMMU:case VFIO_UNMAP_ALL : -return 1 ; +return !ictx->no_iommu_mode;case VFIO_NOIOMMU_IOMMU :return IS_ENABLED (CONFIG_VFIO_NOIOMMU );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 477/1146 arm64: dts: qcom: sm6125-xiaomi-ginkgo: Remove board-id
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Barnabás Czémán <[email protected]>
[ Upstream commit 535e5741bc9acef5ea2561aa300f28370599e7e2 ]
Remove board-id it is not necessary for the bootloader.
--- arch/arm64/boot/dts/qcom/sm6125-xiaomi-ginkgo.dts | 2 -- 1 file changed, 2 deletions(-)
arch/arm64/boot/dts/qcom/sm6125-xiaomi-ginkgo.dts +0 -2
@@ -18,9 +18,7 @@ / { compatible = "xiaomi,ginkgo", "qcom,sm6125"; chassis-type = "handset"; - /* required for bootloader to select correct board */ qcom,msm-id = <QCOM_ID_SM6125 0x10000>; - qcom,board-id = <22 0>; chosen { #address-cells = <2>;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 478/1146 arm64: dts: qcom: sm6125-xiaomi-ginkgo: Correct reserved memory ranges
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Barnabás Czémán <[email protected]>
[ Upstream commit 242801cc24e865cb525ef7d826ce6ebeffcad606 ]
The device was crashing on high memory load because the reserved memory ranges was wrongly defined. Correct the ranges for avoid the crashes. Change the ramoops memory range to match with the values from the recovery to be able to get the results from the device.
--- .../boot/dts/qcom/sm6125-xiaomi-ginkgo.dts | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-)
arch/arm64/boot/dts/qcom/sm6125-xiaomi-ginkgo.dts +29 -12
@@ -13,6 +13,12 @@ #include "sm6125.dtsi" #include "pm6125.dtsi" +/delete-node/ &adsp_pil_mem; +/delete-node/ &cont_splash_mem; +/delete-node/ &gpu_mem; +/delete-node/ &ipa_fw_mem; +/delete-node/ &ipa_gsi_mem; + / { model = "Xiaomi Redmi Note 8"; compatible = "xiaomi,ginkgo", "qcom,sm6125";
@@ -36,28 +42,39 @@ framebuffer0: framebuffer@5c000000 { }; reserved-memory { - debug_mem: debug@ffb00000 { - reg = <0x0 0xffb00000 0x0 0xc0000>; + adsp_pil_mem: adsp_pil_mem@55300000 { + reg = <0x0 0x55300000 0x0 0x2200000>; no-map; }; - last_log_mem: lastlog@ffbc0000 { - reg = <0x0 0xffbc0000 0x0 0x80000>; + ipa_fw_mem: ipa_fw_mem@57500000 { + reg = <0x0 0x57500000 0x0 0x10000>; no-map; }; - pstore_mem: ramoops@ffc00000 { - compatible = "ramoops"; - reg = <0x0 0xffc40000 0x0 0xc0000>; - record-size = <0x1000>; - console-size = <0x40000>; - pmsg-size = <0x20000>; + ipa_gsi_mem: ipa_gsi_mem@57510000 { + reg = <0x0 0x57510000 0x0 0x5000>; + no-map; }; - cmdline_mem: memory@ffd00000 { - reg = <0x0 0xffd40000 0x0 0x1000>; + gpu_mem: gpu_mem@57515000 { + reg = <0x0 0x57515000 0x0 0x2000>; no-map; }; + + framebuffer@5c000000 { + reg = <0x0 0x5c000000 0x0 (2340 * 1080 * 4)>; + no-map; + }; + + /* Matching with recovery values to be able to get the results. */ + ramoops@61600000 { + compatible = "ramoops"; + reg = <0x0 0x61600000 0x0 0x400000>; + record-size = <0x80000>; + pmsg-size = <0x200000>; + console-size = <0x100000>; + }; }; extcon_usb: extcon-usb {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 479/1146 arm64: dts: qcom: sm6125-xiaomi-ginkgo: Remove extcon
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Barnabás Czémán <[email protected]>
[ Upstream commit 79664600fd3ed3972ad9321e13d1f80267730447 ]
GPIO pin 102 is related to DisplayPort what is not supported by this device and it is also disabled at downstream, remove the unnecessary extcon-usb node.
--- arch/arm64/boot/dts/qcom/sm6125-xiaomi-ginkgo.dts | 9 --------- 1 file changed, 9 deletions(-)
arch/arm64/boot/dts/qcom/sm6125-xiaomi-ginkgo.dts +0 -9
@@ -77,11 +77,6 @@ ramoops@61600000 { }; }; - extcon_usb: extcon-usb { - compatible = "linux,extcon-usb-gpio"; - id-gpios = <&tlmm 102 GPIO_ACTIVE_HIGH>; - }; - gpio-keys { compatible = "gpio-keys";
@@ -304,7 +299,3 @@ &tlmm { &usb3 { status = "okay"; }; - -&usb3_dwc3 { - extcon = <&extcon_usb>; -};
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 480/1146 arm64: dts: qcom: sm6125-xiaomi-ginkgo: Fix reserved gpio ranges
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Barnabás Czémán <[email protected]>
[ Upstream commit e8669e010991154bedadd1cd67700544e0362e99 ]
The device was crashing on boot because the reserved gpio ranges was wrongly defined. Correct the ranges for avoid pinctrl crashing.
--- arch/arm64/boot/dts/qcom/sm6125-xiaomi-ginkgo.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/sm6125-xiaomi-ginkgo.dts +1 -1
@@ -293,7 +293,7 @@ &sdhc_2 { }; &tlmm { - gpio-reserved-ranges = <22 2>, <28 6>; + gpio-reserved-ranges = <0 4>, <30 4>; }; &usb3 {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 481/1146 arm64: dts: qcom: qcs6490-rubikpi3: Use lt9611 DSI Port B
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hongyang Zhao <[email protected]>
[ Upstream commit ebcf2240a2494faf202ce5ec80ef159a38b1e542 ]
The LT9611 HDMI bridge on RubikPi3 has DSI physically connected to Port B. Update the devicetree to use port@1 which corresponds to Port B input on the LT9611.
--- arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts +4 -4
@@ -755,10 +755,10 @@ ports { #address-cells = <1>; #size-cells = <0>; - port@0 { - reg = <0>; + port@1 { + reg = <1>; - lt9611_a: endpoint { + lt9611_b: endpoint { remote-endpoint = <&mdss_dsi0_out>; }; };
@@ -801,7 +801,7 @@ &mdss_dsi { }; &mdss_dsi0_out { - remote-endpoint = <<9611_a>; + remote-endpoint = <<9611_b>; data-lanes = <0 1 2 3>; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 482/1146 arm64: dts: qcom: talos: Add missing clock-names to GCC
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit c653607929bb4e0d8b80573bdb523adab5b975c2 ]
The binding for this clock controller requires that clock-names are present. They're not really used by the kernel driver, but they're marked as required, so someone might have assumed it's done on purpose (where in reality we try to stay away from that since index-based references are faster, take up less space and are already widely used) and referenced it in drivers for another OS.
Hence, do the least painful thing and add the missing entries.
--- arch/arm64/boot/dts/qcom/talos.dtsi | 3 +++ 1 file changed, 3 insertions(+)
arch/arm64/boot/dts/qcom/talos.dtsi +3 -0
@@ -666,6 +666,9 @@ gcc: clock-controller@100000 { clocks = <&rpmhcc RPMH_CXO_CLK>, <&rpmhcc RPMH_CXO_CLK_A>, <&sleep_clk>; + clock-names = "bi_tcxo", + "bi_tcxo_ao", + "sleep_clk"; #clock-cells = <1>; #reset-cells = <1>;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 483/1146 arm64: dts: ti: k3-am62l: include WKUP_UART0 in wakeup peripheral window
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kendall Willis <[email protected]>
[ Upstream commit e5452968a4b04f93bf9b778ccfd00f79e4d4f529 ]
WKUP_UART0 is apart of the wakeup peripherals and has a range from 0x002B300000 to 0x002B3001FF. Expand the wakeup peripheral window to include WKUP_UART0.
--- arch/arm64/boot/dts/ti/k3-am62l.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/ti/k3-am62l.dtsi +2 -2
@@ -92,7 +92,7 @@ cbass_main: bus@f0000 { <0x00 0x00b00000 0x00 0x00b00000 0x00 0x00001400>, /* VTM */ <0x00 0x04080000 0x00 0x04080000 0x00 0x00008000>, /* PDCFG */ <0x00 0x04201000 0x00 0x04201000 0x00 0x00000100>, /* GPIO */ - <0x00 0x2b100000 0x00 0x2b100000 0x00 0x00100100>, /* Wakeup Peripheral Window */ + <0x00 0x2b100000 0x00 0x2b100000 0x00 0x00200200>, /* Wakeup Peripheral Window */ <0x00 0x40800000 0x00 0x40800000 0x00 0x00014000>, /* DMA */ <0x00 0x43000000 0x00 0x43000000 0x00 0x00080000>; /* CTRL MMRs */ #address-cells = <2>;
@@ -104,7 +104,7 @@ cbass_wakeup: bus@a80000 { <0x00 0x00b00000 0x00 0x00b00000 0x00 0x00001400>, /* VTM */ <0x00 0x04080000 0x00 0x04080000 0x00 0x00008000>, /* PDCFG */ <0x00 0x04201000 0x00 0x04201000 0x00 0x00000100>, /* GPIO */ - <0x00 0x2b100000 0x00 0x2b100000 0x00 0x00100100>, /* Wakeup Peripheral Window */ + <0x00 0x2b100000 0x00 0x2b100000 0x00 0x00200200>, /* Wakeup Peripheral Window */ <0x00 0x40800000 0x00 0x40800000 0x00 0x00014000>, /* DMA */ <0x00 0x43000000 0x00 0x43000000 0x00 0x00080000>; /* CTRL MMRs */ #address-cells = <2>;
Signature · 1 line
2.53.0