6.18.32-rc1 review
Subsystems (7)
Greg Kroah-Hartman
maintainerPATCH 201/957 dm cache policy smq: fix missing locks in invalidating cache blocks
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming-Hung Tsai <[email protected]>
[ Upstream commit 2d1f7b65f5deedd2e6b09fdc6ea27f8375f24b45 ]
In passthrough mode, the policy invalidate_mapping operation is called simultaneously from multiple workers, thus it should be protected by a lock. Otherwise, we might end up with data races on the allocated blocks counter, or even use-after-free issues with internal data structures when doing concurrent writes.
Note that the existing FIXME in smq_invalidate_mapping() doesn't affect passthrough mode since migration tasks don't exist there, but would need attention if supporting fast device shrinking via suspend/resume without target reloading.
Reproduce steps:
1. Create a cache device consisting of 1024 cache entries
dmsetup create cmeta --table "0 8192 linear /dev/sdc 0" dmsetup create cdata --table "0 131072 linear /dev/sdc 8192" dmsetup create corig --table "0 262144 linear /dev/sdc 262144" dd if=/dev/zero of=/dev/mapper/cmeta bs=4k count=1 oflag=direct dmsetup create cache --table "0 262144 cache /dev/mapper/cmeta \/dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 writethrough smq 0"
2. Populate the cache, and record the number of cached blocks
fio --name=populate --filename=/dev/mapper/cache --rw=randwrite --bs=4k \
--size=64m --direct=1
nr_cached=$(dmsetup status cache | awk '{split($7, a, "/"); print a[1]}')
3. Reload the cache into passthrough mode
dmsetup suspend cache
dmsetup reload cache --table "0 262144 cache /dev/mapper/cmeta \/dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 passthrough smq 0" dmsetup resume cache
4. Write to the passthrough cache. By setting multiple jobs with I/O size equal to the cache block size, cache blocks are invalidated concurrently from different workers.
fio --filename=/dev/mapper/cache --name=test --rw=randwrite --bs=64k \
--direct=1 --numjobs=2 --randrepeat=0 --size=64m
5. Check if demoted matches cached block count. These numbers should match but may differ due to the data race.
nr_demoted=$(dmsetup status cache | awk '{print $12}') echo "$nr_cached, $nr_demoted"
--- drivers/md/dm-cache-policy-smq.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/md/dm-cache-policy-smq.c +4 -0
@@ -1589,14 +1589,18 @@ static int smq_invalidate_mapping(struct dm_cache_policy *p, dm_cblock_t cblock) {struct smq_policy *mq =to_smq_policy (p);struct entry *e =get_entry (&mq->cache_alloc,from_cblock (cblock)); +unsigned long flags;if (!e->allocated)return -ENODATA ; +spin_lock_irqsave (&mq->lock, flags);// FIXME: what if this block has pending background work? del_queue (mq, e);h_remove (&mq->table, e);free_entry (&mq->cache_alloc, e); +spin_unlock_irqrestore (&mq->lock, flags); +return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 202/957 dm cache: fix concurrent write failure in passthrough mode
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming-Hung Tsai <[email protected]>
[ Upstream commit e4f66341779d0cf4c83c74793753a84094286d9e ]
When bio prison cell lock acquisition fails due to concurrent writes to the same block in passthrough mode, dm-cache incorrectly returns an I/O error instead of properly handling the concurrency. This can occur in both process and workqueue contexts when invalidate_lock() is called for exclusive access to a data block. Fix this by deferring the write bios to ensure proper block device behavior.
Reproduce steps:
1. Create a cache device
dmsetup create cmeta --table "0 8192 linear /dev/sdc 0" dmsetup create cdata --table "0 131072 linear /dev/sdc 8192" dmsetup create corig --table "0 262144 linear /dev/sdc 262144" dd if=/dev/zero of=/dev/mapper/cmeta bs=4k count=1 oflag=direct dmsetup create cache --table "0 262144 cache /dev/mapper/cmeta \/dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 writethrough smq 0"
2. Promote the first data block into cache
fio --filename=/dev/mapper/cache --name=populate --rw=write --bs=4k \
--direct=1 --size=64k
3. Reload the cache into passthrough mode
dmsetup suspend cache
dmsetup reload cache --table "0 262144 cache /dev/mapper/cmeta \/dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 passthrough smq 0" dmsetup resume cache
4. Write to the first cached block concurrently. Sometimes one of the processes will receive I/O errors.
fio --filename=/dev/mapper/cache --name test --rw=randwrite --bs=4k \
--randrepeat=0 --direct=1 --numjobs=2 --size 64k
<snip>
fio-3.41
fio: io_u error on file /dev/mapper/cache: Input/output error: write offset=4096, buflen=4096
fio: pid=106, err=5/file:io_u.c:2008, func=io_u error, error=Input/output error
test: (groupid=0, jobs=1): err= 0: pid=105
test: (groupid=0, jobs=1): err= 5 (file:io_u.c:2008, func=io_u error, error=Input/output error): pid=106 <snip>
--- drivers/md/dm-cache-target.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/md/dm-cache-target.c +9 -0
@@ -1561,6 +1561,15 @@ static int invalidate_lock(struct dm_cache_migration *mg) READ_WRITE_LOCK_LEVEL, prealloc, &mg->cell);if (r <0 ) {free_prison_cell (cache, prealloc); + +/* Defer the bio for retrying the cell lock */ +if (mg->overwrite_bio) { +struct bio *bio = mg->overwrite_bio; + + mg->overwrite_bio =NULL ; +defer_bio (cache, bio); + } +invalidate_complete (mg, false);return r; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 203/957 dm cache: fix dirty mapping checking in passthrough mode switching
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming-Hung Tsai <[email protected]>
[ Upstream commit 322586745bd1a0e5f3559fd1635fdeb4dbd1d6b8 ]
As mentioned in commit 9b1cc9f251af ("dm cache: share cache-metadata object across inactive and active DM tables"), dm-cache assumed table reload occurs after suspension, while LVM's table preload breaks this assumption. The dirty mapping check for passthrough mode was designed around this assumption and is performed during table creation, causing the check to fail with preload while metadata updates are ongoing. This risks loading dirty mappings into passthrough mode, resulting in data loss.
Reproduce steps:
1. Create a writeback cache with zero migration_threshold to produce dirty mappings
dmsetup create cmeta --table "0 8192 linear /dev/sdc 0" dmsetup create cdata --table "0 131072 linear /dev/sdc 8192" dmsetup create corig --table "0 262144 linear /dev/sdc 262144" dd if=/dev/zero of=/dev/mapper/cmeta bs=4k count=1 oflag=direct dmsetup create cache --table "0 262144 cache /dev/mapper/cmeta \/dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 writeback smq \
2 migration_threshold 0"
2. Preload a table in passthrough mode
dmsetup reload cache --table "0 262144 cache /dev/mapper/cmeta \/dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 passthrough smq 0"
3. Write to the first cache block to make it dirty
fio --filename=/dev/mapper/cache --name=populate --rw=write --bs=4k \
--direct=1 --size=64k
4. Resume the inactive table. Now it's possible to load the dirty block into passthrough mode.
dmsetup resume cache
Fix by moving the checks to the preresume phase to support table preloading. Also remove the unused function dm_cache_metadata_all_clean.
--- drivers/md/dm-cache-metadata.c | 11 ----------- drivers/md/dm-cache-metadata.h | 5 ----- drivers/md/dm-cache-target.c | 25 ++++++++----------------- 3 files changed, 8 insertions(+), 33 deletions(-)
drivers/md/dm-cache-metadata.c +0 -11
@@ -1714,17 +1714,6 @@ int dm_cache_write_hints(struct dm_cache_metadata *cmd, struct dm_cache_policy *return r; } -int dm_cache_metadata_all_clean (struct dm_cache_metadata *cmd,bool *result) -{ -int r; - -READ_LOCK (cmd); - r =blocks_are_unmapped_or_clean (cmd,0 , cmd->cache_blocks, result); -READ_UNLOCK (cmd); - -return r; -} -void dm_cache_metadata_set_read_only (struct dm_cache_metadata *cmd) {WRITE_LOCK_VOID (cmd);
drivers/md/dm-cache-metadata.h +0 -5
@@ -135,11 +135,6 @@ int dm_cache_get_metadata_dev_size(struct dm_cache_metadata *cmd,*/ int dm_cache_write_hints (struct dm_cache_metadata *cmd,struct dm_cache_policy *p); -/* -* Query method. Are all the blocks in the cache clean? -*/ -int dm_cache_metadata_all_clean (struct dm_cache_metadata *cmd,bool *result); -int dm_cache_metadata_needs_check (struct dm_cache_metadata *cmd,bool *result);int dm_cache_metadata_set_needs_check (struct dm_cache_metadata *cmd);void dm_cache_metadata_set_read_only (struct dm_cache_metadata *cmd);
drivers/md/dm-cache-target.c +8 -17
@@ -2506,23 +2506,8 @@ static int cache_create(struct cache_args *ca, struct cache **result) goto bad; } -if (passthrough_mode (cache)) { -bool all_clean; - - r =dm_cache_metadata_all_clean (cache->cmd, &all_clean); -if (r) { - *error ="dm_cache_metadata_all_clean() failed" ; - goto bad; - } - -if (!all_clean) { - *error ="Cannot enter passthrough mode unless all blocks are clean" ; - r = -EINVAL ; - goto bad; - } - +if (passthrough_mode (cache))policy_allow_migrations (cache->policy, false); - }spin_lock_init (&cache->lock);bio_list_init (&cache->deferred_bios);
@@ -2849,6 +2834,12 @@ static int load_mapping(void *context, dm_oblock_t oblock, dm_cblock_t cblock,struct cache *cache = context;if (dirty) { +if (passthrough_mode (cache)) { +DMERR ("%s: cannot enter passthrough mode unless all blocks are clean" , +cache_device_name (cache)); +return -EBUSY ; + } +set_bit (from_cblock (cblock), cache->dirty_bitset);atomic_inc (&cache->nr_dirty); }else
@@ -3082,7 +3073,7 @@ static int cache_preresume(struct dm_target *ti) load_filtered_mapping, cache);if (r) {DMERR ("%s: could not load cache mappings" ,cache_device_name (cache)); -if (r != -EFBIG ) +if (r != -EFBIG && r != -EBUSY )metadata_operation_failed (cache,"dm_cache_load_mappings" , r);return r; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 204/957 dm-mpath: dont stop probing paths at presuspend
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Marzinski <[email protected]>
[ Upstream commit 51d81e14fe6788dc6463064c7517480f2acd2724 ]
Commit 5c977f102315 ("dm-mpath: Don't grab work_mutex while probing paths"), added code to make multipath quit probing paths early, if it was trying to suspend. This isn't necessary. It was just an optimization to try to keep path probing from delaying a suspend. However it causes problems with the intended user of this code, qemu. The path probing code was added because failed ioctls to multipath devices don't cause paths to fail in cases where a regular IO failure would.
If an ioctl to a path failed because the path was down, and the multipath device had passed presuspend, the M_MPATH_PROBE_PATHS ioctl would exit early, without probing the path. The caller would then retry the original ioctl, hoping to use a different path. But if there was only one path in the pathgroup, it would pick the same non-working path again, even if there were working paths in other pathgroups.
ioctls to a suspended dm device will return -EAGAIN, notifying the caller that the device is suspended, but ioctls to a device that is just preparing to suspend won't (and in general, shouldn't). This means that the caller (qemu in this case) would get into a tight loop where it would issue an ioctl that failed, skip probing the paths because the device had already passed presuspend, and start over issuing the ioctl again. This would continue until the multipath device finally fully suspended, or the caller gave up and failed the ioctl.
multipath's path probing code could return -EAGAIN in this case, and the caller could delay a bit before retrying, but the whole purpose of skipping the probe after presuspend was to speed things up, and that would just slow them down. Instead, remove the is_suspending flag, and check dm_suspended() instead to decide whether to exit the probing code early. This means that when the probing code exits early, future ioctls will also be delayed, because the device is fully suspended.
--- drivers/md/dm-mpath.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
drivers/md/dm-mpath.c +2 -7
@@ -102,7 +102,6 @@ struct multipath {struct bio_list queued_bios;struct timer_list nopath_timer;/* Timeout for queue_if_no_path */ -bool is_suspending; };/*
@@ -1748,9 +1747,6 @@ static void multipath_presuspend(struct dm_target *ti) {struct multipath *m = ti->private; -spin_lock_irq (&m->lock); - m->is_suspending = true; -spin_unlock_irq (&m->lock);/* FIXME: bio-based shouldn't need to always disable queue_if_no_path */ if (m->queue_mode ==DM_TYPE_BIO_BASED || !dm_noflush_suspending (m->ti))queue_if_no_path (m, false, true, __func__);
@@ -1773,7 +1769,6 @@ static void multipath_resume(struct dm_target *ti)struct multipath *m = ti->private;spin_lock_irq (&m->lock); - m->is_suspending = false;if (test_bit (MPATHF_SAVED_QUEUE_IF_NO_PATH , &m->flags)) {set_bit (MPATHF_QUEUE_IF_NO_PATH , &m->flags);clear_bit (MPATHF_SAVED_QUEUE_IF_NO_PATH , &m->flags);
@@ -2100,7 +2095,7 @@ static int probe_active_paths(struct multipath *m)if (m->current_pg == m->last_probed_pg) goto skip_probe; } -if (!m->current_pg || m->is_suspending || +if (!m->current_pg ||dm_suspended (m->ti) ||test_bit (MPATHF_QUEUE_IO , &m->flags)) goto skip_probe;set_bit (MPATHF_DELAY_PG_SWITCH , &m->flags);
@@ -2109,7 +2104,7 @@ static int probe_active_paths(struct multipath *m)list_for_each_entry (pgpath, &pg->pgpaths, list) {if (pg !=READ_ONCE (m->current_pg) || -READ_ONCE (m->is_suspending)) +dm_suspended (m->ti)) goto out;if (!pgpath->is_active)continue ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 205/957 platform/chrome: chromeos_tbmc: Drop wakeup source on remove
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
[ Upstream commit 5d441a4bc93642ed6f41da87327a39946b4e1455 ]
The wakeup source added by device_init_wakeup() in chromeos_tbmc_add() needs to be dropped during driver removal, so add a .remove() callback to the driver for this purpose.
--- drivers/platform/chrome/chromeos_tbmc.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/platform/chrome/chromeos_tbmc.c +6 -0
@@ -95,6 +95,11 @@ static int chromeos_tbmc_add(struct acpi_device *adev)return 0 ; } +static void chromeos_tbmc_remove (struct acpi_device *adev) +{ +device_init_wakeup (&adev->dev, false); +} +static const struct acpi_device_id chromeos_tbmc_acpi_device_ids[] = { {ACPI_DRV_NAME ,0 }, { }
@@ -110,6 +115,7 @@ static struct acpi_driver chromeos_tbmc_driver = { .ids = chromeos_tbmc_acpi_device_ids, .ops = { .add = chromeos_tbmc_add, + .remove = chromeos_tbmc_remove, .notify = chromeos_tbmc_notify, }, .drv.pm = &chromeos_tbmc_pm_ops,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 206/957 PCI: dwc: ep: Fix MSI-X Table Size configuration in dw_pcie_ep_set_msix()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aksh Garg <[email protected]>
[ Upstream commit 271d0b1f058ae9815e75233d04b23e3558c3e4f4 ]
In dw_pcie_ep_set_msix(), while updating the MSI-X Table Size value for individual functions, Message Control register is read from the passed function number register space using dw_pcie_ep_readw_dbi(), but always written back to the Function 0's register space using dw_pcie_writew_dbi(). This causes incorrect MSI-X configuration for the rest of the functions, other than Function 0.
Fix this by using dw_pcie_ep_writew_dbi() to write to the correct function's register space, matching the read operation.
--- drivers/pci/controller/dwc/pcie-designware-ep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/controller/dwc/pcie-designware-ep.c +1 -1
@@ -538,7 +538,7 @@ static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no, val =dw_pcie_ep_readw_dbi (ep, func_no, reg); val &= ~PCI_MSIX_FLAGS_QSIZE ; val |= nr_irqs -1 ;/* encoded as N-1 */ -dw_pcie_writew_dbi (pci, reg, val); +dw_pcie_ep_writew_dbi (ep, func_no, reg, val); reg = ep_func->msix_cap +PCI_MSIX_TABLE ; val = offset | bir;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 207/957 PCI: dwc: Invoke post_init in dw_pcie_resume_noirq()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Zhu <[email protected]>
[ Upstream commit c577ce2881f9c76892de5ffc1a122e3ef427ecee ]
In some SoCs like i.MX95, CLKREQ# is pulled low by the controller driver before link up. After link up, if the 'supports-clkreq' property is specified in DT, the driver will release CLKREQ# so that it can go high and the endpoint can pull it low whenever required i.e., during exit from L1 Substates.
Hence, at the end of dw_pcie_resume_noirq(), invoke the '.post_init()' callback if exists to perform the above mentioned action.
Stable-dep-of: edb5ca3262e2 ("PCI: dwc: Perform cleanup in the error path of dw_pcie_resume_noirq()")
--- drivers/pci/controller/dwc/pcie-designware-host.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/pci/controller/dwc/pcie-designware-host.c +3 -0
@@ -1236,6 +1236,9 @@ int dw_pcie_resume_noirq(struct dw_pcie *pci)if (ret)return ret; +if (pci->pp.ops->post_init) + pci->pp.ops->post_init (&pci->pp); +return ret; }EXPORT_SYMBOL_GPL (dw_pcie_resume_noirq);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 208/957 PCI: dwc: Perform cleanup in the error path of dw_pcie_resume_noirq()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manivannan Sadhasivam <[email protected]>
[ Upstream commit edb5ca3262e2255cf938a5948709d3472d4871ad ]
If the dw_pcie_resume_noirq() API fails, it just returns the errno without doing cleanup in the error path, leading to resource leak.
So perform cleanup in the error path.
--- drivers/pci/controller/dwc/pcie-designware-host.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/pci/controller/dwc/pcie-designware-host.c +12 -3
@@ -1230,15 +1230,24 @@ int dw_pcie_resume_noirq(struct dw_pcie *pci) ret =dw_pcie_start_link (pci);if (ret) -return ret; + goto err_deinit; ret =dw_pcie_wait_for_link (pci); -if (ret) -return ret; +if (ret == -ETIMEDOUT ) + goto err_stop_link;if (pci->pp.ops->post_init) pci->pp.ops->post_init (&pci->pp); +return 0 ; + +err_stop_link: +dw_pcie_stop_link (pci); + +err_deinit: +if (pci->pp.ops->deinit) + pci->pp.ops->deinit (&pci->pp); +return ret; }EXPORT_SYMBOL_GPL (dw_pcie_resume_noirq);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 209/957 dm cache metadata: fix memory leak on metadata abort retry
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming-Hung Tsai <[email protected]>
[ Upstream commit 044ca491d4086dc5bf233e9fcb71db52df32f633 ]
When failing to acquire the root_lock in dm_cache_metadata_abort because the block_manager is read-only, the temporary block_manager created outside the root_lock is not properly released, causing a memory leak.
Reproduce steps:
This can be reproduced by reloading a new table while the metadata is read-only. While the second call to dm_cache_metadata_abort is caused by lack of support for table preload in dm-cache, mentioned in commit 9b1cc9f251af ("dm cache: share cache-metadata object across inactive and active DM tables"), it exposes the memory leak in dm_cache_metadata_abort when the function is called multiple times. Specifically, dm-cache fails to sync the new cache object's mode during preresume, creating the reproducer condition.
This issue could also occur through concurrent metadata_operation_failed calls due to races in cache mode updates, but the table preload scenario below provides a reliable reproducer.
1. Create a cache device with some faulty trailing metadata blocks
dmsetup create cmeta <<EOF
0 200 linear /dev/sdc 0
200 7992 error
EOF
dmsetup create cdata --table "0 131072 linear /dev/sdc 8192" dmsetup create corig --table "0 262144 linear /dev/sdc 262144" dd if=/dev/zero of=/dev/mapper/cmeta bs=4k count=1 oflag=direct dmsetup create cache --table "0 131072 cache /dev/mapper/cmeta \/dev/mapper/cdata /dev/mapper/corig 128 1 writethrough smq 0"
2. Suspend and resume the cache to start a new metadata transaction and trigger metadata io errors on the next metadata commit.
dmsetup suspend cache
dmsetup resume cache
3. Write to the cache device to update metadata
fio --filename=/dev/mapper/cache --name test --rw=randwrite --bs=4k \
--randrepeat=0 --direct=1 --size 64k
4. Preload the same table
dmsetup reload cache --table "$(dmsetup table cache)"
5. Resume the new table. This triggers the memory leak.
dmsetup suspend cache
dmsetup resume cache
kmemleak logs:
<snip>
unreferenced object 0xffff8880080c2010 (size 16):
comm "dmsetup", pid 132, jiffies 4294982580
hex dump (first 16 bytes):
00 38 b9 07 80 88 ff ff 6a 6b 6b 6b 6b 6b 6b a5 ...
backtrace (crc 3118f31c):
kmemleak_alloc+0x28/0x40
__kmalloc_cache_noprof+0x3d9/0x510
dm_block_manager_create+0x51/0x140
dm_cache_metadata_abort+0x85/0x320
metadata_operation_failed+0x103/0x1e0
cache_preresume+0xacd/0xe70
dm_table_resume_targets+0xd3/0x320
__dm_resume+0x1b/0xf0
dm_resume+0x127/0x170<snip>
--- drivers/md/dm-cache-metadata.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/md/dm-cache-metadata.c +8 -5
@@ -1023,6 +1023,12 @@ static bool cmd_write_lock(struct dm_cache_metadata *cmd)return ; \ } while (0) +#define WRITE_LOCK_OR_GOTO (cmd, label) \ + do { \ + if (!cmd_write_lock((cmd))) \ + goto label; \ + } while (0) +#define WRITE_UNLOCK (cmd) \ up_write(&(cmd)->root_lock)
@@ -1780,11 +1786,8 @@ int dm_cache_metadata_abort(struct dm_cache_metadata *cmd) new_bm =dm_block_manager_create (cmd->bdev,DM_CACHE_METADATA_BLOCK_SIZE <<SECTOR_SHIFT ,CACHE_MAX_CONCURRENT_LOCKS ); -WRITE_LOCK (cmd); -if (cmd->fail_io) { -WRITE_UNLOCK (cmd); - goto out; - } +/* cmd_write_lock() already checks fail_io with cmd->root_lock held */ +WRITE_LOCK_OR_GOTO (cmd, out);__destroy_persistent_data_objects (cmd, false); old_bm = cmd->bm;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 210/957 dm log: fix out-of-bounds write due to region_count overflow
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit c20e36b7631d83e7535877f08af8b0af72c44b1a ]
The local variable region_count in create_log_context() is declared as unsigned int (32-bit), but dm_sector_div_up() returns sector_t (64-bit). When a device-mapper target has a sufficiently large ti->len with a small region_size, the division result can exceed UINT_MAX. The truncated value is then used to calculate bitset_size, causing clean_bits, sync_bits, and recovering_bits to be allocated far smaller than needed for the actual number of regions.
Subsequent log operations (log_set_bit, log_clear_bit, log_test_bit) use region indices derived from the full untruncated region space, causing out-of-bounds writes to kernel heap memory allocated by vmalloc.
This can be reproduced by creating a mirror target whose region_count overflows 32 bits:
dmsetup create bigzero --table '0 8589934594 zero'
dmsetup create mymirror --table '0 8589934594 mirror \
core 2 2 nosync 2 /dev/mapper/bigzero 0 \
/dev/mapper/bigzero 0'The status output confirms the truncation (sync_count=1 instead of 4294967297, because 0x100000001 was truncated to 1):
$ dmsetup status mymirror 0 8589934594 mirror 2 254:1 254:1 1/4294967297 ...
This leads to a kernel crash in core_in_sync:
BUG: scheduling while atomic: (udev-worker)/9150/0x00000000 RIP: 0010:core_in_sync+0x14/0x30 [dm_log] CR2: 0000000000000008 Fixing recursive fault but reboot is needed!
Fix by widening the local region_count to sector_t and adding an explicit overflow check before the value is assigned to lc->region_count.
--- drivers/md/dm-log.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/md/dm-log.c +5 -1
@@ -373,7 +373,7 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,struct log_c *lc;uint32_t region_size; -unsigned int region_count; +sector_t region_count;size_t bitset_size, buf_size;int r;char dummy;
@@ -401,6 +401,10 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti, } region_count =dm_sector_div_up (ti->len, region_size); +if (region_count >UINT_MAX ) { +DMWARN ("region count exceeds limit of %u" ,UINT_MAX ); +return -EINVAL ; + } lc =kmalloc (sizeof (*lc),GFP_KERNEL );if (!lc) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 211/957 iopoll: fix function parameter names in read_poll_timeout_atomic()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit 878004e2852bc22ce0687c5597d6fe3909fb59f3 ]
Correct the function parameter names to avoid kernel-doc warnings and to emphasize this function is atomic (non-sleeping).
Warning: include/linux/iopoll.h:169 function parameter 'sleep_us' not
described in 'read_poll_timeout_atomic'
Warning: ../include/linux/iopoll.h:169 function parameter
'sleep_before_read' not described in 'read_poll_timeout_atomic'
--- include/linux/iopoll.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
include/linux/iopoll.h +4 -4
@@ -159,7 +159,7 @@* * This macro does not rely on timekeeping. Hence it is safe to call even when * timekeeping is suspended, at the expense of an underestimation of wall clock -* time, which is rather minimal with a non-zero delay_us. +* time, which is rather minimal with a non-zero @delay_us. * * When available, you'll probably want to use one of the specialized * macros defined below rather than this macro directly.
@@ -167,9 +167,9 @@* Returns: 0 on success and -ETIMEDOUT upon a timeout. In either * case, the last read value at @args is stored in @val. */ -#define read_poll_timeout_atomic (op, val, cond, sleep_us, timeout_us, \ - sleep_before_read, args...) \ - poll_timeout_us_atomic((val) = op(args), cond, sleep_us, timeout_us, sleep_before_read) +#define read_poll_timeout_atomic (op, val, cond, delay_us, timeout_us, \ + delay_before_read, args...) \ + poll_timeout_us_atomic((val) = op(args), cond, delay_us, timeout_us, delay_before_read)/** * readx_poll_timeout - Periodically poll an address until a condition is met or a timeout occurs
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 212/957 drm/bridge: cadence: cdns-mhdp8546-core: Set the mhdp connector earlier in atomic_enable()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jayesh Choudhary <[email protected]>
[ Upstream commit 43d6508ddbf9fb974fbc359a033154f78c9d4c8b ]
In case if we get errors in cdns_mhdp_link_up() or cdns_mhdp_reg_read() in atomic_enable, we will go to cdns_mhdp_modeset_retry_fn() and will hit NULL pointer while trying to access the mutex. We need the connector to be set before that. Unlike in legacy cases with flag !DRM_BRIDGE_ATTACH_NO_CONNECTOR, we do not have connector initialised in bridge_attach(), so add the mhdp->connector_ptr in device structure to handle both cases with DRM_BRIDGE_ATTACH_NO_CONNECTOR and !DRM_BRIDGE_ATTACH_NO_CONNECTOR, set it in atomic_enable() earlier to avoid possible NULL pointer dereference in recovery paths like modeset_retry_fn() with the DRM_BRIDGE_ATTACH_NO_CONNECTOR flag set.
--- .../drm/bridge/cadence/cdns-mhdp8546-core.c | 29 ++++++++++--------- .../drm/bridge/cadence/cdns-mhdp8546-core.h | 1 + .../drm/bridge/cadence/cdns-mhdp8546-hdcp.c | 18 +++++++++--- 3 files changed, 30 insertions(+), 18 deletions(-)
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +15 -14
@@ -740,7 +740,7 @@ static void cdns_mhdp_fw_cb(const struct firmware *fw, void *context) bridge_attached = mhdp->bridge_attached;spin_unlock (&mhdp->start_lock);if (bridge_attached) { -if (mhdp->connector.dev) +if (mhdp->connector_ptr)drm_kms_helper_hotplug_event (mhdp->bridge.dev);else drm_bridge_hpd_notify (&mhdp->bridge,cdns_mhdp_detect (mhdp));
@@ -1636,6 +1636,7 @@ static int cdns_mhdp_connector_init(struct cdns_mhdp_device *mhdp)return ret; } + mhdp->connector_ptr = conn;drm_connector_helper_add (conn, &cdns_mhdp_conn_helper_funcs); ret = drm_display_info_set_bus_formats(&conn->display_info,
@@ -1915,17 +1916,25 @@ static void cdns_mhdp_atomic_enable(struct drm_bridge *bridge,struct cdns_mhdp_device *mhdp =bridge_to_mhdp (bridge);struct cdns_mhdp_bridge_state *mhdp_state;struct drm_crtc_state *crtc_state; -struct drm_connector *connector;struct drm_connector_state *conn_state;struct drm_bridge_state *new_state;const struct drm_display_mode *mode;u32 resp; -int ret; +int ret =0 ;dev_dbg (mhdp->dev,"bridge enable\n" );mutex_lock (&mhdp->link_mutex); + mhdp->connector_ptr =drm_atomic_get_new_connector_for_encoder (state, + bridge->encoder); +if (WARN_ON (!mhdp->connector_ptr)) + goto out; + + conn_state =drm_atomic_get_new_connector_state (state, mhdp->connector_ptr); +if (WARN_ON (!conn_state)) + goto out; +if (mhdp->plugged && !mhdp->link_up) { ret =cdns_mhdp_link_up (mhdp);if (ret <0 )
@@ -1945,15 +1954,6 @@ static void cdns_mhdp_atomic_enable(struct drm_bridge *bridge,cdns_mhdp_reg_write (mhdp,CDNS_DPTX_CAR , resp |CDNS_VIF_CLK_EN |CDNS_VIF_CLK_RSTN ); - connector =drm_atomic_get_new_connector_for_encoder (state, - bridge->encoder); -if (WARN_ON (!connector)) - goto out; - - conn_state =drm_atomic_get_new_connector_state (state, connector); -if (WARN_ON (!conn_state)) - goto out; -if (mhdp->hdcp_supported && mhdp->hw_state ==MHDP_HW_READY && conn_state->content_protection ==
@@ -2030,6 +2030,7 @@ static void cdns_mhdp_atomic_disable(struct drm_bridge *bridge,if (mhdp->info && mhdp->info->ops && mhdp->info->ops->disable) mhdp->info->ops->disable (mhdp); + mhdp->connector_ptr =NULL ;mutex_unlock (&mhdp->link_mutex); }
@@ -2296,7 +2297,7 @@ static void cdns_mhdp_modeset_retry_fn(struct work_struct *work) mhdp =container_of (work,typeof (*mhdp), modeset_retry_work); - conn = &mhdp->connector; + conn = mhdp->connector_ptr;/* Grab the locks before changing connector property */ mutex_lock (&conn->dev->mode_config.mutex);
@@ -2373,7 +2374,7 @@ static void cdns_mhdp_hpd_work(struct work_struct *work)int ret; ret =cdns_mhdp_update_link_status (mhdp); -if (mhdp->connector.dev) { +if (mhdp->connector_ptr) {if (ret <0 )schedule_work (&mhdp->modeset_retry_work);else
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.h +1 -0
@@ -376,6 +376,7 @@ struct cdns_mhdp_device {struct mutex link_mutex;struct drm_connector connector; +struct drm_connector *connector_ptr;struct drm_bridge bridge;struct cdns_mhdp_link link;
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-hdcp.c +14 -4
@@ -394,7 +394,7 @@ static int _cdns_mhdp_hdcp_disable(struct cdns_mhdp_device *mhdp)int ret;dev_dbg (mhdp->dev,"[%s:%d] HDCP is being disabled...\n" , - mhdp->connector.name, mhdp->connector.base.id); + mhdp->connector_ptr->name, mhdp->connector_ptr->base.id); ret =cdns_mhdp_hdcp_set_config (mhdp,0 , false);
@@ -436,6 +436,10 @@ static int cdns_mhdp_hdcp_check_link(struct cdns_mhdp_device *mhdp)int ret =0 ;mutex_lock (&mhdp->hdcp.mutex); + +if (!mhdp->connector_ptr) + goto out; +if (mhdp->hdcp.value ==DRM_MODE_CONTENT_PROTECTION_UNDESIRED ) goto out;
@@ -445,7 +449,7 @@ static int cdns_mhdp_hdcp_check_link(struct cdns_mhdp_device *mhdp)dev_err (mhdp->dev,"[%s:%d] HDCP link failed, retrying authentication\n" , - mhdp->connector.name, mhdp->connector.base.id); + mhdp->connector_ptr->name, mhdp->connector_ptr->base.id); ret =_cdns_mhdp_hdcp_disable (mhdp);if (ret) {
@@ -487,13 +491,19 @@ static void cdns_mhdp_hdcp_prop_work(struct work_struct *work)struct cdns_mhdp_device *mhdp =container_of (hdcp, struct cdns_mhdp_device, hdcp); -struct drm_device *dev = mhdp->connector.dev; +struct drm_device *dev =NULL ;struct drm_connector_state *state; +if (mhdp->connector_ptr) + dev = mhdp->connector_ptr->dev; + +if (!dev) +return ; +drm_modeset_lock (&dev->mode_config.connection_mutex,NULL );mutex_lock (&mhdp->hdcp.mutex);if (mhdp->hdcp.value !=DRM_MODE_CONTENT_PROTECTION_UNDESIRED ) { - state = mhdp->connector.state; + state = mhdp->connector_ptr->state; state->content_protection = mhdp->hdcp.value; }mutex_unlock (&mhdp->hdcp.mutex);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 213/957 drm/bridge: cadence: cdns-mhdp8546-core: Add mode_valid hook to drm_bridge_funcs
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jayesh Choudhary <[email protected]>
[ Upstream commit 6dbff34016052b099558b76632e4983e2df13fed ]
Add cdns_mhdp_bridge_mode_valid() to check if specific mode is valid for this bridge or not. In the legacy usecase with !DRM_BRIDGE_ATTACH_NO_CONNECTOR we were using the hook from drm_connector_helper_funcs but with DRM_BRIDGE_ATTACH_NO_CONNECTOR we need to have mode_valid() in drm_bridge_funcs.
Without this patch, when using DRM_BRIDGE_ATTACH_NO_CONNECTOR flag, the cdns_mhdp_bandwidth_ok() function would not be called during mode validation, potentially allowing modes that exceed the bridge's bandwidth capabilities to be incorrectly marked as valid.
--- .../drm/bridge/cadence/cdns-mhdp8546-core.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +20 -0
@@ -2162,6 +2162,25 @@ static const struct drm_edid *cdns_mhdp_bridge_edid_read(struct drm_bridge *bridreturn cdns_mhdp_edid_read (mhdp, connector); } +static enum drm_mode_status +cdns_mhdp_bridge_mode_valid (struct drm_bridge *bridge, +const struct drm_display_info *info, +const struct drm_display_mode *mode) +{ +struct cdns_mhdp_device *mhdp =bridge_to_mhdp (bridge); + +mutex_lock (&mhdp->link_mutex); + +if (!cdns_mhdp_bandwidth_ok (mhdp, mode, mhdp->link.num_lanes, + mhdp->link.rate)) { +mutex_unlock (&mhdp->link_mutex); +return MODE_CLOCK_HIGH ; + } + +mutex_unlock (&mhdp->link_mutex); +return MODE_OK ; +} +static const struct drm_bridge_funcs cdns_mhdp_bridge_funcs = { .atomic_enable = cdns_mhdp_atomic_enable, .atomic_disable = cdns_mhdp_atomic_disable,
@@ -2176,6 +2195,7 @@ static const struct drm_bridge_funcs cdns_mhdp_bridge_funcs = { .edid_read = cdns_mhdp_bridge_edid_read, .hpd_enable = cdns_mhdp_bridge_hpd_enable, .hpd_disable = cdns_mhdp_bridge_hpd_disable, + .mode_valid = cdns_mhdp_bridge_mode_valid, };static bool cdns_mhdp_detect_hpd (struct cdns_mhdp_device *mhdp,bool *hpd_pulse)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 214/957 drm/bridge: cadence: cdns-mhdp8546-core: Handle HDCP state in bridge atomic check
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harikrishna Shenoy <[email protected]>
[ Upstream commit 4a8edd658489ec2a3d7e20482fa9e8d366153d8d ]
Now that we have DRM_BRIDGE_ATTACH_NO_CONNECTOR framework, handle the HDCP state change in bridge atomic check as well to enable correct functioning for HDCP in both DRM_BRIDGE_ATTACH_NO_CONNECTOR and !DRM_BRIDGE_ATTACH_NO_CONNECTOR case.
Without this patch, when using DRM_BRIDGE_ATTACH_NO_CONNECTOR flag, HDCP state changes would not be properly handled during atomic commits, potentially leading to HDCP authentication failures or incorrect protection status for content requiring HDCP encryption.
--- .../drm/bridge/cadence/cdns-mhdp8546-core.c | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +23 -0
@@ -2123,6 +2123,10 @@ static int cdns_mhdp_atomic_check(struct drm_bridge *bridge, {struct cdns_mhdp_device *mhdp =bridge_to_mhdp (bridge);const struct drm_display_mode *mode = &crtc_state->adjusted_mode; +struct drm_connector_state *old_state, *new_state; +struct drm_atomic_state *state = crtc_state->state; +struct drm_connector *conn = mhdp->connector_ptr; +u64 old_cp, new_cp;mutex_lock (&mhdp->link_mutex);
@@ -2142,6 +2146,25 @@ static int cdns_mhdp_atomic_check(struct drm_bridge *bridge,if (mhdp->info) bridge_state->input_bus_cfg.flags = *mhdp->info->input_bus_flags; +if (conn && mhdp->hdcp_supported) { + old_state =drm_atomic_get_old_connector_state (state, conn); + new_state =drm_atomic_get_new_connector_state (state, conn); + old_cp = old_state->content_protection; + new_cp = new_state->content_protection; + +if (old_state->hdcp_content_type != new_state->hdcp_content_type && + new_cp !=DRM_MODE_CONTENT_PROTECTION_UNDESIRED ) { + new_state->content_protection =DRM_MODE_CONTENT_PROTECTION_DESIRED ; + crtc_state =drm_atomic_get_new_crtc_state (state, new_state->crtc); + crtc_state->mode_changed = true; + } + +if (!new_state->crtc) { +if (old_cp ==DRM_MODE_CONTENT_PROTECTION_ENABLED ) + new_state->content_protection =DRM_MODE_CONTENT_PROTECTION_DESIRED ; + } + } +mutex_unlock (&mhdp->link_mutex);return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 215/957 spi: nxp-fspi: Use reinit_completion() for repeated operations
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit 68c8c93fdb0de7e528dc3dfb1d17eb0f652259b8 ]
The driver currently calls init_completion() during every spi_mem_op. Tchnically it may work, but it's not the recommended pattern.
According to the kernel documentation: Calling init_completion() on the same completion object twice is most likely a bug as it re-initializes the queue to an empty queue and enqueued tasks could get "lost" - use reinit_completion() in that case, but be aware of other races.
So moves the initial initialization to probe function and uses reinit_completion() for subsequent operations.
--- drivers/spi/spi-nxp-fspi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/spi/spi-nxp-fspi.c +2 -1
@@ -996,7 +996,7 @@ static int nxp_fspi_do_op(struct nxp_fspi *f, const struct spi_mem_op *op) reg = reg |FSPI_IPRXFCR_CLR ;fspi_writel (f, reg, base +FSPI_IPRXFCR ); -init_completion (&f->c); +reinit_completion (&f->c);fspi_writel (f, op->addr.val, base +FSPI_IPCR0 );/*
@@ -1365,6 +1365,7 @@ static int nxp_fspi_probe(struct platform_device *pdev)if (ret <0 )return dev_err_probe (dev, ret,"Failed to disable clock" ); +init_completion (&f->c); ret =devm_request_irq (dev, irq, nxp_fspi_irq_handler,0 , pdev->name, f);if (ret)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 216/957 spi: fsl-qspi: Use reinit_completion() for repeated operations
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit 981b080a79724738882b0af1c5bb7ade30d94f24 ]
The driver currently calls init_completion() during every spi_mem_op. Tchnically it may work, but it's not the recommended pattern.
According to the kernel documentation: Calling init_completion() on the same completion object twice is most likely a bug as it re-initializes the queue to an empty queue and enqueued tasks could get "lost" - use reinit_completion() in that case, but be aware of other races.
So moves the initial initialization to probe function and uses reinit_completion() for subsequent operations.
--- drivers/spi/spi-fsl-qspi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/spi/spi-fsl-qspi.c +2 -1
@@ -607,7 +607,7 @@ static int fsl_qspi_do_op(struct fsl_qspi *q, const struct spi_mem_op *op)void __iomem *base = q->iobase;int err =0 ; -init_completion (&q->c); +reinit_completion (&q->c);/* * Always start the sequence at the same index since we update
@@ -928,6 +928,7 @@ static int fsl_qspi_probe(struct platform_device *pdev)if (ret <0 )return ret; +init_completion (&q->c); ret =devm_request_irq (dev, ret, fsl_qspi_irq_handler,0 , pdev->name, q);if (ret) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 217/957 media: i2c: og01a1b: Fix V4L2 subdevice data initialization on probe
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Zapolskiy <[email protected]>
[ Upstream commit 535b7f106991c7d8f0e5b8e1769bfb8b1ce9d3d6 ]
It's necessary to finalize the camera sensor subdevice initialization on driver probe and clean V4L2 subdevice data up on error paths and driver removal.
The change fixes a previously reported by v4l2-compliance issue of the failed VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT test:
fail: v4l2-test-controls.cpp(1104): subscribe event for control 'User Controls' failed
--- drivers/media/i2c/og01a1b.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/media/i2c/og01a1b.c +12 -1
@@ -1042,6 +1042,7 @@ static void og01a1b_remove(struct i2c_client *client)struct og01a1b *og01a1b =to_og01a1b (sd);v4l2_async_unregister_subdev (sd); +v4l2_subdev_cleanup (&og01a1b->sd);media_entity_cleanup (&sd->entity);v4l2_ctrl_handler_free (sd->ctrl_handler);pm_runtime_disable (og01a1b->dev);
@@ -1153,11 +1154,18 @@ static int og01a1b_probe(struct i2c_client *client) goto probe_error_v4l2_ctrl_handler_free; } + ret =v4l2_subdev_init_finalize (&og01a1b->sd); +if (ret <0 ) { +dev_err_probe (og01a1b->dev, ret, +"failed to finalize subdevice init\n" ); + goto probe_error_media_entity_cleanup; + } + ret =v4l2_async_register_subdev_sensor (&og01a1b->sd);if (ret <0 ) {dev_err (og01a1b->dev,"failed to register V4L2 subdev: %d" , ret); - goto probe_error_media_entity_cleanup; + goto probe_error_v4l2_subdev_cleanup; }/* Enable runtime PM and turn off the device */
@@ -1167,6 +1175,9 @@ static int og01a1b_probe(struct i2c_client *client)return 0 ; +probe_error_v4l2_subdev_cleanup: +v4l2_subdev_cleanup (&og01a1b->sd); + probe_error_media_entity_cleanup:media_entity_cleanup (&og01a1b->sd.entity);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 218/957 drm/amd/pm: Fix xgmi max speed reporting
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lijo Lazar <[email protected]>
[ Upstream commit da16822ce5c32b5aca848eaea521936d4410d48c ]
Fix XGMI max bitrate/width reporting on SMUv13.0.12 SOCs. The data format got changed when moved to static table from dynamic metrics table.
--- drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c +3 -2
@@ -248,8 +248,9 @@ static void smu_v13_0_12_init_xgmi_data(struct smu_context *smu,int ret;if (smu_table->tables[SMU_TABLE_SMU_METRICS ].version >=0x13 ) { - max_width = (uint8_t )static_metrics->MaxXgmiWidth; - max_speed = (uint16_t )static_metrics->MaxXgmiBitrate; + max_width = (uint8_t )SMUQ10_ROUND (static_metrics->MaxXgmiWidth); + max_speed = + (uint16_t )SMUQ10_ROUND (static_metrics->MaxXgmiBitrate); ret =0 ; }else {MetricsTable_t *metrics = (MetricsTable_t *)smu_table->metrics_table;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 219/957 selftests/sched_ext: Add missing error check for exit__load()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Carlier <[email protected]>
[ Upstream commit 1d02346fec8d13b05e54296ddc6ae29b7e1067df ]
exit__load(skel) was called without checking its return value. Every other test in the suite wraps the load call with SCX_FAIL_IF(). Add the missing check to be consistent with the rest of the test suite.
--- tools/testing/selftests/sched_ext/exit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/sched_ext/exit.c +1 -1
@@ -33,7 +33,7 @@ static enum scx_test_status run(void *ctx) skel =exit__open ();SCX_ENUM_INIT (skel); skel->rodata->exit_point = tc; -exit__load (skel); +SCX_FAIL_IF (exit__load (skel),"Failed to load skel" ); link =bpf_map__attach_struct_ops (skel->maps.exit_ops);if (!link) {SCX_ERR ("Failed to attach scheduler" );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 220/957 drm/v3d: Handle error from drm_sched_entity_init()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maíra Canal <[email protected]>
[ Upstream commit 8cf1bec37b27846ad3169744c9f1a89a06dcb3fa ]
drm_sched_entity_init() can fail but its return value is currently being ignored in v3d_open(). Check the return value and properly unwind on failure by destroying any already-initialized scheduler entities.
--- drivers/gpu/drm/v3d/v3d_drv.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/gpu/drm/v3d/v3d_drv.c +12 -4
@@ -130,7 +130,7 @@ v3d_open(struct drm_device *dev, struct drm_file *file)struct v3d_dev *v3d =to_v3d_dev (dev);struct v3d_file_priv *v3d_priv;struct drm_gpu_scheduler *sched; -int i; +int i, ret; v3d_priv =kzalloc (sizeof (*v3d_priv),GFP_KERNEL );if (!v3d_priv)
@@ -140,9 +140,11 @@ v3d_open(struct drm_device *dev, struct drm_file *file)for (i =0 ; i <V3D_MAX_QUEUES ; i++) { sched = &v3d->queue[i].sched; -drm_sched_entity_init (&v3d_priv->sched_entity[i], -DRM_SCHED_PRIORITY_NORMAL , &sched, -1 ,NULL ); + ret =drm_sched_entity_init (&v3d_priv->sched_entity[i], +DRM_SCHED_PRIORITY_NORMAL , &sched, +1 ,NULL ); +if (ret) + goto err_sched;memset (&v3d_priv->stats[i],0 ,sizeof (v3d_priv->stats[i]));seqcount_init (&v3d_priv->stats[i].lock);
@@ -152,6 +154,12 @@ v3d_open(struct drm_device *dev, struct drm_file *file) file->driver_priv = v3d_priv;return 0 ; + +err_sched: +for (i--; i >=0 ; i--) +drm_sched_entity_destroy (&v3d_priv->sched_entity[i]); +kfree (v3d_priv); +return ret; } static void
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 221/957 drm/sun4i: Fix resource leaks
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ethan Tidmore <[email protected]>
[ Upstream commit 127367ad2e0f4870de60c6d719ae82ecf68d674c ]
Three clocks are not being released in devm_regmap_init_mmio() error path.
Add proper goto and set ret to the error code.
--- drivers/gpu/drm/sun4i/sun4i_backend.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/sun4i/sun4i_backend.c +2 -1
@@ -880,7 +880,8 @@ static int sun4i_backend_bind(struct device *dev, struct device *master, &sun4i_backend_regmap_config);if (IS_ERR (backend->engine.regs)) {dev_err (dev,"Couldn't create the backend regmap\n" ); -return PTR_ERR (backend->engine.regs); + ret =PTR_ERR (backend->engine.regs); + goto err_disable_ram_clk; }list_add_tail (&backend->engine.list, &drv->engine_list);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 222/957 crypto: inside-secure/eip93 - register hash before authenc algorithms
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit 5377032914b29b4643adece0ff1dfc67e36700f4 ]
Register hash before hmac and authenc algorithms. This will ensure selftests pass at startup. Previously, selftests failed on the crypto_alloc_ahash() function since the associated algorithm was not yet registered.
Fixes following error:
...
[ 18.375811] alg: self-tests for authenc(hmac(sha1),cbc(aes)) using authenc(hmac(sha1-eip93),cbc(aes-eip93)) failed (rc=-2) [ 18.382140] alg: self-tests for authenc(hmac(sha224),rfc3686(ctr(aes))) using authenc(hmac(sha224-eip93),rfc3686(ctr(aes-eip93))) failed (rc=-2) [ 18.395029] alg: aead: authenc(hmac(sha256-eip93),cbc(des-eip93)) setkey failed on test vector 0; expected_error=0, actual_error=-2, flags=0x1 [ 18.409734] alg: aead: authenc(hmac(md5-eip93),cbc(des3_ede-eip93)) setkey failed on test vector 0; expected_error=0, actual_error=-2, flags=0x1
...
--- drivers/crypto/inside-secure/eip93/eip93-main.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/crypto/inside-secure/eip93/eip93-main.c +8 -8
@@ -36,6 +36,14 @@ static struct eip93_alg_template *eip93_algs[] = { &eip93_alg_cbc_aes, &eip93_alg_ctr_aes, &eip93_alg_rfc3686_aes, + &eip93_alg_md5, + &eip93_alg_sha1, + &eip93_alg_sha224, + &eip93_alg_sha256, + &eip93_alg_hmac_md5, + &eip93_alg_hmac_sha1, + &eip93_alg_hmac_sha224, + &eip93_alg_hmac_sha256, &eip93_alg_authenc_hmac_md5_cbc_des, &eip93_alg_authenc_hmac_sha1_cbc_des, &eip93_alg_authenc_hmac_sha224_cbc_des,
@@ -52,14 +60,6 @@ static struct eip93_alg_template *eip93_algs[] = { &eip93_alg_authenc_hmac_sha1_rfc3686_aes, &eip93_alg_authenc_hmac_sha224_rfc3686_aes, &eip93_alg_authenc_hmac_sha256_rfc3686_aes, - &eip93_alg_md5, - &eip93_alg_sha1, - &eip93_alg_sha224, - &eip93_alg_sha256, - &eip93_alg_hmac_md5, - &eip93_alg_hmac_sha1, - &eip93_alg_hmac_sha224, - &eip93_alg_hmac_sha256, };inline void eip93_irq_disable (struct eip93_device *eip93,u32 mask)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 223/957 iommu/riscv: Add IOTINVAL after updating DDT/PDT entries
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fangyu Yu <[email protected]>
[ Upstream commit f5c262b544975e067ea265fc7403aefbbea8563e ]
Add riscv_iommu_iodir_iotinval() to perform required TLB and context cache invalidations after updating DDT or PDT entries, as mandated by the RISC-V IOMMU specification (Section 6.3.1 and 6.3.2).
--- drivers/iommu/riscv/iommu.c | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+)
drivers/iommu/riscv/iommu.c +70 -0
@@ -996,7 +996,67 @@ static void riscv_iommu_iotlb_inval(struct riscv_iommu_domain *domain, }#define RISCV_IOMMU_FSC_BARE 0 +/* +* This function sends IOTINVAL commands as required by the RISC-V +* IOMMU specification (Section 6.3.1 and 6.3.2 in 1.0 spec version) +* after modifying DDT or PDT entries +*/ +static void riscv_iommu_iodir_iotinval (struct riscv_iommu_device *iommu, +bool inval_pdt,unsigned long iohgatp, +struct riscv_iommu_dc *dc, +struct riscv_iommu_pc *pc) +{ +struct riscv_iommu_command cmd; + +riscv_iommu_cmd_inval_vma (&cmd); +if (FIELD_GET (RISCV_IOMMU_DC_IOHGATP_MODE , iohgatp) == +RISCV_IOMMU_DC_IOHGATP_MODE_BARE ) { +if (inval_pdt) { +/* +* IOTINVAL.VMA with GV=AV=0, and PSCV=1, and +* PSCID=PC.PSCID +*/ +riscv_iommu_cmd_inval_set_pscid (&cmd, +FIELD_GET (RISCV_IOMMU_PC_TA_PSCID , pc->ta)); + }else { +if (!FIELD_GET (RISCV_IOMMU_DC_TC_PDTV , dc->tc) && +FIELD_GET (RISCV_IOMMU_DC_FSC_MODE , dc->fsc) != +RISCV_IOMMU_DC_FSC_MODE_BARE ) { +/* +* DC.tc.PDTV == 0 && DC.fsc.MODE != Bare +* IOTINVAL.VMA with GV=AV=0, and PSCV=1, and +* PSCID=DC.ta.PSCID +*/ +riscv_iommu_cmd_inval_set_pscid (&cmd, +FIELD_GET (RISCV_IOMMU_DC_TA_PSCID , dc->ta)); + } +/* else: IOTINVAL.VMA with GV=AV=PSCV=0 */ + } + }else { +riscv_iommu_cmd_inval_set_gscid (&cmd, +FIELD_GET (RISCV_IOMMU_DC_IOHGATP_GSCID , iohgatp)); + +if (inval_pdt) { +/* +* IOTINVAL.VMA with GV=1, AV=0, and PSCV=1, and +* GSCID=DC.iohgatp.GSCID, PSCID=PC.PSCID +*/ +riscv_iommu_cmd_inval_set_pscid (&cmd, +FIELD_GET (RISCV_IOMMU_PC_TA_PSCID , pc->ta)); + } +/* +* else: IOTINVAL.VMA with GV=1,AV=PSCV=0,and +* GSCID=DC.iohgatp.GSCID +* +* IOTINVAL.GVMA with GV=1,AV=0,and +* GSCID=DC.iohgatp.GSCID +* TODO: For now, the Second-Stage feature have not yet been merged, +* also issue IOTINVAL.GVMA once second-stage support is merged. +*/ + } +riscv_iommu_cmd_send (iommu, &cmd); +}/* * Update IODIR for the device. *
@@ -1031,6 +1091,11 @@ static void riscv_iommu_iodir_update(struct riscv_iommu_device *iommu,riscv_iommu_cmd_iodir_inval_ddt (&cmd);riscv_iommu_cmd_iodir_set_did (&cmd, fwspec->ids[i]);riscv_iommu_cmd_send (iommu, &cmd); +/* +* For now, the SVA and PASID features have not yet been merged, the +* default configuration is inval_pdt=false and pc=NULL. +*/ +riscv_iommu_iodir_iotinval (iommu, false, dc->iohgatp, dc,NULL ); sync_required = true; }
@@ -1056,6 +1121,11 @@ static void riscv_iommu_iodir_update(struct riscv_iommu_device *iommu,riscv_iommu_cmd_iodir_inval_ddt (&cmd);riscv_iommu_cmd_iodir_set_did (&cmd, fwspec->ids[i]);riscv_iommu_cmd_send (iommu, &cmd); +/* +* For now, the SVA and PASID features have not yet been merged, the +* default configuration is inval_pdt=false and pc=NULL. +*/ +riscv_iommu_iodir_iotinval (iommu, false, dc->iohgatp, dc,NULL ); }riscv_iommu_cmd_sync (iommu,RISCV_IOMMU_IOTINVAL_TIMEOUT );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 224/957 iommu/riscv: Add missing GENERIC_MSI_IRQ
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
[ Upstream commit c70d20b25ca30d68b377b9363a2adca6eb2538e3 ]
The commit below added MSI related calls to the driver that depends on GENERIC_MSI_IRQ. It is possible to build RISC-V without this selected.
This is also necessary to make the driver COMPILE_TEST.
--- drivers/iommu/riscv/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/iommu/riscv/Kconfig +1 -0
@@ -4,6 +4,7 @@ config RISCV_IOMMU bool "RISC-V IOMMU Support" depends on RISCV && 64BIT + depends on GENERIC_MSI_IRQ default y select IOMMU_API help
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 225/957 iommu/riscv: Stop polling when CQCSR reports an error
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fangyu Yu <[email protected]>
[ Upstream commit b2e5684558edf3e9bbe18d0e0043854994eab1be ]
The cmdq wait loop busy-polls the consumer index until it advances or the software timeout expires. If the IOMMU has already signaled a command queue failure in CQCSR, continuing to poll for progress is pointless.
Make riscv_iommu_queue_wait() also terminate the poll when any of these CQCSR error bits are observed.
This helps the caller return earlier in failure cases and avoids spinning until the full timeout interval when the hardware has already reported an error. On single-core systems in particular, the current busy-wait can delay servicing the command-timeout interrupt until the software timeout expires (90s by default).
--- drivers/iommu/riscv/iommu.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/iommu/riscv/iommu.c +3 -0
@@ -368,6 +368,8 @@ static int riscv_iommu_queue_wait(struct riscv_iommu_queue *queue, unsigned int timeout_us) {unsigned int cons =atomic_read (&queue->head); +unsigned int flags =RISCV_IOMMU_CQCSR_CQMF |RISCV_IOMMU_CQCSR_CMD_TO | +RISCV_IOMMU_CQCSR_CMD_ILL ;/* Already processed by the consumer */ if ((int )(cons - index) >0 )
@@ -375,6 +377,7 @@ static int riscv_iommu_queue_wait(struct riscv_iommu_queue *queue,/* Monitor consumer index */ return readx_poll_timeout (riscv_iommu_queue_cons, queue, cons, + (riscv_iommu_readl (queue->iommu, queue->qcr) & flags) || (int )(cons - index) >0 ,0 , timeout_us); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 226/957 drm/amdgpu: Add default case in DVI mode validation
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit e6020a55b8e364d15eac27f9c788e13114eec6b7 ]
amdgpu_connector_dvi_mode_valid() assigns max_digital_pixel_clock_khz based on connector_object_id using a switch statement that lacks a default case.
In practice this code path should never be hit because the existing cases already cover all digital connector types that this function is used for. This is also legacy display code which is not used for new hardware.
Add a default case returning MODE_BAD to make the switch exhaustive and silence the static analyzer smatch error. The new branch is effectively defensive and should never be reached during normal operation.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +2 -0
@@ -1244,6 +1244,8 @@ static enum drm_mode_status amdgpu_connector_dvi_mode_valid(struct drm_connectorcase CONNECTOR_OBJECT_ID_HDMI_TYPE_B : max_digital_pixel_clock_khz = max_dvi_single_link_pixel_clock *2 ;break ; +default : +return MODE_BAD ; }/* When the display EDID claims that it's an HDMI display,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 227/957 dm init: ensure device probing has finished in dm-mod.waitfor=
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guillaume Gonnet <[email protected]>
[ Upstream commit 99a2312f69805f4ba92d98a757625e0300a747ab ]
The early_lookup_bdev() function returns successfully when the disk device is present but not necessarily its partitions. In this situation, dm_early_create() fails as the partition block device does not exist yet.
In my case, this phenomenon occurs quite often because the device is an SD card with slow reading times, on which kernel takes time to enumerate available partitions.
Fortunately, the underlying device is back to "probing" state while enumerating partitions. Waiting for all probing to end is enough to fix this issue.
That's also the reason why this problem never occurs with rootwait=
parameter: the while loop inside wait_for_root() explicitly waits for probing to be done and then the function calls async_synchronize_full(). These lines were omitted in 035641b, even though the commit says it's based on the rootwait logic...
Anyway, calling wait_for_device_probe() after our while loop does the job (it both waits for probing and calls async_synchronize_full).
--- drivers/md/dm-init.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/md/dm-init.c +3 -1
@@ -303,8 +303,10 @@ static int __init dm_init_init(void) } } -if (waitfor[0 ]) +if (waitfor[0 ]) { +wait_for_device_probe ();DMINFO ("all devices available" ); + }list_for_each_entry (dev, &devices, list) { if (dm_early_create(&dev->dmi, dev->table,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 228/957 fbdev: matroxfb: Mark variable with __maybe_unused to avoid W=1 build break
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit caf6144053b4e1c815aa56afb54745a176f999df ]
Clang is not happy about set but unused variable:
drivers/video/fbdev/matrox/g450_pll.c:412:18: error: variable 'mnp' set but not used
412 | unsigned int mnp;
| ^
1 error generated.
Since the commit 7b987887f97b ("video: fbdev: matroxfb: remove dead code and set but not used variable") the 'mnp' became unused, but eliminating that code might have side-effects. The question here is what should we do with 'mnp'? The easiest way out is just mark it with __maybe_unused which will shut the compiler up and won't change any possible IO flow. So does this change.
A dive into the history of the driver:
The problem was revealed when the #if 0 guarded code along with unused pixel_vco variable was removed. That code was introduced in the original commit 213d22146d1f ("[PATCH] (1/3) matroxfb for 2.5.3"). And then guarded in the commit 705e41f82988 ("matroxfb DVI updates: Handle DVI output on G450/G550. Powerdown unused portions of G450/G550 DAC. Split G450/G550 DAC from older DAC1064 handling. Modify PLL setting when both CRTCs use same pixel clocks.").
NOTE: The two commits mentioned above pre-date Git era and available in history.git repository for archaeological purposes.
Even without that guard the modern compilers may see that the pixel_vco wasn't ever used and seems a leftover after some debug or review made 25 years ago.
The g450_mnp2vco() doesn't have any IO and as Jason said doesn't seem to have any side effects either than some unneeded CPU processing during runtime. I agree that's unlikely that timeout (or heating up the CPU) has any effect on the HW (GPU/display) functionality.
--- drivers/video/fbdev/matrox/g450_pll.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/fbdev/matrox/g450_pll.c +1 -1
@@ -409,7 +409,7 @@ static int __g450_setclk(struct matrox_fb_info *minfo, unsigned int fout,case M_VIDEO_PLL : {u_int8_t tmp; -unsigned int mnp; +unsigned int mnp__maybe_unused ;unsigned long flags;matroxfb_DAC_lock_irqsave (flags);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 229/957 crypto: tegra - Disable softirqs before finalizing request
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit 2aeec9af775fb53aa086419b953302c6f4ad4984 ]
Softirqs must be disabled when calling the finalization fucntion on a request.
--- drivers/crypto/tegra/tegra-se-aes.c | 9 +++++++++ drivers/crypto/tegra/tegra-se-hash.c | 3 +++ 2 files changed, 12 insertions(+)
drivers/crypto/tegra/tegra-se-aes.c +9 -0
@@ -4,6 +4,7 @@* Crypto driver to handle block cipher algorithms using NVIDIA Security Engine. */ +#include <linux/bottom_half.h> #include <linux/clk.h> #include <linux/dma-mapping.h> #include <linux/module.h>
@@ -333,7 +334,9 @@ static int tegra_aes_do_one_req(struct crypto_engine *engine, void *areq)tegra_key_invalidate_reserved (ctx->se, key2_id, ctx->alg); out_finalize: +local_bh_disable ();crypto_finalize_skcipher_request (se->engine, req, ret); +local_bh_enable ();return 0 ; }
@@ -1262,7 +1265,9 @@ static int tegra_ccm_do_one_req(struct crypto_engine *engine, void *areq)tegra_key_invalidate_reserved (ctx->se, rctx->key_id, ctx->alg); out_finalize: +local_bh_disable ();crypto_finalize_aead_request (ctx->se->engine, req, ret); +local_bh_enable ();return 0 ; }
@@ -1348,7 +1353,9 @@ static int tegra_gcm_do_one_req(struct crypto_engine *engine, void *areq)tegra_key_invalidate_reserved (ctx->se, rctx->key_id, ctx->alg); out_finalize: +local_bh_disable ();crypto_finalize_aead_request (ctx->se->engine, req, ret); +local_bh_enable ();return 0 ; }
@@ -1746,7 +1753,9 @@ static int tegra_cmac_do_one_req(struct crypto_engine *engine, void *areq)if (tegra_key_is_reserved (rctx->key_id))tegra_key_invalidate_reserved (ctx->se, rctx->key_id, ctx->alg); +local_bh_disable ();crypto_finalize_hash_request (se->engine, req, ret); +local_bh_enable ();return 0 ; }
drivers/crypto/tegra/tegra-se-hash.c +3 -0
@@ -4,6 +4,7 @@* Crypto driver to handle HASH algorithms using NVIDIA Security Engine. */ +#include <linux/bottom_half.h> #include <linux/clk.h> #include <linux/dma-mapping.h> #include <linux/module.h>
@@ -546,7 +547,9 @@ static int tegra_sha_do_one_req(struct crypto_engine *engine, void *areq) } out: +local_bh_disable ();crypto_finalize_hash_request (se->engine, req, ret); +local_bh_enable ();return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 230/957 crypto: atmel - Use unregister_{aeads,ahashes,skciphers}
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thorsten Blum <[email protected]>
[ Upstream commit 2ffc1ef4e826f0c3274f9ff5eb42bc70a5571afd ]
Replace multiple for loops with calls to crypto_unregister_aeads(), crypto_unregister_ahashes(), and crypto_unregister_skciphers().
Remove the definition of atmel_tdes_unregister_algs() because it is equivalent to calling crypto_unregister_skciphers() directly, and the function parameter 'struct atmel_tdes_dev *' is unused anyway.
Stable-dep-of: 57a13941c0bb ("crypto: atmel-aes - guard unregister on error in atmel_aes_register_algs")
--- drivers/crypto/atmel-aes.c | 17 ++++++----------- drivers/crypto/atmel-sha.c | 27 ++++++++++----------------- drivers/crypto/atmel-tdes.c | 25 ++++++------------------- 3 files changed, 22 insertions(+), 47 deletions(-)
drivers/crypto/atmel-aes.c +6 -11
@@ -2201,12 +2201,10 @@ static irqreturn_t atmel_aes_irq(int irq, void *dev_id)static void atmel_aes_unregister_algs (struct atmel_aes_dev *dd) { -int i; -#if IS_ENABLED (CONFIG_CRYPTO_DEV_ATMEL_AUTHENC )if (dd->caps.has_authenc) -for (i =0 ; i <ARRAY_SIZE (aes_authenc_algs); i++) -crypto_unregister_aead (&aes_authenc_algs[i]); +crypto_unregister_aeads (aes_authenc_algs, +ARRAY_SIZE (aes_authenc_algs));#endif if (dd->caps.has_xts)
@@ -2215,8 +2213,7 @@ static void atmel_aes_unregister_algs(struct atmel_aes_dev *dd)if (dd->caps.has_gcm)crypto_unregister_aead (&aes_gcm_alg); -for (i =0 ; i <ARRAY_SIZE (aes_algs); i++) -crypto_unregister_skcipher (&aes_algs[i]); +crypto_unregister_skciphers (aes_algs,ARRAY_SIZE (aes_algs)); }static void atmel_aes_crypto_alg_init (struct crypto_alg *alg)
@@ -2229,7 +2226,7 @@ static void atmel_aes_crypto_alg_init(struct crypto_alg *alg)static int atmel_aes_register_algs (struct atmel_aes_dev *dd) { -int err, i, j; +int err, i;for (i =0 ; i <ARRAY_SIZE (aes_algs); i++) {atmel_aes_crypto_alg_init (&aes_algs[i].base);
@@ -2272,8 +2269,7 @@ static int atmel_aes_register_algs(struct atmel_aes_dev *dd)#if IS_ENABLED (CONFIG_CRYPTO_DEV_ATMEL_AUTHENC )/* i = ARRAY_SIZE(aes_authenc_algs); */ err_aes_authenc_alg: -for (j =0 ; j < i; j++) -crypto_unregister_aead (&aes_authenc_algs[j]); +crypto_unregister_aeads (aes_authenc_algs, i);crypto_unregister_skcipher (&aes_xts_alg);#endif err_aes_xts_alg:
@@ -2281,8 +2277,7 @@ static int atmel_aes_register_algs(struct atmel_aes_dev *dd) err_aes_gcm_alg: i =ARRAY_SIZE (aes_algs); err_aes_algs: -for (j =0 ; j < i; j++) -crypto_unregister_skcipher (&aes_algs[j]); +crypto_unregister_skciphers (aes_algs, i);return err; }
drivers/crypto/atmel-sha.c +10 -17
@@ -2418,27 +2418,23 @@ EXPORT_SYMBOL_GPL(atmel_sha_authenc_abort);static void atmel_sha_unregister_algs (struct atmel_sha_dev *dd) { -int i; -if (dd->caps.has_hmac) -for (i =0 ; i <ARRAY_SIZE (sha_hmac_algs); i++) -crypto_unregister_ahash (&sha_hmac_algs[i]); +crypto_unregister_ahashes (sha_hmac_algs, +ARRAY_SIZE (sha_hmac_algs)); -for (i =0 ; i <ARRAY_SIZE (sha_1_256_algs); i++) -crypto_unregister_ahash (&sha_1_256_algs[i]); +crypto_unregister_ahashes (sha_1_256_algs,ARRAY_SIZE (sha_1_256_algs));if (dd->caps.has_sha224)crypto_unregister_ahash (&sha_224_alg); -if (dd->caps.has_sha_384_512) { -for (i =0 ; i <ARRAY_SIZE (sha_384_512_algs); i++) -crypto_unregister_ahash (&sha_384_512_algs[i]); - } +if (dd->caps.has_sha_384_512) +crypto_unregister_ahashes (sha_384_512_algs, +ARRAY_SIZE (sha_384_512_algs)); }static int atmel_sha_register_algs (struct atmel_sha_dev *dd) { -int err, i, j; +int err, i;for (i =0 ; i <ARRAY_SIZE (sha_1_256_algs); i++) {atmel_sha_alg_init (&sha_1_256_algs[i]);
@@ -2480,18 +2476,15 @@ static int atmel_sha_register_algs(struct atmel_sha_dev *dd)/*i = ARRAY_SIZE(sha_hmac_algs);*/ err_sha_hmac_algs: -for (j =0 ; j < i; j++) -crypto_unregister_ahash (&sha_hmac_algs[j]); +crypto_unregister_ahashes (sha_hmac_algs, i); i =ARRAY_SIZE (sha_384_512_algs); err_sha_384_512_algs: -for (j =0 ; j < i; j++) -crypto_unregister_ahash (&sha_384_512_algs[j]); +crypto_unregister_ahashes (sha_384_512_algs, i);crypto_unregister_ahash (&sha_224_alg); err_sha_224_algs: i =ARRAY_SIZE (sha_1_256_algs); err_sha_1_256_algs: -for (j =0 ; j < i; j++) -crypto_unregister_ahash (&sha_1_256_algs[j]); +crypto_unregister_ahashes (sha_1_256_algs, i);return err; }
drivers/crypto/atmel-tdes.c +6 -19
@@ -897,38 +897,25 @@ static irqreturn_t atmel_tdes_irq(int irq, void *dev_id)return IRQ_NONE ; } -static void atmel_tdes_unregister_algs (struct atmel_tdes_dev *dd) -{ -int i; - -for (i =0 ; i <ARRAY_SIZE (tdes_algs); i++) -crypto_unregister_skcipher (&tdes_algs[i]); -} -static int atmel_tdes_register_algs (struct atmel_tdes_dev *dd) { -int err, i, j; +int err, i;for (i =0 ; i <ARRAY_SIZE (tdes_algs); i++) {atmel_tdes_skcipher_alg_init (&tdes_algs[i]); err =crypto_register_skcipher (&tdes_algs[i]); -if (err) - goto err_tdes_algs; +if (err) { +crypto_unregister_skciphers (tdes_algs, i); +return err; + } }return 0 ; - -err_tdes_algs: -for (j =0 ; j < i; j++) -crypto_unregister_skcipher (&tdes_algs[j]); - -return err; }static void atmel_tdes_get_cap (struct atmel_tdes_dev *dd) { - dd->caps.has_dma =0 ;/* keep only major version number */
@@ -1061,7 +1048,7 @@ static void atmel_tdes_remove(struct platform_device *pdev)list_del (&tdes_dd->list);spin_unlock (&atmel_tdes.lock); -atmel_tdes_unregister_algs (tdes_dd); +crypto_unregister_skciphers (tdes_algs,ARRAY_SIZE (tdes_algs));tasklet_kill (&tdes_dd->done_task);tasklet_kill (&tdes_dd->queue_task);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 231/957 crypto: atmel-aes - guard unregister on error in atmel_aes_register_algs
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thorsten Blum <[email protected]>
[ Upstream commit 57a13941c0bb06ae24e3b34672d7b6f2172b253f ]
Ensure the device supports XTS and GCM with 'has_xts' and 'has_gcm' before unregistering algorithms when XTS or authenc registration fails, which would trigger a WARN in crypto_unregister_alg().
Currently, with the capabilities defined in atmel_aes_get_cap(), this bug cannot happen because all devices that support XTS and authenc also support GCM, but the error handling should still be correct regardless of hardware capabilities.
--- drivers/crypto/atmel-aes.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/crypto/atmel-aes.c +4 -2
@@ -2270,10 +2270,12 @@ static int atmel_aes_register_algs(struct atmel_aes_dev *dd)/* i = ARRAY_SIZE(aes_authenc_algs); */ err_aes_authenc_alg:crypto_unregister_aeads (aes_authenc_algs, i); -crypto_unregister_skcipher (&aes_xts_alg); +if (dd->caps.has_xts) +crypto_unregister_skcipher (&aes_xts_alg);#endif err_aes_xts_alg: -crypto_unregister_aead (&aes_gcm_alg); +if (dd->caps.has_gcm) +crypto_unregister_aead (&aes_gcm_alg); err_aes_gcm_alg: i =ARRAY_SIZE (aes_algs); err_aes_algs:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 232/957 padata: Remove cpu online check from cpu add and removal
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuyi Zhou <[email protected]>
[ Upstream commit 73117ea6470dca787f70f33c001f9faf437a1c0b ]
During the CPU offline process, the dying CPU is cleared from the cpu_online_mask in takedown_cpu(). After this step, various CPUHP_*_DEAD callbacks are executed to perform cleanup jobs for the dead CPU, so this cpu online check in padata_cpu_dead() is unnecessary.
Similarly, when executing padata_cpu_online() during the CPUHP_AP_ONLINE_DYN phase, the CPU has already been set in the cpu_online_mask, the action even occurs earlier than the CPUHP_AP_ONLINE_IDLE stage.
Remove this unnecessary cpu online check in __padata_add_cpu() and __padata_remove_cpu().
Stable-dep-of: c8c4a2972f83 ("padata: Put CPU offline callback in ONLINE section to allow failure")
--- kernel/padata.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-)
kernel/padata.c +8 -18
@@ -736,32 +736,22 @@ EXPORT_SYMBOL(padata_set_cpumask);static int __padata_add_cpu (struct padata_instance *pinst,int cpu) { -int err =0 ; - -if (cpumask_test_cpu (cpu, cpu_online_mask)) { - err =padata_replace (pinst); +int err =padata_replace (pinst); -if (padata_validate_cpumask (pinst, pinst->cpumask.pcpu) && -padata_validate_cpumask (pinst, pinst->cpumask.cbcpu)) -__padata_start (pinst); - } +if (padata_validate_cpumask (pinst, pinst->cpumask.pcpu) && +padata_validate_cpumask (pinst, pinst->cpumask.cbcpu)) +__padata_start (pinst);return err; }static int __padata_remove_cpu (struct padata_instance *pinst,int cpu) { -int err =0 ; - -if (!cpumask_test_cpu (cpu, cpu_online_mask)) { -if (!padata_validate_cpumask (pinst, pinst->cpumask.pcpu) || - !padata_validate_cpumask (pinst, pinst->cpumask.cbcpu)) -__padata_stop (pinst); - - err =padata_replace (pinst); - } +if (!padata_validate_cpumask (pinst, pinst->cpumask.pcpu) || + !padata_validate_cpumask (pinst, pinst->cpumask.cbcpu)) +__padata_stop (pinst); -return err; +return padata_replace (pinst); }static inline int pinst_has_cpu (struct padata_instance *pinst,int cpu)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 233/957 padata: Put CPU offline callback in ONLINE section to allow failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Jordan <[email protected]>
[ Upstream commit c8c4a2972f83c8b68ff03b43cecdb898939ff851 ]
syzbot reported the following warning:
DEAD callback error for CPU1
WARNING: kernel/cpu.c:1463 at _cpu_down+0x759/0x1020 kernel/cpu.c:1463, CPU#0: syz.0.1960/14614
at commit 4ae12d8bd9a8 ("Merge tag 'kbuild-fixes-7.0-2' of git://git.kernel.org/pub/scm/linux/kernel/git/kbuild/linux")
which tglx traced to padata_cpu_dead() given it's the only
sub-CPUHP_TEARDOWN_CPU callback that returns an error.
Failure isn't allowed in hotplug states before CPUHP_TEARDOWN_CPU so move the CPU offline callback to the ONLINE section where failure is possible.
--- include/linux/cpuhotplug.h | 1 - include/linux/padata.h | 8 +-- kernel/padata.c | 120 +++++++++++++++++++------------------ 3 files changed, 65 insertions(+), 64 deletions(-)
include/linux/cpuhotplug.h +0 -1
@@ -92,7 +92,6 @@ enum cpuhp_state {CPUHP_NET_DEV_DEAD ,CPUHP_IOMMU_IOVA_DEAD ,CPUHP_AP_ARM_CACHE_B15_RAC_DEAD , -CPUHP_PADATA_DEAD ,CPUHP_AP_DTPM_CPU_DEAD ,CPUHP_RANDOM_PREPARE , CPUHP_WORKQUEUE_PREP,
include/linux/padata.h +4 -4
@@ -149,23 +149,23 @@ struct padata_mt_job {/** * struct padata_instance - The overall control structure. * -* @cpu_online_node: Linkage for CPU online callback. -* @cpu_dead_node: Linkage for CPU offline callback. +* @cpuhp_node: Linkage for CPU hotplug callbacks. * @parallel_wq: The workqueue used for parallel work. * @serial_wq: The workqueue used for serial work. * @pslist: List of padata_shell objects attached to this instance. * @cpumask: User supplied cpumasks for parallel and serial works. +* @validate_cpumask: Internal cpumask used to validate @cpumask during hotplug. * @kobj: padata instance kernel object. * @lock: padata instance lock. * @flags: padata flags. */ struct padata_instance { -struct hlist_node cpu_online_node; -struct hlist_node cpu_dead_node; +struct hlist_node cpuhp_node;struct workqueue_struct *parallel_wq;struct workqueue_struct *serial_wq;struct list_head pslist;struct padata_cpumask cpumask; +cpumask_var_t validate_cpumask;struct kobject kobj;struct mutex lock;u8 flags;
kernel/padata.c +61 -59
270 lines not on this page · raw message
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 234/957 PCI: dwc: rcar-gen4: Change EPC BAR alignment to 4K as per the documentation
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Koichiro Den <[email protected]>
[ Upstream commit 13f55a7ca773c731a1e645934c1ae48577f48785 ]
R-Car S4 Series (R8A779F[4-7]*) EP controller uses a 4K minimum iATU region size (CX_ATU_MIN_REGION_SIZE = 4K) as per R19UH0161EJ0130 Rev.1.30. Also, the controller itself can only be configured in the range 4 KB to 64 KB, so the current 1 MB alignment requirement is incorrect.
Hence, change the alignment to the min size 4K as per the documentation.
This also fixes needless unusability of BAR4 on this platform when the target address is fixed, such as for doorbell targets.
--- drivers/pci/controller/dwc/pcie-rcar-gen4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/controller/dwc/pcie-rcar-gen4.c +1 -1
@@ -425,7 +425,7 @@ static const struct pci_epc_features rcar_gen4_pcie_epc_features = { .bar[BAR_3] = { .type = BAR_RESERVED, }, .bar[BAR_4] = { .type = BAR_FIXED, .fixed_size = 256 }, .bar[BAR_5] = { .type = BAR_RESERVED, }, - .align = SZ_1M, + .align = SZ_4K, }; static const struct pci_epc_features*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 235/957 drm/amdgpu/gfx10: look at the right prop for gfx queue priority
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit 355d96cdec5c61fd83f7eb54f1a28e38809645d6 ]
Look at hqd_queue_priority rather than hqd_pipe_priority. In practice, it didn't matter as both were always set for kernel queues, but that will change in the future.
Reviewed-by:Jesse Zhang <[email protected]>
--- drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +1 -1
@@ -6751,7 +6751,7 @@ static void gfx_v10_0_gfx_mqd_set_priority(struct amdgpu_device *adev,/* set up default queue priority level * 0x0 = low priority, 0x1 = high priority */ -if (prop->hqd_pipe_priority ==AMDGPU_GFX_PIPE_PRIO_HIGH ) +if (prop->hqd_queue_priority ==AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM ) priority =1 ; tmp =RREG32_SOC15 (GC ,0 , mmCP_GFX_HQD_QUEUE_PRIORITY);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 236/957 drm/amdgpu/gfx11: look at the right prop for gfx queue priority
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit f9a4e81bcbd04e6f967d851f9fe69d8bb3cc08b3 ]
Look at hqd_queue_priority rather than hqd_pipe_priority. In practice, it didn't matter as both were always set for kernel queues, but that will change in the future.
Reviewed-by:Jesse Zhang <[email protected]>
--- drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +1 -1
@@ -4080,7 +4080,7 @@ static void gfx_v11_0_gfx_mqd_set_priority(struct amdgpu_device *adev,/* set up default queue priority level * 0x0 = low priority, 0x1 = high priority */ -if (prop->hqd_pipe_priority ==AMDGPU_GFX_PIPE_PRIO_HIGH ) +if (prop->hqd_queue_priority ==AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM ) priority =1 ; tmp = regCP_GFX_HQD_QUEUE_PRIORITY_DEFAULT;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 237/957 spi: hisi-kunpeng: prevent infinite while() loop in hisi_spi_flush_fifo
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pei Xiao <[email protected]>
[ Upstream commit 9f61daf2c2debe9f5cf4e1a4471e56a89a6fe45a ]
The hisi_spi_flush_fifo()'s inner while loop that lacks any timeout mechanism. Maybe the hardware never becomes empty, the loop will spin forever, causing the CPU to hang.
Fix this by adding a inner_limit based on loops_per_jiffy. The inner loop now exits after approximately one jiffy if the FIFO remains non-empty, logs a ratelimited warning, and breaks out of the outer loop. Additionally, add a cpu_relax() inside the busy loop to improve power efficiency.
--- drivers/spi/spi-hisi-kunpeng.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/spi/spi-hisi-kunpeng.c +11 -1
@@ -196,8 +196,18 @@ static void hisi_spi_flush_fifo(struct hisi_spi *hs)unsigned long limit = loops_per_jiffy <<1 ;do { -while (hisi_spi_rx_not_empty (hs)) +unsigned long inner_limit = loops_per_jiffy; + +while (hisi_spi_rx_not_empty (hs) && --inner_limit) {readl (hs->regs +HISI_SPI_DOUT ); +cpu_relax (); + } + +if (!inner_limit) { +dev_warn_ratelimited (hs->dev,"RX FIFO flush timeout\n" ); +break ; + } + }while (hisi_spi_busy (hs) && limit--); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 238/957 drm/imagination: Switch reset_reason fields from enum to u32
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandru Dadu <[email protected]>
[ Upstream commit d2f83a6cd598bf413f1acf34153bd1d71023fbab ]
Update the reset_reason fwif structure fields from enum to u32 to remove any ambiguity from the interface (enum is not a fixed size thus is unfit for the purpose of the data type).
--- drivers/gpu/drm/imagination/pvr_rogue_fwif.h | 8 ++++++-- drivers/gpu/drm/imagination/pvr_rogue_fwif_shared.h | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-)
drivers/gpu/drm/imagination/pvr_rogue_fwif.h +6 -2
@@ -1347,8 +1347,12 @@ struct rogue_fwif_fwccb_cmd_freelists_reconstruction_data {struct rogue_fwif_fwccb_cmd_context_reset_data {/* Context affected by the reset */ u32 server_common_context_id; -/* Reason for reset */ -enum rogue_context_reset_reason reset_reason; +/* +* Reason for reset +* The valid values for reset_reason are the ones from +* enum rogue_context_reset_reason +*/ +u32 reset_reason;/* Data Master affected by the reset */ u32 dm;/* Job ref running at the time of reset */
drivers/gpu/drm/imagination/pvr_rogue_fwif_shared.h +5 -1
@@ -249,7 +249,11 @@ enum rogue_context_reset_reason { };struct rogue_context_reset_reason_data { -enum rogue_context_reset_reason reset_reason; +/* +* The valid values for reset_reason are the ones from +* enum rogue_context_reset_reason +*/ +u32 reset_reason;u32 reset_ext_job_ref; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 239/957 iommu/tegra241-cmdqv: Set supports_cmd op in tegra241_vcmdq_hw_init()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolin Chen <[email protected]>
[ Upstream commit 803e41f36d227022ab9bbe780c82283fd4713b2e ]
vintf->hyp_own is finalized in tegra241_vintf_hw_init(). On the other hand, tegra241_vcmdq_alloc_smmu_cmdq() is called via an init_structures callback, which is earlier than tegra241_vintf_hw_init().
This results in the supports_cmd op always being set to the guest function, although this doesn't break any functionality nor have some noticeable perf impact since non-invalidation commands are not issued in the perf sensitive context.
Fix this by moving supports_cmd to tegra241_vcmdq_hw_init().
After this change,
- For a guest kernel, this will be a status quo
- For a host kernel, non-invalidation commands will be issued to VCMDQ(s)
--- drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c +4 -3
@@ -481,6 +481,10 @@ static int tegra241_vcmdq_hw_init(struct tegra241_vcmdq *vcmdq)/* Reset VCMDQ */ tegra241_vcmdq_hw_deinit (vcmdq); +/* vintf->hyp_own is a HW state finalized in tegra241_vintf_hw_init() */ +if (!vcmdq->vintf->hyp_own) + vcmdq->cmdq.supports_cmd = tegra241_guest_vcmdq_supports_cmd; +/* Configure and enable VCMDQ */ writeq_relaxed (vcmdq->cmdq.q.q_base,REG_VCMDQ_PAGE1 (vcmdq,BASE ));
@@ -641,9 +645,6 @@ static int tegra241_vcmdq_alloc_smmu_cmdq(struct tegra241_vcmdq *vcmdq) q->q_base = q->base_dma &VCMDQ_ADDR ; q->q_base |=FIELD_PREP (VCMDQ_LOG2SIZE , q->llq.max_n_shift); -if (!vcmdq->vintf->hyp_own) - cmdq->supports_cmd = tegra241_guest_vcmdq_supports_cmd; -return arm_smmu_cmdq_init (smmu, cmdq); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 240/957 iommu/tegra241-cmdqv: Update uAPI to clarify HYP_OWN requirement
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolin Chen <[email protected]>
[ Upstream commit 9dcef98dbee35b8ae784df04c041efffdd42a69c ]
Quoted 1 line
From hardware implementation perspective, a guest tegra241-cmdqv hardware
is different than the host hardware:
- Host HW is backed by a VINTF (HYP_OWN=1)
- Guest HW is backed by a VINTF (HYP_OWN=0)
The kernel driver has an implementation requirement of the HYP_OWN bit in the VM. So, VMM must follow that to allow the same copy of Linux to work.
Add this requirement to the uAPI, which is currently missing.
--- include/uapi/linux/iommufd.h | 5 +++++ 1 file changed, 5 insertions(+)
include/uapi/linux/iommufd.h +5 -0
@@ -1003,6 +1003,11 @@ struct iommu_fault_alloc {enum iommu_viommu_type {IOMMU_VIOMMU_TYPE_DEFAULT =0 ,IOMMU_VIOMMU_TYPE_ARM_SMMUV3 =1 , +/* +* TEGRA241_CMDQV requirements (otherwise, VCMDQs will not work) +* - Kernel will allocate a VINTF (HYP_OWN=0) to back this VIOMMU. So, +* VMM must wire the HYP_OWN bit to 0 in guest VINTF_CONFIG register +*/ IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV =2 , };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 241/957 drm/msm: add missing MODULE_DEVICE_ID definitions
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit b21e85400ce763f2c6ad913e03fea5cadc323c13 ]
The drm/msm module bundles several drivers, each of them having a separate OF match table, however only MDSS (subsystem), KMS devices and GPU have corresponding MODULE_DEVICE_ID tables.
Add MODULE_DEVICE_ID to the display-related driver and to all other drivers in this module, simplifying userspace job.
Patchwork: https://patchwork.freedesktop.org/patch/707960/
--- drivers/gpu/drm/msm/dp/dp_display.c | 1 + drivers/gpu/drm/msm/dsi/dsi.c | 1 + drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 1 + drivers/gpu/drm/msm/hdmi/hdmi.c | 1 + drivers/gpu/drm/msm/hdmi/hdmi_phy.c | 1 + 5 files changed, 5 insertions(+)
drivers/gpu/drm/msm/dp/dp_display.c +1 -0
@@ -201,6 +201,7 @@ static const struct of_device_id msm_dp_dt_match[] = { { .compatible = "qcom,x1e80100-dp", .data = &msm_dp_desc_x1e80100 }, {} }; +MODULE_DEVICE_TABLE (of, msm_dp_dt_match);static struct msm_dp_display_private *dev_get_dp_display_private (struct device *dev) {
drivers/gpu/drm/msm/dsi/dsi.c +1 -0
@@ -198,6 +198,7 @@ static const struct of_device_id dt_match[] = { { .compatible = "qcom,dsi-ctrl-6g-qcm2290" }, {} }; +MODULE_DEVICE_TABLE (of, dt_match);static const struct dev_pm_ops dsi_pm_ops = {SET_RUNTIME_PM_OPS (msm_dsi_runtime_suspend, msm_dsi_runtime_resume,NULL )
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +1 -0
@@ -580,6 +580,7 @@ static const struct of_device_id dsi_phy_dt_match[] = {#endif {} }; +MODULE_DEVICE_TABLE (of, dsi_phy_dt_match);/* * Currently, we only support one SoC for each PHY type. When we have multiple
drivers/gpu/drm/msm/hdmi/hdmi.c +1 -0
@@ -441,6 +441,7 @@ static const struct of_device_id msm_hdmi_dt_match[] = { { .compatible = "qcom,hdmi-tx-8660", .data = &hdmi_tx_8960_config }, {} }; +MODULE_DEVICE_TABLE (of, msm_hdmi_dt_match);static struct platform_driver msm_hdmi_driver = { .probe = msm_hdmi_dev_probe,
drivers/gpu/drm/msm/hdmi/hdmi_phy.c +1 -0
@@ -204,6 +204,7 @@ static const struct of_device_id msm_hdmi_phy_dt_match[] = { .data = &msm_hdmi_phy_8998_cfg }, {} }; +MODULE_DEVICE_TABLE (of, msm_hdmi_phy_dt_match);static struct platform_driver msm_hdmi_phy_platform_driver = { .probe = msm_hdmi_phy_probe,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 242/957 drm/msm/dpu: fix mismatch between power and frequency
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuanjie Yang <[email protected]>
[ Upstream commit bc1dccc518cc5ab5140fba06c27e7188e0ed342b ]
During DPU runtime suspend, calling dev_pm_opp_set_rate(dev, 0) drops the MMCX rail to MIN_SVS while the core clock frequency remains at its original (highest) rate. When runtime resume re-enables the clock, this may result in a mismatch between the rail voltage and the clock rate.
For example, in the DPU bind path, the sequence could be:
cpu0: dev_sync_state -> rpmhpd_sync_state
cpu1: dpu_kms_hw_init
timeline 0 ------------------------------------------------> t
After rpmhpd_sync_state, the voltage performance is no longer guaranteed to stay at the highest level. During dpu_kms_hw_init, calling dev_pm_opp_set_rate(dev, 0) drops the voltage, causing the MMCX rail to fall to MIN_SVS while the core clock is still at its maximum frequency. When the power is re-enabled, only the clock is enabled, leading to a situation where the MMCX rail is at MIN_SVS but the core clock is at its highest rate. In this state, the rail cannot sustain the clock rate, which may cause instability or system crash.
Remove the call to dev_pm_opp_set_rate(dev, 0) from dpu_runtime_suspend to ensure the correct vote is restored when DPU resumes.
Patchwork: https://patchwork.freedesktop.org/patch/710077/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 2 -- 1 file changed, 2 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0 -2
@@ -1461,8 +1461,6 @@ static int __maybe_unused dpu_runtime_suspend(struct device *dev)struct msm_drm_private *priv =platform_get_drvdata (pdev);struct dpu_kms *dpu_kms =to_dpu_kms (priv->kms); -/* Drop the performance state vote */ -dev_pm_opp_set_rate (dev,0 );clk_bulk_disable_unprepare (dpu_kms->num_clocks, dpu_kms->clocks);for (i =0 ; i < dpu_kms->num_paths; i++)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 243/957 drm/msm/dsi: add the missing parameter description
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengyu Luo <[email protected]>
[ Upstream commit 958adefc4c0fddee3b12269da5dd7cb49bac953f ]
Add a description for is_bonded_dsi in dsi_adjust_pclk_for_compression to match the existing kernel-doc comment.
Patchwork: https://patchwork.freedesktop.org/patch/710112/
--- drivers/gpu/drm/msm/dsi/dsi_host.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/msm/dsi/dsi_host.c +1 -0
@@ -569,6 +569,7 @@ void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host)* dsi_adjust_pclk_for_compression() - Adjust the pclk rate for compression case * @mode: The selected mode for the DSI output * @dsc: DRM DSC configuration for this DSI output +* @is_bonded_dsi: True if two DSI controllers are bonded * * Adjust the pclk rate by calculating a new hdisplay proportional to * the compression ratio such that:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 244/957 drm/msm/dpu: dont try using 2 LMs if only one DSC is available
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit b9699dd862760e642807a2bc226e4d127e35dcb7 ]
Current topology code will try using 2 LMs with just one DSC, which breaks cases like SC7280 / Fairphone5. Forbid using 2 LMs split in such a case.
Patchwork: https://patchwork.freedesktop.org/patch/712386/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2 -1
@@ -1354,7 +1354,8 @@ static struct msm_display_topology dpu_crtc_get_topology( topology.num_lm =2 ; else if (topology.num_dsc == 2) topology.num_lm = 2; - else if (dpu_kms->catalog->caps->has_3d_merge) + else if (dpu_kms->catalog->caps->has_3d_merge && + topology.num_dsc == 0) topology.num_lm = (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1; else topology.num_lm = 1;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 245/957 drm/msm/dsi: fix bits_per_pclk
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengyu Luo <[email protected]>
[ Upstream commit 2d51cfb77daa30b10bc68c403f8ace35783d2922 ]
mipi_dsi_pixel_format_to_bpp return dst bpp not src bpp, dst bpp may not be the uncompressed data size. use src bpc * 3 to get src bpp, this aligns with pclk rate calculation.
Patchwork: https://patchwork.freedesktop.org/patch/709916/
--- drivers/gpu/drm/msm/dsi/dsi_host.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/dsi/dsi_host.c +1 -1
@@ -1048,7 +1048,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)*/ h_total -= hdisplay;if (wide_bus_enabled) - bits_per_pclk =mipi_dsi_pixel_format_to_bpp (msm_host->format); + bits_per_pclk = dsc->bits_per_component *3 ;else bits_per_pclk =24 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 246/957 drm/msm/dsi: fix hdisplay calculation for CMD mode panel
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengyu Luo <[email protected]>
[ Upstream commit 82159db4371f5cef56444ebd0b8f96e2a6d709ff ]
Commit ac47870fd795 ("drm/msm/dsi: fix hdisplay calculation when programming dsi registers") incorrecly broke hdisplay calculation for CMD mode by specifying incorrect number of bytes per transfer, fix it.
Patchwork: https://patchwork.freedesktop.org/patch/709917/
--- drivers/gpu/drm/msm/dsi/dsi_host.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/gpu/drm/msm/dsi/dsi_host.c +10 -5
@@ -1034,8 +1034,9 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)/* * DPU sends 3 bytes per pclk cycle to DSI. If widebus is * enabled, MDP always sends out 48-bit compressed data per -* pclk and on average, DSI consumes an amount of compressed -* data equivalent to the uncompressed pixel depth per pclk. +* pclk and on average, for video mode, DSI consumes only an +* amount of compressed data equivalent to the uncompressed +* pixel depth per pclk. * * Calculate the number of pclks needed to transmit one line of * the compressed data.
@@ -1047,10 +1048,14 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)* unused anyway. */ h_total -= hdisplay; -if (wide_bus_enabled) - bits_per_pclk = dsc->bits_per_component *3 ; -else +if (wide_bus_enabled) { +if (msm_host->mode_flags &MIPI_DSI_MODE_VIDEO ) + bits_per_pclk = dsc->bits_per_component *3 ; +else + bits_per_pclk =48 ; + }else { bits_per_pclk =24 ; + } hdisplay =DIV_ROUND_UP (msm_dsc_get_bytes_per_line (msm_host->dsc) *8 , bits_per_pclk);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 247/957 drm/msm/dsi: rename MSM8998 DSI version from V2_2_0 to V2_0_0
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Koskovich <[email protected]>
[ Upstream commit 913a709dea0eff9c7b2e9470f8c8594b9a0114ab ]
The MSM8998 DSI controller is v2.0.0 as stated in commit 7b8c9e203039 ("drm/msm/dsi: Add support for MSM8998 DSI controller"). The value was always correct just the name was wrong.
Rename and reorder to maintain version sorting.
Patchwork: https://patchwork.freedesktop.org/patch/713717/
--- drivers/gpu/drm/msm/dsi/dsi_cfg.c | 4 ++-- drivers/gpu/drm/msm/dsi/dsi_cfg.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/msm/dsi/dsi_cfg.c +2 -2
@@ -306,10 +306,10 @@ static const struct msm_dsi_cfg_handler dsi_cfg_handlers[] = { &msm8996_dsi_cfg, &msm_dsi_6g_host_ops}, {MSM_DSI_VER_MAJOR_6G ,MSM_DSI_6G_VER_MINOR_V1_4_2 , &msm8976_dsi_cfg, &msm_dsi_6g_host_ops}, + {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_0_0, + &msm8998_dsi_cfg, &msm_dsi_6g_v2_host_ops}, {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_1_0, &sdm660_dsi_cfg, &msm_dsi_6g_v2_host_ops}, - {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_0, - &msm8998_dsi_cfg, &msm_dsi_6g_v2_host_ops}, {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_1, &sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops}, {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_3_0,
drivers/gpu/drm/msm/dsi/dsi_cfg.h +1 -1
@@ -19,8 +19,8 @@#define MSM_DSI_6G_VER_MINOR_V1_3_1 0x10030001#define MSM_DSI_6G_VER_MINOR_V1_4_1 0x10040001#define MSM_DSI_6G_VER_MINOR_V1_4_2 0x10040002 +#define MSM_DSI_6G_VER_MINOR_V2_0_0 0x20000000#define MSM_DSI_6G_VER_MINOR_V2_1_0 0x20010000 -#define MSM_DSI_6G_VER_MINOR_V2_2_0 0x20000000#define MSM_DSI_6G_VER_MINOR_V2_2_1 0x20020001#define MSM_DSI_6G_VER_MINOR_V2_3_0 0x20030000#define MSM_DSI_6G_VER_MINOR_V2_3_1 0x20030001
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 248/957 ASoC: rockchip: rockchip_sai: Set slot width for non-TDM mode
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Charkov <[email protected]>
[ Upstream commit 8a6391ec669366cbe7bde92b468c561e8b309fd6 ]
Currently the slot width in non-TDM mode is always kept at the POR value of 32 bits, regardless of the sample width, which doesn't work well for some codecs such as NAU8822.
Set the slot width according to the sample width in non-TDM mode, which is what other CPU DAI drivers do.
Tested on the following RK3576 configurations:
- SAI2 + NAU8822 (codec as the clock master), custom board
- SAI1 + ES8388 (codec as the clock master), RK3576 EVB1
- SAI2 + RT5616 (SAI as the clock master), FriendlyElec NanoPi M5
NAU8822 didn't work prior to this patch but works after the patch. Other two configurations work both before and after the patch.
--- sound/soc/rockchip/rockchip_sai.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/soc/rockchip/rockchip_sai.c +4 -0
@@ -628,6 +628,10 @@ static int rockchip_sai_hw_params(struct snd_pcm_substream *substream,regmap_update_bits (sai->regmap, reg,SAI_XCR_VDW_MASK |SAI_XCR_CSR_MASK , val); +if (!sai->is_tdm) +regmap_update_bits (sai->regmap, reg,SAI_XCR_SBW_MASK , +SAI_XCR_SBW (params_physical_width (params))); +regmap_read (sai->regmap, reg, &val); slot_width =SAI_XCR_SBW_V (val);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 249/957 drm/panel: sharp-ls043t1le01: make use of prepare_prev_first
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit c222177d7c7e1b2e0433d9e47ec2da7015345d50 ]
The DSI link must be powered up to let panel driver to talk to the panel during prepare() callback execution. Set the prepare_prev_first flag to guarantee this.
--- drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c +1 -0
@@ -201,6 +201,7 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt)drm_panel_init (&sharp_nt->base, &sharp_nt->dsi->dev, &sharp_nt_panel_funcs,DRM_MODE_CONNECTOR_DSI ); + sharp_nt->base.prepare_prev_first = true; ret =drm_panel_of_backlight (&sharp_nt->base);if (ret)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 250/957 drm/panel: simple: Correct G190EAN01 prepare timing
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Reichel <[email protected]>
[ Upstream commit f1080f82570b797598c1ba7e9c800ae9e94aafc6 ]
The prepare timing specified by the G190EAN01 datasheet should be between 30 and 50 ms. Considering it might take some time for the LVDS encoder to enable the signal, we should only wait the min. required time in the panel driver and not the max. allowed time.
--- drivers/gpu/drm/panel/panel-simple.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/panel/panel-simple.c +1 -1
@@ -1295,7 +1295,7 @@ static const struct panel_desc auo_g190ean01 = { .height = 301, }, .delay = { - .prepare = 50, + .prepare = 30, .enable = 200, .disable = 110, .unprepare = 1000,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 251/957 PCI: qcom: Advertise Hotplug Slot Capability with no Command Completion support
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Chaitanya Chundru <[email protected]>
[ Upstream commit 33a76fc3c3e61386524479b99f35423bd3d9a895 ]
Qcom PCIe Root Ports advertise hotplug capability in hardware, but do not support hotplug command completion. As a result, the hotplug commands issued by the pciehp driver never gets completion notification, leading to repeated timeout warnings and multi-second delays during boot and suspend/resume.
Commit a54db86ddc153 ("PCI: qcom: Do not advertise hotplug capability for IPs v2.7.0 and v1.9.0") mistakenly assumed that the Root Ports doesn't support Hotplug due to timeouts and disabled the Hotplug functionality altogether. But the Root Ports does support reporting Hotplug events like DL_Up/Down events.
So to fix the command completion timeout issues, just set the No Command Completed Support (NCCS) bit and enable Hotplug in Slot Capability field back.
--- drivers/pci/controller/dwc/pcie-qcom.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
drivers/pci/controller/dwc/pcie-qcom.c +11 -6
@@ -341,15 +341,20 @@ static void qcom_pcie_clear_aspm_l0s(struct dw_pcie *pci)dw_pcie_dbi_ro_wr_dis (pci); } -static void qcom_pcie_clear_hpc (struct dw_pcie *pci) +static void qcom_pcie_set_slot_nccs (struct dw_pcie *pci) {u16 offset =dw_pcie_find_capability (pci,PCI_CAP_ID_EXP );u32 val;dw_pcie_dbi_ro_wr_en (pci); +/* +* Qcom PCIe Root Ports do not support generating command completion +* notifications for the Hot-Plug commands. So set the NCCS field to +* avoid waiting for the completions. +*/ val =readl (pci->dbi_base + offset +PCI_EXP_SLTCAP ); - val &= ~PCI_EXP_SLTCAP_HPC ; + val |=PCI_EXP_SLTCAP_NCCS ;writel (val, pci->dbi_base + offset +PCI_EXP_SLTCAP );dw_pcie_dbi_ro_wr_dis (pci);
@@ -549,7 +554,7 @@ static int qcom_pcie_post_init_2_1_0(struct qcom_pcie *pcie)writel (CFG_BRIDGE_SB_INIT , pci->dbi_base +AXI_MSTR_RESP_COMP_CTRL1 ); -qcom_pcie_clear_hpc (pcie->pci); +qcom_pcie_set_slot_nccs (pcie->pci);return 0 ; }
@@ -629,7 +634,7 @@ static int qcom_pcie_post_init_1_0_0(struct qcom_pcie *pcie)writel (val, pcie->parf +PARF_AXI_MSTR_WR_ADDR_HALT ); } -qcom_pcie_clear_hpc (pcie->pci); +qcom_pcie_set_slot_nccs (pcie->pci);return 0 ; }
@@ -722,7 +727,7 @@ static int qcom_pcie_post_init_2_3_2(struct qcom_pcie *pcie) val |=EN ;writel (val, pcie->parf +PARF_AXI_MSTR_WR_ADDR_HALT_V2 ); -qcom_pcie_clear_hpc (pcie->pci); +qcom_pcie_set_slot_nccs (pcie->pci);return 0 ; }
@@ -1028,7 +1033,7 @@ static int qcom_pcie_post_init_2_7_0(struct qcom_pcie *pcie)writel (WR_NO_SNOOP_OVERRIDE_EN |RD_NO_SNOOP_OVERRIDE_EN , pcie->parf +PARF_NO_SNOOP_OVERRIDE ); -qcom_pcie_clear_hpc (pcie->pci); +qcom_pcie_set_slot_nccs (pcie->pci);return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 252/957 PCI: Use res_to_dev_res() in reassign_resources_sorted()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit 4bee4fc0f4ee1086e498f9d197352237a0232598 ]
reassign_resources_sorted() contains a search loop for a particular resource in the head list. res_to_dev_res() already implements the same search so use it instead.
Drop unused found_match and dev_res variables.
Stable-dep-of: 1ee4716a5a28 ("PCI: Fix premature removal from realloc_head list during resource assignment")
--- drivers/pci/setup-bus.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-)
drivers/pci/setup-bus.c +1 -10
@@ -417,7 +417,6 @@ static void reassign_resources_sorted(struct list_head *realloc_head, struct list_head *head) {struct pci_dev_resource *add_res, *tmp; -struct pci_dev_resource *dev_res;struct pci_dev *dev;struct resource *res;const char *res_name;
@@ -425,8 +424,6 @@ static void reassign_resources_sorted(struct list_head *realloc_head,int idx;list_for_each_entry_safe (add_res, tmp, realloc_head, list) { -bool found_match = false; - res = add_res->res; dev = add_res->dev; idx =pci_resource_num (dev, res);
@@ -440,13 +437,7 @@ static void reassign_resources_sorted(struct list_head *realloc_head, goto out;/* Skip this resource if not found in head list */ -list_for_each_entry (dev_res, head, list) { -if (dev_res->res == res) { - found_match = true; -break ; - } - } -if (!found_match)/* Just skip */ +if (!res_to_dev_res (head, res))continue ; res_name =pci_resource_name (dev, idx);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 253/957 PCI: Fix premature removal from realloc_head list during resource assignment
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit 1ee4716a5a28eaef81ae1f280d983258bee49623 ]
reassign_resources_sorted() checks for two things:
a) Resource assignment failures for mandatory resources by checking if the resource remains unassigned, which are known to always repeat, and does not attempt to assign them again.
b) That resource is not among the ones being processed/assigned at this stage, leading to skip processing such resources in reassign_resources_sorted() as well (resource assignment progresses one PCI hierarchy level at a time).
The problem here is that a) is checked before b), but b) also implies the resource is not being assigned yet, making also a) true. As a) only skips resource assignment but still removes the resource from realloc_head, the later stages that would need to process the information in realloc_head cannot obtain the optional size information anymore. This leads to considering only non-optional part for bridge windows deeper in the PCI hierarchy.
This problem has been observed during rescan (add_size is not considered while attempting assignment for 0000:e2:00.0 indicating the corresponding entry was removed from realloc_head while processing resource assignments for 0000:e1):
pci_bus 0000:e1: scanning bus
...
pci 0000:e3:01.0: bridge window [mem 0x800000000-0x1000ffffff 64bit pref] to [bus e4] add_size 60c000000 add_align 800000000 pci 0000:e3:01.0: bridge window [mem 0x00100000-0x000fffff] to [bus e4] add_size 200000 add_align 200000 pci 0000:e3:02.0: disabling bridge window [mem 0x00000000-0x000fffff 64bit pref] to [bus e5] (unused)
pci 0000:e2:00.0: bridge window [mem 0x800000000-0x1000ffffff 64bit pref] to [bus e3-e5] add_size 60c000000 add_align 800000000 pci 0000:e2:00.0: bridge window [mem 0x00100000-0x001fffff] to [bus e3-e5] add_size 200000 add_align 200000
pcieport 0000:e1:02.0: bridge window [io size 0x2000]: can't assign; no space pcieport 0000:e1:02.0: bridge window [io size 0x2000]: failed to assign pcieport 0000:e1:02.0: bridge window [io 0x1000-0x2fff]: resource restored pcieport 0000:e1:02.0: bridge window [io 0x1000-0x2fff]: resource restored pcieport 0000:e1:02.0: bridge window [io size 0x2000]: can't assign; no space pcieport 0000:e1:02.0: bridge window [io size 0x2000]: failed to assign
pci 0000:e2:00.0: bridge window [mem 0x28f000000000-0x28f800ffffff 64bit pref]: assigned
--- drivers/pci/setup-bus.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/pci/setup-bus.c +4 -4
@@ -428,6 +428,10 @@ static void reassign_resources_sorted(struct list_head *realloc_head, dev = add_res->dev; idx =pci_resource_num (dev, res); +/* Skip this resource if not found in head list */ +if (!res_to_dev_res (head, res)) +continue ; +/* * Skip resource that failed the earlier assignment and is * not optional as it would just fail again.
@@ -436,10 +440,6 @@ static void reassign_resources_sorted(struct list_head *realloc_head, !pci_resource_is_optional(dev, idx)) goto out; -/* Skip this resource if not found in head list */ -if (!res_to_dev_res (head, res)) -continue ; - res_name =pci_resource_name (dev, idx); add_size = add_res->add_size; align = add_res->min_align;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 254/957 crypto: hisilicon/sec2 - prevent req used-after-free for sec
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wenkai Lin <[email protected]>
[ Upstream commit 67b53a660e6bf0da2fa8d8872e897a14d8059eaf ]
During packet transmission, if the system is under heavy load, the hardware might complete processing the packet and free the request memory (req) before the transmission function finishes. If the software subsequently accesses this req, a use-after-free error will occur. The qp_ctx memory exists throughout the packet sending process, so replace the req with the qp_ctx.
--- drivers/crypto/hisilicon/sec2/sec_crypto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/hisilicon/sec2/sec_crypto.c +1 -1
@@ -230,7 +230,7 @@ static int qp_send_message(struct sec_req *req)spin_unlock_bh (&qp_ctx->req_lock); -atomic64_inc (&req->ctx->sec->debug.dfx.send_cnt); +atomic64_inc (&qp_ctx->ctx->sec->debug.dfx.send_cnt);return -EINPROGRESS ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 255/957 PCI: Fix alignment calculation for resource size larger than align
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit 8cb081667377709f4924ab6b3a88a0d7a761fe91 ]
The commit bc75c8e50711 ("PCI: Rewrite bridge window head alignment function") did not use if (r_size <= align) check from pbus_size_mem() for the new head alignment bookkeeping structure (aligns2[]). In some configurations, this can result in producing a gap into the bridge window which the resource larger than its alignment cannot fill.
The old alignment calculation algorithm was removed by the subsequent commit 3958bf16e2fe ("PCI: Stop over-estimating bridge window size") which renamed the aligns2[] array leaving only aligns[] array.
Add the if (r_size <= align) check back to avoid this problem.
--- drivers/pci/setup-bus.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/pci/setup-bus.c +8 -1
@@ -1342,7 +1342,14 @@ static void pbus_size_mem(struct pci_bus *bus, unsigned long type, } size +=max (r_size, align); - aligns[order] += align; +/* +* If resource's size is larger than its alignment, +* some configurations result in an unwanted gap in +* the head space that the larger resource cannot +* fill. +*/ +if (r_size <= align) + aligns[order] += align;if (order > max_order) max_order = order;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 256/957 iommu/riscv: Skip IRQ count check when using MSI interrupts
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yaxing Guo <[email protected]>
[ Upstream commit 7217cee35aadbb07e12673bcf1dcf729e1b2f6c9 ]
In RISC-V IOMMU platform devices that use MSI interrupts (indicated by the presence of 'msi-parent' in the device tree), there are no wired interrupt lines, so calling platform_get_irq_count() returns 0 or -ENXIO, causing the driver to fail during probe.
However, MSI interrupts are allocated dynamically via the MSI subsystem and do not appear in the device tree 'interrupts' property. Therefore, the driver should not require a non-zero IRQ count when 'msi-parent' is present.
This patch fixes the bug where probe fails when using MSI interrupts
(which do not have an 'interrupts' property in the device tree)..
Stable-dep-of: 553a127cb665 ("iommu/riscv: Fix signedness bug")
--- drivers/iommu/riscv/iommu-platform.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/iommu/riscv/iommu-platform.c +8 -6
@@ -68,12 +68,7 @@ static int riscv_iommu_platform_probe(struct platform_device *pdev) iommu->caps =riscv_iommu_readq (iommu,RISCV_IOMMU_REG_CAPABILITIES ); iommu->fctl =riscv_iommu_readl (iommu,RISCV_IOMMU_REG_FCTL ); - iommu->irqs_count =platform_irq_count (pdev); -if (iommu->irqs_count <=0 ) -return dev_err_probe (dev, -ENODEV , -"no IRQ resources provided\n" ); -if (iommu->irqs_count >RISCV_IOMMU_INTR_COUNT ) - iommu->irqs_count =RISCV_IOMMU_INTR_COUNT ; + iommu->irqs_count =RISCV_IOMMU_INTR_COUNT ; igs =FIELD_GET (RISCV_IOMMU_CAPABILITIES_IGS , iommu->caps);switch (igs) {
@@ -120,6 +115,13 @@ static int riscv_iommu_platform_probe(struct platform_device *pdev) fallthrough;case RISCV_IOMMU_CAPABILITIES_IGS_WSI : + iommu->irqs_count =platform_irq_count (pdev); +if (iommu->irqs_count <=0 ) +return dev_err_probe (dev, -ENODEV , +"no IRQ resources provided\n" ); +if (iommu->irqs_count >RISCV_IOMMU_INTR_COUNT ) + iommu->irqs_count =RISCV_IOMMU_INTR_COUNT ; +for (vec =0 ; vec < iommu->irqs_count; vec++) iommu->irqs[vec] =platform_get_irq (pdev, vec);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 257/957 iommu/riscv: Fix signedness bug
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ethan Tidmore <[email protected]>
[ Upstream commit 553a127cb66523089bc10eb54640205495f4bb5b ]
The function platform_irq_count() returns negative error codes and iommu->irqs_count is an unsigned integer, so the check (iommu->irqs_count <= 0) is always impossible.
Make the return value of platform_irq_count() be assigned to ret, check for error, and then assign iommu->irqs_count to ret.
Detected by Smatch:drivers/iommu/riscv/iommu-platform.c:119 riscv_iommu_platform_probe() warn:
'iommu->irqs_count' unsigned <= 0
--- drivers/iommu/riscv/iommu-platform.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/iommu/riscv/iommu-platform.c +5 -2
@@ -115,10 +115,13 @@ static int riscv_iommu_platform_probe(struct platform_device *pdev) fallthrough;case RISCV_IOMMU_CAPABILITIES_IGS_WSI : - iommu->irqs_count =platform_irq_count (pdev); -if (iommu->irqs_count <=0 ) + ret =platform_irq_count (pdev); +if (ret <=0 )return dev_err_probe (dev, -ENODEV ,"no IRQ resources provided\n" ); + + iommu->irqs_count = ret; +if (iommu->irqs_count >RISCV_IOMMU_INTR_COUNT ) iommu->irqs_count =RISCV_IOMMU_INTR_COUNT ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 258/957 ALSA: core: Validate compress device numbers without dynamic minors
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cássio Gabriel <[email protected]>
[ Upstream commit 796e119e9b14763be905ad0d023c71a14bc2e931 ]
Without CONFIG_SND_DYNAMIC_MINORS, ALSA reserves only two fixed minors for compress devices on each card: comprD0 and comprD1.
snd_find_free_minor() currently computes the compress minor as type + dev without validating dev first, so device numbers greater than 1 spill into the HWDEP minor range instead of failing registration.
ASoC passes rtd->id to snd_compress_new(), so this can happen on real non-dynamic-minor builds.
Add a dedicated fixed-minor check for SNDRV_DEVICE_TYPE_COMPRESS in snd_find_free_minor() and reject out-of-range device numbers with -EINVAL before constructing the minor.
Also remove the stale TODO in compress_offload.c that still claims multiple compress nodes are missing.
--- sound/core/compress_offload.c | 7 ------- sound/core/sound.c | 7 +++++++ 2 files changed, 7 insertions(+), 7 deletions(-)
sound/core/compress_offload.c +0 -7
@@ -41,13 +41,6 @@#define COMPR_CODEC_CAPS_OVERFLOW #endif -/* TODO: -* - add substream support for multiple devices in case of -* SND_DYNAMIC_MINORS is not used -* - Multiple node representation -* driver should be able to register multiple nodes -*/ -struct snd_compr_file {unsigned long caps;struct snd_compr_stream stream;
sound/core/sound.c +7 -0
@@ -216,9 +216,16 @@ static int snd_find_free_minor(int type, struct snd_card *card, int dev)case SNDRV_DEVICE_TYPE_RAWMIDI :case SNDRV_DEVICE_TYPE_PCM_PLAYBACK :case SNDRV_DEVICE_TYPE_PCM_CAPTURE : +if (snd_BUG_ON (!card)) +return -EINVAL ; + minor =SNDRV_MINOR (card->number, type + dev); +break ;case SNDRV_DEVICE_TYPE_COMPRESS :if (snd_BUG_ON (!card))return -EINVAL ; +if (dev <0 || + dev >=SNDRV_MINOR_HWDEP -SNDRV_MINOR_COMPRESS ) +return -EINVAL ; minor =SNDRV_MINOR (card->number, type + dev);break ;default :
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 259/957 ASoC: amd: acp: update dmic_num logic for acp pdm dmic
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vijendar Mukunda <[email protected]>
[ Upstream commit 5902e1f3c501375797dcd7ca21b58e2c9abbe317 ]
Currently there is no mechanism to read dmic_num in mach_params structure. In this scenario mach_params->dmic_num check always returns 0 which fails to add component string for dmic. Update the condition check with acp pdm dmic quirk check and pass the dmic_num as 1.
--- sound/soc/amd/acp/acp-sdw-legacy-mach.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/amd/acp/acp-sdw-legacy-mach.c +2 -2
@@ -520,11 +520,11 @@ static int mc_probe(struct platform_device *pdev) " cfg-amp:%d", amp_num);if (!card->components)return -ENOMEM ; -if (mach->mach_params.dmic_num) { +if (soc_sdw_quirk &ASOC_SDW_ACP_DMIC ) { card->components =devm_kasprintf (card->dev,GFP_KERNEL ,"%s mic:dmic cfg-mics:%d" , card->components, - mach->mach_params.dmic_num); +1 );if (!card->components)return -ENOMEM ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 260/957 drm/amd/pm/ci: Use highest MCLK on CI when MCLK DPM is disabled
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit 894f0d34d66cb47fe718fe2ae5c18729d22c5218 ]
When MCLK DPM is disabled for any reason, populate the MCLK table with the highest MCLK DPM level, so that the ASIC can use the highest possible memory clock to get good performance even when MCLK DPM is disabled.
--- drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c +8 -0
@@ -1322,6 +1322,14 @@ static int ci_populate_all_memory_levels(struct pp_hwmgr *hwmgr)return result; } +if (data->mclk_dpm_key_disabled && dpm_table->mclk_table.count) { +/* Populate the table with the highest MCLK level when MCLK DPM is disabled */ +for (i =0 ; i < dpm_table->mclk_table.count -1 ; i++) { + levels[i] = levels[dpm_table->mclk_table.count -1 ]; + levels[i].DisplayWatermark =PPSMC_DISPLAY_WATERMARK_HIGH ; + } + } + smu_data->smc_state_table.MemoryLevel[0 ].EnabledForActivity =1 ; dev_id = adev->pdev->device;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 261/957 drm/amd/pm/ci: Disable MCLK DPM on problematic CI ASICs
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit 9851f29cb06c09f7dad3867d8b0feec3fc71b6c8 ]
There are two known cases where MCLK DPM can causes issues:
Radeon R9 M380 found in iMac computers from 2015. The SMU in this GPU just hangs as soon as we send it the PPSMC_MSG_MCLKDPM_Enable command, even when MCLK switching is disabled, and even when we only populate one MCLK DPM level. Apply workaround to all devices with the same subsystem ID.
Radeon R7 260X due to old memory controller microcode. We only flash the MC ucode when it isn't set up by the VBIOS, therefore there is no way to make sure that it has the correct ucode version.
I verified that this patch fixes the SMU hang on the R9 M380 which would previously fail to boot. This also fixes the UVD initialization error on that GPU which happened because the SMU couldn't ungate the UVD after it hung.
--- drivers/gpu/drm/amd/pm/powerplay/hwmgr/hwmgr.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
drivers/gpu/drm/amd/pm/powerplay/hwmgr/hwmgr.c +15 -0
@@ -104,6 +104,21 @@ int hwmgr_early_init(struct pp_hwmgr *hwmgr) PP_GFXOFF_MASK); hwmgr->pp_table_version =PP_TABLE_V0 ; hwmgr->od_enabled = false; +switch (hwmgr->chip_id) { +case CHIP_BONAIRE : +/* R9 M380 in iMac 2015: SMU hangs when enabling MCLK DPM +* R7 260X cards with old MC ucode: MCLK DPM is unstable +*/ +if (adev->pdev->subsystem_vendor ==0x106B || + adev->pdev->device ==0x6658 ) { +dev_info (adev->dev,"disabling MCLK DPM on quirky ASIC" ); + adev->pm.pp_feature &= ~PP_MCLK_DPM_MASK ; + hwmgr->feature_mask &= ~PP_MCLK_DPM_MASK ; + } +break ; +default : +break ; + }smu7_init_function_pointers (hwmgr);break ;case AMDGPU_FAMILY_CZ :
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 262/957 drm/amd/pm/smu7: Fix SMU7 voltage dependency on display clock
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit 0138610c14130425be53423b35336561829965e0 ]
The DCE (display controller engine) requires a minimum voltage in order to function correctly, depending on which clock level it currently uses.
Add a new table that contains display clock frequency levels and the corresponding required voltages. The clock frequency levels are taken from DC (and the old radeon driver's voltage dependency table for CI in cases where its values were lower). The voltage levels are taken from the following function:phm_initializa_dynamic_state_adjustment_rule_settings(). Furthermore, in case of CI, call smu7_patch_vddc() on the new table to account for leakage voltage (like in radeon).
Use the display clock value from amd_pp_display_configuration to look up the voltage level needed by the DCE. Send the voltage to the SMU via the PPSMC_MSG_VddC_Request command.
The previous implementation of this feature was non-functional because it relied on a "dal_power_level" field which was never assigned; and it was not at all implemented for CI ASICs.
I verified this on a Radeon R9 M380 which previously booted to a black screen with DC enabled (default since Linux 6.19), but now works correctly.
--- .../drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c | 88 ++++++++++++++++++- drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h | 1 + 2 files changed, 86 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +85 -3
@@ -2802,6 +2802,10 @@ static int smu7_patch_dependency_tables_with_leakage(struct pp_hwmgr *hwmgr)if (tmp)return -EINVAL ; + tmp =smu7_patch_vddc (hwmgr, hwmgr->dyn_state.vddc_dependency_on_display_clock); +if (tmp) +return -EINVAL ; + tmp =smu7_patch_vce_vddc (hwmgr, hwmgr->dyn_state.vce_clock_voltage_dependency_table);if (tmp)return -EINVAL ;
@@ -2885,6 +2889,8 @@ static int smu7_hwmgr_backend_fini(struct pp_hwmgr *hwmgr) {kfree (hwmgr->dyn_state.vddc_dep_on_dal_pwrl); hwmgr->dyn_state.vddc_dep_on_dal_pwrl =NULL ; +kfree (hwmgr->dyn_state.vddc_dependency_on_display_clock); + hwmgr->dyn_state.vddc_dependency_on_display_clock =NULL ;kfree (hwmgr->backend); hwmgr->backend =NULL ;
@@ -2955,6 +2961,51 @@ static int smu7_update_edc_leakage_table(struct pp_hwmgr *hwmgr)return ret; } +static int smu7_init_voltage_dependency_on_display_clock_table (struct pp_hwmgr *hwmgr) +{ +struct phm_clock_voltage_dependency_table *table; + +if (!amdgpu_device_ip_get_ip_block (hwmgr->adev,AMD_IP_BLOCK_TYPE_DCE )) +return 0 ; + + table =kzalloc (struct_size (table, entries,4 ),GFP_KERNEL ); +if (!table) +return -ENOMEM ; + +if (hwmgr->chip_id >=CHIP_POLARIS10 ) { + table->entries[0 ].clk =38918 ; + table->entries[1 ].clk =45900 ; + table->entries[2 ].clk =66700 ; + table->entries[3 ].clk =113200 ; + + table->entries[0 ].v =700 ; + table->entries[1 ].v =740 ; + table->entries[2 ].v =800 ; + table->entries[3 ].v =900 ; + }else { +if (hwmgr->chip_family ==AMDGPU_FAMILY_CZ ) { + table->entries[0 ].clk =35200 ; + table->entries[1 ].clk =35200 ; + table->entries[2 ].clk =46700 ; + table->entries[3 ].clk =64300 ; + }else { + table->entries[0 ].clk =0 ; + table->entries[1 ].clk =35200 ; + table->entries[2 ].clk =54000 ; + table->entries[3 ].clk =62500 ; + } + + table->entries[0 ].v =0 ; + table->entries[1 ].v =720 ; + table->entries[2 ].v =810 ; + table->entries[3 ].v =900 ; + } + + table->count =4 ; + hwmgr->dyn_state.vddc_dependency_on_display_clock = table; +return 0 ; +} +static int smu7_hwmgr_backend_init (struct pp_hwmgr *hwmgr) {struct amdgpu_device *adev = hwmgr->adev;
@@ -2983,6 +3034,10 @@ static int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr)smu7_get_elb_voltages (hwmgr); } + result =smu7_init_voltage_dependency_on_display_clock_table (hwmgr); +if (result) + goto fail; +if (hwmgr->pp_table_version ==PP_TABLE_V1 ) {smu7_complete_dependency_tables (hwmgr);smu7_set_private_data_based_on_pptable_v1 (hwmgr);
@@ -3079,13 +3134,40 @@ static int smu7_force_dpm_highest(struct pp_hwmgr *hwmgr)return 0 ; } +static uint32_t smu7_lookup_vddc_from_dispclk (struct pp_hwmgr *hwmgr) +{ +const struct amd_pp_display_configuration *cfg = hwmgr->display_config; +const struct phm_clock_voltage_dependency_table *vddc_dep_on_dispclk = + hwmgr->dyn_state.vddc_dependency_on_display_clock; +uint32_t i; + +if (!vddc_dep_on_dispclk || !vddc_dep_on_dispclk->count || + !cfg || !cfg->num_display || !cfg->display_clk) +return 0 ; + +/* Start from 1 because ClocksStateUltraLow should not be used according to DC. */ +for (i =1 ; i < vddc_dep_on_dispclk->count; ++i) +if (vddc_dep_on_dispclk->entries[i].clk >= cfg->display_clk) +return vddc_dep_on_dispclk->entries[i].v; + +return vddc_dep_on_dispclk->entries[vddc_dep_on_dispclk->count -1 ].v; +} + +static void smu7_apply_minimum_dce_voltage_request (struct pp_hwmgr *hwmgr) +{ +uint32_t req_vddc =smu7_lookup_vddc_from_dispclk (hwmgr); + +smum_send_msg_to_smc_with_parameter (hwmgr, + PPSMC_MSG_VddC_Request, + req_vddc *VOLTAGE_SCALE , +NULL ); +} +static int smu7_upload_dpm_level_enable_mask (struct pp_hwmgr *hwmgr) {struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); -if (hwmgr->pp_table_version ==PP_TABLE_V1 ) -phm_apply_dal_min_voltage_request (hwmgr); -/* TO DO for v0 iceland and Ci*/ +smu7_apply_minimum_dce_voltage_request (hwmgr);if (!data->sclk_dpm_key_disabled) {if (data->dpm_level_enable_mask.sclk_dpm_enable_mask)
drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h +1 -0
@@ -631,6 +631,7 @@ struct phm_dynamic_state_info {struct phm_clock_voltage_dependency_table *vddci_dependency_on_mclk;struct phm_clock_voltage_dependency_table *vddc_dependency_on_mclk;struct phm_clock_voltage_dependency_table *mvdd_dependency_on_mclk; +struct phm_clock_voltage_dependency_table *vddc_dependency_on_display_clock;struct phm_clock_voltage_dependency_table *vddc_dep_on_dal_pwrl;struct phm_clock_array *valid_sclk_values;struct phm_clock_array *valid_mclk_values;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 263/957 drm/amd/pm/ci: Fix powertune defaults for Hawaii 0x67B0
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit d784759c07924280f3c313f205fc48eb62d7cb71 ]
There is no AMD GPU with the ID 0x66B0, this looks like a typo. It should be 0x67B0 which is actually part of the PCI ID list, and should use the Hawaii XT powertune defaults according to the old radeon driver.
--- drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c +1 -1
@@ -245,7 +245,7 @@ static void ci_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr) smu_data->power_tune_defaults = &defaults_hawaii_pro;break ;case 0x67B8 : -case 0x66B0 : +case 0x67B0 : smu_data->power_tune_defaults = &defaults_hawaii_xt;break ;case 0x6640 :
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 264/957 drm/amd/pm/ci: Clear EnabledForActivity field for memory levels
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit 5facfd4c4c67e8500116ffec0d9da35d92b9c787 ]
Follow what radeon did and what amdgpu does for other GPUs with SMU7.
--- drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c +1 -1
@@ -1217,7 +1217,7 @@ static int ci_populate_single_memory_level( } memory_level->EnabledForThrottle =1 ; - memory_level->EnabledForActivity =1 ; + memory_level->EnabledForActivity =0 ; memory_level->UpH = data->current_profile_setting.mclk_up_hyst; memory_level->DownH = data->current_profile_setting.mclk_down_hyst; memory_level->VoltageDownH =0 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 265/957 drm/amd/pm/ci: Fill DW8 fields from SMC
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit baf28ec5795c077406d6f52b8ad39e614153bce6 ]
In ci_populate_dw8() we currently just read a value from the SMU and then throw it away. Instead of throwing away the value, we should use it to fill other fields in DW8 (like radeon).
Otherwise the value of the other fiels is just cleared when we copy this data to the SMU later.
--- drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c +1 -2
@@ -543,12 +543,11 @@ static int ci_populate_dw8(struct pp_hwmgr *hwmgr, uint32_t fuse_table_offset) {struct ci_smumgr *smu_data = (struct ci_smumgr *)(hwmgr->smu_backend);const struct ci_pt_defaults *defaults = smu_data->power_tune_defaults; -uint32_t temp;if (ci_read_smc_sram_dword (hwmgr, fuse_table_offset + offsetof(SMU7_Discrete_PmFuses , TdcWaterfallCtl), - (uint32_t *)&temp,SMC_RAM_END )) + (uint32_t *)&smu_data->power_tune_table.TdcWaterfallCtl,SMC_RAM_END ))PP_ASSERT_WITH_CODE (false,"Attempt to read PmFuses.DW6 (SviLoadLineEn) from SMC Failed!" , return -EINVAL );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 266/957 drm/amd/pm/smu7: Add SCLK cap for quirky Hawaii board
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit 4724bc5b8d78c34b993594f9406135408ccb312a ]
On a specific Radeon R9 390X board, the GPU can "randomly" hang while gaming. Initially I thought this was a RADV bug and tried to work around this in Mesa:
commit 8ea08747b86b ("radv: Mitigate GPU hang on Hawaii in Dota 2 and RotTR")
However, I got some feedback from other users who are reporting that the above mitigation causes a significant performance regression for them, and they didn't experience the hang on their GPU in the first place.
After some further investigation, it turns out that the problem is that the highest SCLK DPM level on this board isn't stable. Lowering SCLK to 1040 MHz (from 1070 MHz) works around the issue, and has a negligible impact on performance compared to the Mesa patch. (Note that increasing the voltage can also work around it, but we felt that lowering the SCLK is the safer option.)
To solve the above issue, add an "sclk_cap" field to smu7_hwmgr and set this field for the affected board. The capped SCLK value correctly appears on the sysfs interface and shows up in GUI tools such as LACT.
--- .../drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c | 30 ++++++++++++++++--- .../drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.h | 1 + 2 files changed, 27 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +26 -4
@@ -787,7 +787,7 @@ static int smu7_setup_dpm_tables_v0(struct pp_hwmgr *hwmgr) hwmgr->dyn_state.vddc_dependency_on_mclk;struct phm_cac_leakage_table *std_voltage_table = hwmgr->dyn_state.cac_leakage_table; -uint32_t i; +uint32_t i, clk;PP_ASSERT_WITH_CODE (allowed_vdd_sclk_table !=NULL ,"SCLK dependency table is missing. This table is mandatory" , return -EINVAL );
@@ -804,10 +804,12 @@ static int smu7_setup_dpm_tables_v0(struct pp_hwmgr *hwmgr) data->dpm_table.sclk_table.count =0 ;for (i =0 ; i < allowed_vdd_sclk_table->count; i++) { + clk =min (allowed_vdd_sclk_table->entries[i].clk, data->sclk_cap); +if (i ==0 || data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count-1 ].value != - allowed_vdd_sclk_table->entries[i].clk) { + clk) { data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count].value = - allowed_vdd_sclk_table->entries[i].clk; + clk; data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count].enabled = (i ==0 ) ?1 :0 ; data->dpm_table.sclk_table.count++; }
@@ -3006,6 +3008,25 @@ static int smu7_init_voltage_dependency_on_display_clock_table(struct pp_hwmgr *return 0 ; } +static void smu7_set_sclk_cap (struct pp_hwmgr *hwmgr) +{ +struct amdgpu_device *adev = hwmgr->adev; +struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); + + data->sclk_cap =0xffffffff ; + +if (hwmgr->od_enabled) +return ; + +/* R9 390X board: last sclk dpm level is unstable, use lower sclk */ +if (adev->pdev->device ==0x67B0 && + adev->pdev->subsystem_vendor ==0x1043 ) + data->sclk_cap =104000 ;/* 1040 MHz */ + +if (data->sclk_cap !=0xffffffff ) +dev_info (adev->dev,"sclk cap: %u kHz on quirky ASIC\n" , data->sclk_cap *10 ); +} +static int smu7_hwmgr_backend_init (struct pp_hwmgr *hwmgr) {struct amdgpu_device *adev = hwmgr->adev;
@@ -3017,6 +3038,7 @@ static int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr)return -ENOMEM ; hwmgr->backend = data; +smu7_set_sclk_cap (hwmgr);smu7_patch_voltage_workaround (hwmgr);smu7_init_dpm_defaults (hwmgr);
@@ -3903,7 +3925,7 @@ static int smu7_get_pp_table_entry_callback_func_v0(struct pp_hwmgr *hwmgr,/* Performance levels are arranged from low to high. */ performance_level->memory_clock = memory_clock; - performance_level->engine_clock = engine_clock; + performance_level->engine_clock =min (engine_clock, data->sclk_cap); pcie_gen_from_bios = visland_clk_info->ucPCIEGen;
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.h +1 -0
@@ -234,6 +234,7 @@ struct smu7_hwmgr {uint32_t pcie_gen_cap;uint32_t pcie_lane_cap;uint32_t pcie_spc_cap; +uint32_t sclk_cap;struct smu7_leakage_voltage vddc_leakage;struct smu7_leakage_voltage vddci_leakage;struct smu7_leakage_voltage vddcgfx_leakage;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 267/957 drm/amdgpu/uvd4.2: Dont initialize UVD 4.2 when DPM is disabled
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit 8b3e8fa6d7bdab292447a43f70532db437d5d4f5 ]
UVD 4.2 doesn't work at all when DPM is disabled because the SMU is responsible for ungating it. So, Linux fails to boot with CIK GPUs when using the amdgpu.dpm=0 parameter.
Fix this by returning -ENOENT from uvd_v4_2_early_init() when amdgpu_dpm isn't enabled.
Note: amdgpu.dpm=0 is often suggested as a workaround for issues and is useful for debugging.
--- drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c +5 -0
@@ -93,6 +93,11 @@ static void uvd_v4_2_ring_set_wptr(struct amdgpu_ring *ring)static int uvd_v4_2_early_init (struct amdgpu_ip_block *ip_block) {struct amdgpu_device *adev = ip_block->adev; + +/* UVD doesn't work without DPM, it needs DPM to ungate it. */ +if (!amdgpu_dpm) +return -ENOENT ; + adev->uvd.num_uvd_inst =1 ;uvd_v4_2_set_ring_funcs (adev);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 268/957 PCI/DPC: Log AER error info for DPC/EDR uncorrectable errors
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuppuswamy Sathyanarayanan <[email protected]>
[ Upstream commit 97970e7c694356e3386a10e3b936d61eafd06bce ]
aer_print_error() skips printing if ratelimit_print[i] is not set. In the native AER path, ratelimit_print is initialized by add_error_device() during source device discovery, and is set to 1 for fatal errors to bypass rate limiting since fatal errors should always be logged.
The DPC/EDR path uses the DPC-capable port as the error source and reads its AER uncorrectable error status registers directly in dpc_get_aer_uncorrect_severity(). Since it does not go through add_error_device(), ratelimit_print[0] is left uninitialized and zero. As a result, aer_print_error() silently drops all AER error messages for DPC/EDR triggered events.
Set ratelimit_print[0] to 1 to bypass rate limiting and always print AER logs for uncorrectable errors detected by the DPC port.
--- drivers/pci/pcie/dpc.c | 1 + 1 file changed, 1 insertion(+)
drivers/pci/pcie/dpc.c +1 -0
@@ -256,6 +256,7 @@ static int dpc_get_aer_uncorrect_severity(struct pci_dev *dev, info->dev[0 ] = dev; info->error_dev_num =1 ; + info->ratelimit_print[0 ] =1 ;return 1 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 269/957 hwmon: (aspeed-g6-pwm-tach): remove redundant driver remove callback
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Billy Tsai <[email protected]>
[ Upstream commit 46fef8583daa1bf78fda7eaa523c64d4440322ac ]
Drops the remove callback as it only asserts reset and the probe already registers a devres action (devm_add_action_or_reset()) to call aspeed_pwm_tach_reset_assert().
--- drivers/hwmon/aspeed-g6-pwm-tach.c | 8 -------- 1 file changed, 8 deletions(-)
drivers/hwmon/aspeed-g6-pwm-tach.c +0 -8
@@ -517,13 +517,6 @@ static int aspeed_pwm_tach_probe(struct platform_device *pdev)return 0 ; } -static void aspeed_pwm_tach_remove (struct platform_device *pdev) -{ -struct aspeed_pwm_tach_data *priv =platform_get_drvdata (pdev); - -reset_control_assert (priv->reset); -} -static const struct of_device_id aspeed_pwm_tach_match[] = { { .compatible ="aspeed,ast2600-pwm-tach" ,
@@ -534,7 +527,6 @@ MODULE_DEVICE_TABLE(of, aspeed_pwm_tach_match);static struct platform_driver aspeed_pwm_tach_driver = { .probe = aspeed_pwm_tach_probe, - .remove = aspeed_pwm_tach_remove, .driver = { .name ="aspeed-g6-pwm-tach" , .of_match_table = aspeed_pwm_tach_match,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 270/957 ALSA: hda/realtek: fix code style (ERROR: else should follow close brace })
In reply to Greg Kroah-Hartman6.18-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
@@ -2237,9 +2237,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 271/957 ASoC: SOF: Intel: hda: Place check before dereference
In reply to Greg Kroah-Hartman6.18-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
@@ -445,16 +445,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 272/957 drm/msm/vma: Avoid lock in VM_BIND fence signaling path
In reply to Greg Kroah-Hartman6.18-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
@@ -533,8 +533,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
@@ -680,6 +680,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 ;
@@ -722,12 +723,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 273/957 drm/msm: Reject fb creation from _NO_SHARE objs
In reply to Greg Kroah-Hartman6.18-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 274/957 drm/msm: Fix VM_BIND UNMAP locking
In reply to Greg Kroah-Hartman6.18-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
@@ -1232,7 +1232,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 275/957 drm/msm/a6xx: Fix HLSQ register dumping
In reply to Greg Kroah-Hartman6.18-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 276/957 drm/msm/shrinker: Fix can_block() logic
In reply to Greg Kroah-Hartman6.18-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 277/957 drm/msm/a6xx: Fix dumping A650+ debugbus blocks
In reply to Greg Kroah-Hartman6.18-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 278/957 drm/msm/a6xx: Use barriers while updating HFI Q headers
In reply to Greg Kroah-Hartman6.18-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
@@ -33,7 +33,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 ; }
@@ -61,7 +61,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); }
@@ -73,7 +76,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++;
@@ -94,7 +97,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 279/957 ALSA: hda/cmedia: Remove duplicate pin configuration parsing
In reply to Greg Kroah-Hartman6.18-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 280/957 pmdomain: ti: omap_prm: Fix a reference leak on device node
In reply to Greg Kroah-Hartman6.18-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 281/957 pmdomain: imx: scu-pd: Fix device_node reference leak during ->probe()
In reply to Greg Kroah-Hartman6.18-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 282/957 PM: domains: De-constify fields in struct dev_pm_domain_attach_data
In reply to Greg Kroah-Hartman6.18-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 283/957 drm/msm/dpu: drop INTF_0 on MSM8953
In reply to Greg Kroah-Hartman6.18-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 284/957 ASoC: fsl_micfil: Add access property for "VAD Detected"
In reply to Greg Kroah-Hartman6.18-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
@@ -424,7 +424,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 285/957 ASoC: fsl_micfil: Fix event generation in hwvad_put_enable()
In reply to Greg Kroah-Hartman6.18-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
@@ -306,10 +306,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 286/957 ASoC: fsl_micfil: Fix event generation in hwvad_put_init_mode()
In reply to Greg Kroah-Hartman6.18-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
@@ -336,13 +336,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 287/957 ASoC: fsl_micfil: Fix event generation in micfil_put_dc_remover_state()
In reply to Greg Kroah-Hartman6.18-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
@@ -272,6 +272,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 */
@@ -281,10 +285,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 288/957 ASoC: fsl_micfil: Fix event generation in micfil_quality_set()
In reply to Greg Kroah-Hartman6.18-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
@@ -210,10 +210,34 @@ static int micfil_quality_set(struct snd_kcontrol *kcontrol, {struct snd_soc_component *cmpnt =snd_soc_kcontrol_component (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 289/957 ASoC: fsl_xcvr: Fix event generation in fsl_xcvr_arc_mode_put()
In reply to Greg Kroah-Hartman6.18-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 290/957 ASoC: fsl_xcvr: Fix event generation in fsl_xcvr_mode_put()
In reply to Greg Kroah-Hartman6.18-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 291/957 ASoC: fsl_easrc: Check the variable range in fsl_easrc_iec958_put_bits()
In reply to Greg Kroah-Hartman6.18-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 292/957 ASoC: fsl_easrc: Fix value type in fsl_easrc_iec958_get_bits()
In reply to Greg Kroah-Hartman6.18-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 293/957 ASoC: fsl_easrc: Change the type for iec958 channel status controls
In reply to Greg Kroah-Hartman6.18-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 294/957 iommu/amd: Fix clone_alias() to use the original devices devid
In reply to Greg Kroah-Hartman6.18-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
@@ -381,11 +381,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 ;
@@ -432,9 +433,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 295/957 iommu/riscv: Remove overflows on the invalidation path
In reply to Greg Kroah-Hartman6.18-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 296/957 ASoC: qcom: qdsp6: topology: check widget type before accessing data
In reply to Greg Kroah-Hartman6.18-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 297/957 PCI: dwc: Fix type mismatch for kstrtou32_from_user() return value
In reply to Greg Kroah-Hartman6.18-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 298/957 crypto: qat - disable 4xxx AE cluster when lead engine is fused off
In reply to Greg Kroah-Hartman6.18-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 299/957 crypto: qat - disable 420xx AE cluster when lead engine is fused off
In reply to Greg Kroah-Hartman6.18-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
@@ -96,9 +96,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 300/957 crypto: qat - fix compression instance leak
In reply to Greg Kroah-Hartman6.18-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 301/957 crypto: qat - fix type mismatch in RAS sysfs show functions
In reply to Greg Kroah-Hartman6.18-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 302/957 crypto: iaa - fix per-node CPU counter reset in rebalance_wq_table()
In reply to Greg Kroah-Hartman6.18-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
@@ -911,8 +911,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 303/957 crypto: qat - use swab32 macro
In reply to Greg Kroah-Hartman6.18-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 304/957 ASoC: rsnd: Fix potential out-of-bounds access of component_dais[]
In reply to Greg Kroah-Hartman6.18-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 305/957 PCI: Enable AtomicOps only if Root Port supports them
In reply to Greg Kroah-Hartman6.18-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
@@ -3818,8 +3818,7 @@ int pci_rebar_set_size(struct pci_dev *pdev, int bar, int size)*/ 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;/*
@@ -3849,35 +3848,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 306/957 PCI: mediatek-gen3: Prevent leaking IRQ domains when IRQ not found
In reply to Greg Kroah-Hartman6.18-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 307/957 gpu: nova-core: register: use field type for Into implementation
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandre Courbot <[email protected]>
[ Upstream commit 3f674dc4ef1b3783f9d8dae33b46bf50eaac7c79 ]
The getter method of a field works with the field type, but its setter expects the type of the register. This leads to an asymmetry in the From/Into implementations required for a field with a dedicated type. For instance, a field declared as
pub struct ControlReg(u32) {
3:0 mode as u8 ?=> Mode;
...
}currently requires the following implementations:
impl TryFrom<u8> for Mode {
...
}
impl From<Mode> for u32 {
...
}Change this so the From<Mode> now needs to be implemented for u8, i.e. the primitive type of the field. This is more consistent, and will become a requirement once we start using the TryFrom/Into derive macros to implement these automatically.
Message-ID: <[email protected]>
Stable-dep-of: de0aca13509b ("gpu: nova-core: bitfield: fix broken Default implementation")
--- drivers/gpu/nova-core/falcon.rs | 38 ++++++++++++++++++++-------- drivers/gpu/nova-core/regs/macros.rs | 10 ++++---- 2 files changed, 32 insertions(+), 16 deletions(-)
drivers/gpu/nova-core/falcon.rs +27 -11
@@ -22,11 +22,11 @@ mod hal;pub (crate )mod sec2;// TODO[FPRI]: Replace with `ToPrimitive`. -macro_rules! impl_from_enum_to_u32 { +macro_rules! impl_from_enum_to_u8 { ($enum_type:ty) => { -impl From <$enum_type>for u32 { +impl From <$enum_type>for u8 {fn from (value: $enum_type) ->Self { - valueas u32 + valueas u8 } } };
@@ -46,7 +46,7 @@ pub(crate) enum FalconCoreRev { Rev6 = 6, Rev7 = 7, } -impl_from_enum_to_u32! (FalconCoreRev ); +impl_from_enum_to_u8! (FalconCoreRev );// TODO[FPRI]: replace with `FromPrimitive`. impl TryFrom <u8 >for FalconCoreRev {
@@ -81,7 +81,7 @@ pub(crate) enum FalconCoreRevSubversion { Subversion2 = 2, Subversion3 = 3, } -impl_from_enum_to_u32! (FalconCoreRevSubversion ); +impl_from_enum_to_u8! (FalconCoreRevSubversion );// TODO[FPRI]: replace with `FromPrimitive`. impl TryFrom <u8 >for FalconCoreRevSubversion {
@@ -125,7 +125,7 @@ pub(crate) enum FalconSecurityModel {/// Also known as High-Secure, Privilege Level 3 or PL3. Heavy = 3, } -impl_from_enum_to_u32! (FalconSecurityModel ); +impl_from_enum_to_u8! (FalconSecurityModel );// TODO[FPRI]: replace with `FromPrimitive`. impl TryFrom <u8 >for FalconSecurityModel {
@@ -157,7 +157,7 @@ pub(crate) enum FalconModSelAlgo {#[default] Rsa3k = 1, } -impl_from_enum_to_u32! (FalconModSelAlgo ); +impl_from_enum_to_u8! (FalconModSelAlgo );// TODO[FPRI]: replace with `FromPrimitive`. impl TryFrom <u8 >for FalconModSelAlgo {
@@ -179,7 +179,7 @@ pub(crate) enum DmaTrfCmdSize {#[default] Size256B = 0x6, } -impl_from_enum_to_u32! (DmaTrfCmdSize ); +impl_from_enum_to_u8! (DmaTrfCmdSize );// TODO[FPRI]: replace with `FromPrimitive`. impl TryFrom <u8 >for DmaTrfCmdSize {
@@ -202,7 +202,6 @@ pub(crate) enum PeregrineCoreSelect {/// RISC-V core is active. Riscv = 1, } -impl_from_enum_to_u32! (PeregrineCoreSelect );impl From <bool >for PeregrineCoreSelect {fn from (value:bool ) ->Self {
@@ -213,6 +212,15 @@ impl From<bool> for PeregrineCoreSelect { } } +impl From <PeregrineCoreSelect >for bool { +fn from (value:PeregrineCoreSelect ) ->Self { +match value { +PeregrineCoreSelect ::Falcon =>false , +PeregrineCoreSelect ::Riscv =>true , + } + } +} +/// Different types of memory present in a falcon core. #[derive( Debug , Clone , Copy , PartialEq , Eq )] pub (crate )enum FalconMem {
@@ -236,7 +244,7 @@ pub(crate) enum FalconFbifTarget {/// Non-coherent system memory (System DRAM). NoncoherentSysmem = 2, } -impl_from_enum_to_u32! (FalconFbifTarget ); +impl_from_enum_to_u8! (FalconFbifTarget );// TODO[FPRI]: replace with `FromPrimitive`. impl TryFrom <u8 >for FalconFbifTarget {
@@ -263,7 +271,6 @@ pub(crate) enum FalconFbifMemType {/// Physical memory addresses. Physical = 1, } -impl_from_enum_to_u32! (FalconFbifMemType );/// Conversion from a single-bit register field. impl From <bool >for FalconFbifMemType {
@@ -275,6 +282,15 @@ impl From<bool> for FalconFbifMemType { } } +impl From <FalconFbifMemType >for bool { +fn from (value:FalconFbifMemType ) ->Self { +match value { +FalconFbifMemType ::Virtual =>false , +FalconFbifMemType ::Physical =>true , + } + } +} +/// Type used to represent the `PFALCON` registers address base for a given falcon engine. pub (crate )struct PFalconBase (());
drivers/gpu/nova-core/regs/macros.rs +5 -5
@@ -482,7 +482,7 @@ macro_rules! register {register! ( @leaf_accessor $name $hi:$lo $field { |f| <$into_type>::from (if f !=0 {true }else {false }) } - $into_type => $into_type $(, $comment)?; +bool $into_type => $into_type $(, $comment)?; ); };
@@ -499,7 +499,7 @@ macro_rules! register { $(, $comment:literal)?; ) => {register! (@leaf_accessor $name $hi:$lo $field - { |f| <$try_into_type>::try_from (fas $type ) } $try_into_type => + { |f| <$try_into_type>::try_from (fas $type ) } $type $try_into_type => ::core::result::Result < $try_into_type, <$try_into_typeas ::core::convert::TryFrom <$type >>::Error
@@ -513,7 +513,7 @@ macro_rules! register { $(, $comment:literal)?; ) => {register! (@leaf_accessor $name $hi:$lo $field - { |f| <$into_type>::from (fas $type ) } $into_type => $into_type $(, $comment)?;); + { |f| <$into_type>::from (fas $type ) } $type $into_type => $into_type $(, $comment)?;); };// Shortcut for non-boolean fields defined without the `=>` or `?=>` syntax.
@@ -527,7 +527,7 @@ macro_rules! register {// Generates the accessor methods for a single field. ( @leaf_accessor $name:ident $hi:tt:$lo:tt $field:ident - { $process:expr } $to_type:ty => $res_type:ty $(, $comment:literal)?; + { $process:expr } $prim_type:tt $to_type:ty => $res_type:ty $(, $comment:literal)?; ) => { ::kernel::macros::paste!(const [<$field:upper_RANGE >]: ::core::ops::RangeInclusive <u8 > = $lo..=$hi;
@@ -559,7 +559,7 @@ macro_rules! register { pub(crate) fn [<set_ $field>](mut self, value: $to_type) -> Self { const MASK: u32 = $name::[<$field:upper _MASK>]; const SHIFT: u32 = $name::[<$field:upper _SHIFT>]; -let value = (u32::from (value) <<SHIFT ) &MASK ; +let value = (u32::from ($prim_type::from (value)) <<SHIFT ) &MASK ; self.0 = (self.0 & !MASK ) | value; self
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 308/957 gpu: nova-core: bitfield: Move bitfield-specific code from register! into new macro
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joel Fernandes <[email protected]>
[ Upstream commit 71ea85be25b4f54a53ec03d5deaed52f5ee65da8 ]
Move the bitfield-specific code from the register macro into a new macro called bitfield. This will be used to define structs with bitfields, similar to C language.
Message-ID: <[email protected]>
Stable-dep-of: de0aca13509b ("gpu: nova-core: bitfield: fix broken Default implementation")
--- drivers/gpu/nova-core/bitfield.rs | 319 +++++++++++++++++++++++++++ drivers/gpu/nova-core/nova_core.rs | 3 + drivers/gpu/nova-core/regs/macros.rs | 259 +--------------------- 3 files changed, 332 insertions(+), 249 deletions(-) create mode 100644 drivers/gpu/nova-core/bitfield.rs
drivers/gpu/nova-core/bitfield.rs new file +319 -0
@@ -0,0 +1,319 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Bitfield library for Rust structures +//! +//! Support for defining bitfields in Rust structures. Also used by the [`register!`] macro. + +/// Defines a struct with accessors to access bits within an inner unsigned integer. +/// +/// # Syntax +/// +/// ```rust +/// use nova_core::bitfield; +/// +/// #[derive(Debug, Clone, Copy, Default)] +/// enum Mode { +/// #[default] +/// Low = 0, +/// High = 1, +/// Auto = 2, +/// } +/// +/// impl TryFrom<u8> for Mode { +/// type Error = u8; +/// fn try_from(value: u8) -> Result<Self, Self::Error> { +/// match value { +/// 0 => Ok(Mode::Low), +/// 1 => Ok(Mode::High), +/// 2 => Ok(Mode::Auto), +/// _ => Err(value), +/// } +/// } +/// } +/// +/// impl From<Mode> for u8 { +/// fn from(mode: Mode) -> u8 { +/// mode as u8 +/// } +/// } +/// +/// #[derive(Debug, Clone, Copy, Default)] +/// enum State { +/// #[default] +/// Inactive = 0, +/// Active = 1, +/// } +/// +/// impl From<bool> for State { +/// fn from(value: bool) -> Self { +/// if value { State::Active } else { State::Inactive } +/// } +/// } +/// +/// impl From<State> for bool { +/// fn from(state: State) -> bool { +/// match state { +/// State::Inactive => false, +/// State::Active => true, +/// } +/// } +/// } +/// +/// bitfield! { +/// struct ControlReg { +/// 7:7 state as bool => State; +/// 3:0 mode as u8 ?=> Mode; +/// } +/// } +/// ``` +/// +/// This generates a struct with: +/// - Field accessors: `mode()`, `state()`, etc. +/// - Field setters: `set_mode()`, `set_state()`, etc. (supports chaining with builder pattern). +/// - Debug and Default implementations. +/// +/// Fields are defined as follows: +/// +/// - `as <type>` simply returns the field value casted to <type>, typically `u32`, `u16`, `u8` or +/// `bool`. Note that `bool` fields must have a range of 1 bit. +/// - `as <type> => <into_type>` calls `<into_type>`'s `From::<<type>>` implementation and returns +/// the result. +/// - `as <type> ?=> <try_into_type>` calls `<try_into_type>`'s `TryFrom::<<type>>` implementation +/// and returns the result. This is useful with fields for which not all values are valid. +macro_rules! bitfield { +// Main entry point - defines the bitfield struct with fields + (struct $name:ident $(, $comment:literal)? { $($fields:tt)* }) => { +bitfield! (@core $name $(, $comment)? { $($fields)* }); + }; + +// All rules below are helpers. + +// Defines the wrapper `$name` type, as well as its relevant implementations (`Debug`, +// `Default`, `BitOr`, and conversion to the value type) and field accessor methods. + (@core $name:ident $(, $comment:literal)? { $($fields:tt)* }) => { + $( +#[doc=$comment] + )? +#[repr(transparent)] +#[derive( Clone , Copy )] +pub (crate )struct $name(u32 ); + +impl ::core::ops::BitOr for $name { +type Output =Self ; + +fn bitor (self, rhs:Self ) ->Self ::Output { +Self (self.0 | rhs.0 ) + } + } + +impl ::core::convert::From <$name>for u32 { +fn from (val: $name) ->u32 { + val.0 + } + } + +bitfield! (@fields_dispatcher $name { $($fields)* }); + }; + +// Captures the fields and passes them to all the implementers that require field information. +// +// Used to simplify the matching rules for implementers, so they don't need to match the entire +// complex fields rule even though they only make use of part of it. + (@fields_dispatcher $name:ident { + $($hi:tt:$lo:tt $field:identas $type:tt + $(?=> $try_into_type:ty)? + $(=> $into_type:ty)? + $(, $comment:literal)? + ; + )* + } + ) => { +bitfield! (@field_accessors $name { + $( + $hi:$lo $fieldas $type + $(?=> $try_into_type)? + $(=> $into_type)? + $(, $comment)? + ; + )* + }); +bitfield! (@debug $name { $($field;)* }); +bitfield! (@default $name { $($field;)* }); + }; + +// Defines all the field getter/setter methods for `$name`. + ( + @field_accessors $name:ident { + $($hi:tt:$lo:tt $field:identas $type:tt + $(?=> $try_into_type:ty)? + $(=> $into_type:ty)? + $(, $comment:literal)? + ; + )* + } + ) => { + $( +bitfield! (@check_field_bounds $hi:$lo $fieldas $type ); + )* + +#[allow(dead_code)] +impl $name { + $( +bitfield! (@field_accessor $name $hi:$lo $fieldas $type + $(?=> $try_into_type)? + $(=> $into_type)? + $(, $comment)? + ; + ); + )* + } + }; + +// Boolean fields must have `$hi == $lo`. + (@check_field_bounds $hi:tt:$lo:tt $field:identas bool ) => { +#[allow(clippy::eq_op)] +const _: () = { + ::kernel::build_assert!( + $hi == $lo, +concat! ("boolean field `" ,stringify! ($field),"` covers more than one bit" ) + ); + }; + }; + +// Non-boolean fields must have `$hi >= $lo`. + (@check_field_bounds $hi:tt:$lo:tt $field:identas $type:tt) => { +#[allow(clippy::eq_op)] +const _: () = { + ::kernel::build_assert!( + $hi >= $lo, +concat! ("field `" ,stringify! ($field),"`'s MSB is smaller than its LSB" ) + ); + }; + }; + +// Catches fields defined as `bool` and convert them into a boolean value. + ( + @field_accessor $name:ident $hi:tt:$lo:tt $field:identas bool => $into_type:ty + $(, $comment:literal)?; + ) => { +bitfield! ( + @leaf_accessor $name $hi:$lo $field + { |f| <$into_type>::from (if f !=0 {true }else {false }) } +bool $into_type => $into_type $(, $comment)?; + ); + }; + +// Shortcut for fields defined as `bool` without the `=>` syntax. + ( + @field_accessor $name:ident $hi:tt:$lo:tt $field:identas bool $(, $comment:literal)?; + ) => { +bitfield! (@field_accessor $name $hi:$lo $fieldas bool =>bool $(, $comment)?;); + }; + +// Catches the `?=>` syntax for non-boolean fields. + ( + @field_accessor $name:ident $hi:tt:$lo:tt $field:identas $type:tt ?=> $try_into_type:ty + $(, $comment:literal)?; + ) => { +bitfield! (@leaf_accessor $name $hi:$lo $field + { |f| <$try_into_type>::try_from (fas $type ) } $type $try_into_type => + ::core::result::Result < + $try_into_type, + <$try_into_typeas ::core::convert::TryFrom <$type >>::Error + > + $(, $comment)?;); + }; + +// Catches the `=>` syntax for non-boolean fields. + ( + @field_accessor $name:ident $hi:tt:$lo:tt $field:identas $type:tt => $into_type:ty + $(, $comment:literal)?; + ) => { +bitfield! (@leaf_accessor $name $hi:$lo $field + { |f| <$into_type>::from (fas $type ) } $type $into_type => $into_type $(, $comment)?;); + }; + +// Shortcut for non-boolean fields defined without the `=>` or `?=>` syntax. + ( + @field_accessor $name:ident $hi:tt:$lo:tt $field:identas $type:tt + $(, $comment:literal)?; + ) => { +bitfield! (@field_accessor $name $hi:$lo $fieldas $type => $type $(, $comment)?;); + }; + +// Generates the accessor methods for a single field. + ( + @leaf_accessor $name:ident $hi:tt:$lo:tt $field:ident + { $process:expr } $prim_type:tt $to_type:ty => $res_type:ty $(, $comment:literal)?; + ) => { + ::kernel::macros::paste!( +const [<$field:upper_RANGE >]: ::core::ops::RangeInclusive <u8 > = $lo..=$hi; +const [<$field:upper _MASK>]:u32 = ((((1 << $hi) -1 ) <<1 ) +1 ) - ((1 << $lo) -1 ); +const [<$field:upper_SHIFT >]:u32 =Self ::[<$field:upper _MASK>].trailing_zeros (); + ); + + $( +#[doc= "Returns the value of this field:" ] +#[doc=$comment] + )? +#[inline(always)] +pub (crate )fn $field(self) -> $res_type { + ::kernel::macros::paste!( +const MASK :u32 = $name::[<$field:upper _MASK>]; +const SHIFT :u32 = $name::[<$field:upper_SHIFT >]; + ); +let field = ((self.0 &MASK ) >>SHIFT ); + + $process(field) + } + + ::kernel::macros::paste!( + $( +#[doc= "Sets the value of this field:" ] +#[doc=$comment] + )? +#[inline(always)] +pub (crate )fn [<set_ $field>](mut self, value: $to_type) ->Self { +const MASK :u32 = $name::[<$field:upper _MASK>]; +const SHIFT :u32 = $name::[<$field:upper_SHIFT >]; +let value = (u32 ::from ($prim_type::from (value)) <<SHIFT ) &MASK ; + self.0 = (self.0 & !MASK ) | value; + + self + } + ); + }; + +// Generates the `Debug` implementation for `$name`. + (@debug $name:ident { $($field:ident;)* }) => { +impl ::kernel::fmt::Debug for $name { +fn fmt (&self, f: &mut ::kernel::fmt::Formatter <'_>) -> ::kernel::fmt::Result { + f.debug_struct (stringify! ($name)) + .field ("<raw>" , &::kernel::prelude::fmt!("{:#x}" , &self.0 )) + $( + .field (stringify! ($field), &self.$field()) + )* + .finish () + } + } + }; + +// Generates the `Default` implementation for `$name`. + (@default $name:ident { $($field:ident;)* }) => { +/// 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 ()); + + ::kernel::macros::paste!( + $( + value.[<set_ $field>](Default ::default ()); + )* + ); + + value + } + } + }; +}
drivers/gpu/nova-core/nova_core.rs +3 -0
@@ -2,6 +2,9 @@//! Nova Core GPU Driver +#[macro_use] +mod bitfield; +mod dma;mod driver;mod falcon;
drivers/gpu/nova-core/regs/macros.rs +10 -249
319 lines not on this page · raw message
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 309/957 gpu: nova-core: bitfield: fix broken Default implementation
In reply to Greg Kroah-Hartman6.18-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
@@ -303,12 +303,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 310/957 selftests/mm: skip migration tests if NUMA is unavailable
In reply to Greg Kroah-Hartman6.18-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 311/957 kho: make debugfs interface optional
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pasha Tatashin <[email protected]>
[ Upstream commit 03d3963464a43654703938a66503cd686c5fc54e ]
Patch series "liveupdate: Rework KHO for in-kernel users", v9.
This series refactors the KHO framework to better support in-kernel users like the upcoming LUO. The current design, which relies on a notifier chain and debugfs for control, is too restrictive for direct programmatic use.
The core of this rework is the removal of the notifier chain in favor of a direct registration API. This decouples clients from the shutdown-time finalization sequence, allowing them to manage their preserved state more flexibly and at any time.
In support of this new model, this series also:
- Makes the debugfs interface optional.
- Introduces APIs to unpreserve memory and fixes a bug in the abort path where client state was being incorrectly discarded. Note that this is an interim step, as a more comprehensive fix is planned as part of the stateless KHO work [1].
- Moves all KHO code into a new kernel/liveupdate/ directory to consolidate live update components.
This patch (of 9):
Currently, KHO is controlled via debugfs interface, but once LUO is introduced, it can control KHO, and the debug interface becomes optional.
Add a separate config CONFIG_KEXEC_HANDOVER_DEBUGFS that enables the debugfs interface, and allows to inspect the tree.
Move all debugfs related code to a new file to keep the .c files clear of ifdefs.
Stable-dep-of: 019fc3687237 ("kho: fix KASAN support for restored vmalloc regions")
--- MAINTAINERS | 2 +- kernel/Kconfig.kexec | 12 +- kernel/Makefile | 1 + kernel/kexec_handover.c | 269 +++++--------------------- kernel/kexec_handover_debugfs.c | 216 +++++++++++++++++++++ kernel/kexec_handover_internal.h | 35 ++++ tools/testing/selftests/kho/vmtest.sh | 1 + 7 files changed, 314 insertions(+), 222 deletions(-) create mode 100644 kernel/kexec_handover_debugfs.c
MAINTAINERS +1 -1
@@ -13798,7 +13798,7 @@ S: Maintained F: Documentation/admin-guide/mm/kho.rst F: Documentation/core-api/kho/* F: include/linux/kexec_handover.h -F: kernel/kexec_handover.c +F: kernel/kexec_handover* F: lib/test_kho.c F: tools/testing/selftests/kho/
kernel/Kconfig.kexec +11 -1
@@ -100,7 +100,6 @@ config KEXEC_HANDOVER depends on !DEFERRED_STRUCT_PAGE_INIT select MEMBLOCK_KHO_SCRATCH select KEXEC_FILE - select DEBUG_FS select LIBFDT select CMA help
@@ -118,6 +117,17 @@ config KEXEC_HANDOVER_DEBUG scenarios and the extra code might be adding overhead it is only optionally enabled. +config KEXEC_HANDOVER_DEBUGFS + bool "kexec handover debugfs interface" + default KEXEC_HANDOVER + depends on KEXEC_HANDOVER + select DEBUG_FS + help + Allow to control kexec handover device tree via debugfs + interface, i.e. finalize the state or aborting the finalization. + Also, enables inspecting the KHO fdt trees with the debugfs binary + blobs. + config CRASH_DUMP bool "kernel crash dumps" default ARCH_DEFAULT_CRASH_DUMP
kernel/Makefile +1 -0
@@ -84,6 +84,7 @@ obj-$(CONFIG_KEXEC_FILE) += kexec_file.o obj-$(CONFIG_KEXEC_ELF) += kexec_elf.o obj-$(CONFIG_KEXEC_HANDOVER) += kexec_handover.o obj-$(CONFIG_KEXEC_HANDOVER_DEBUG) += kexec_handover_debug.o +obj-$(CONFIG_KEXEC_HANDOVER_DEBUGFS) += kexec_handover_debugfs.o obj-$(CONFIG_BACKTRACE_SELF_TEST) += backtracetest.o obj-$(CONFIG_COMPAT) += compat.o obj-$(CONFIG_CGROUPS) += cgroup/
kernel/kexec_handover.c +49 -220
379 lines not on this page · raw message
kernel/kexec_handover_debugfs.c new file +216 -0
216 lines not on this page · raw message
kernel/kexec_handover_internal.h +35 -0
@@ -3,11 +3,46 @@#define LINUX_KEXEC_HANDOVER_INTERNAL_H #include <linux/kexec_handover.h> +#include <linux/list.h> #include <linux/types.h> +#ifdef CONFIG_KEXEC_HANDOVER_DEBUGFS +#include <linux/debugfs.h> + +struct kho_debugfs { +struct dentry *dir; +struct dentry *sub_fdt_dir; +struct list_head fdt_list; +}; + +#else +struct kho_debugfs {}; +#endif +extern struct kho_scratch *kho_scratch;extern unsigned int kho_scratch_cnt; +bool kho_finalized (void ); +int kho_finalize (void ); +int kho_abort (void ); + +#ifdef CONFIG_KEXEC_HANDOVER_DEBUGFS +int kho_debugfs_init (void ); +void kho_in_debugfs_init (struct kho_debugfs *dbg,const void *fdt); +int kho_out_debugfs_init (struct kho_debugfs *dbg); +int kho_debugfs_fdt_add (struct kho_debugfs *dbg,const char *name, +const void *fdt,bool root); +void kho_debugfs_cleanup (struct kho_debugfs *dbg); +#else +static inline int kho_debugfs_init (void ) {return 0 ; } +static inline void kho_in_debugfs_init (struct kho_debugfs *dbg, +const void *fdt) { } +static inline int kho_out_debugfs_init (struct kho_debugfs *dbg) {return 0 ; } +static inline int kho_debugfs_fdt_add (struct kho_debugfs *dbg,const char *name, +const void *fdt,bool root) {return 0 ; } +static inline void kho_debugfs_cleanup (struct kho_debugfs *dbg) {} +#endif /* CONFIG_KEXEC_HANDOVER_DEBUGFS */ +#ifdef CONFIG_KEXEC_HANDOVER_DEBUG bool kho_scratch_overlap (phys_addr_t phys,size_t size);#else
tools/testing/selftests/kho/vmtest.sh +1 -0
@@ -59,6 +59,7 @@ function build_kernel() { tee "$kconfig" > "$kho_config" <<EOF CONFIG_BLK_DEV_INITRD=y CONFIG_KEXEC_HANDOVER=y +CONFIG_KEXEC_HANDOVER_DEBUGFS=y CONFIG_TEST_KEXEC_HANDOVER=y CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_VM=y
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 312/957 Documentation: fix a hugetlbfs reservation statement
In reply to Greg Kroah-Hartman6.18-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 313/957 selftest: memcg: skip memcg_sock test if address family not supported
In reply to Greg Kroah-Hartman6.18-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
@@ -1278,8 +1278,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;
@@ -1409,6 +1412,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 314/957 ALSA: scarlett2: Add missing sentinel initializer field
In reply to Greg Kroah-Hartman6.18-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 315/957 ASoC: SOF: compress: return the configured codec from get_params
In reply to Greg Kroah-Hartman6.18-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
@@ -247,6 +247,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;
@@ -259,9 +260,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 316/957 PCI/NPEM: Set LED_HW_PLUGGABLE for hotplug-capable ports
In reply to Greg Kroah-Hartman6.18-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 317/957 ALSA: usb-audio: qcom: Fix incorrect type in enable_audio_stream
In reply to Greg Kroah-Hartman6.18-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 318/957 PCI: tegra194: Fix polling delay for L2 state
In reply to Greg Kroah-Hartman6.18-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
@@ -1582,9 +1580,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 319/957 PCI: tegra194: Increase LTSSM poll time on surprise link down
In reply to Greg Kroah-Hartman6.18-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
@@ -1626,15 +1631,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
@@ -1714,12 +1718,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 320/957 PCI: tegra194: Disable LTSSM after transition to Detect on surprise link down
In reply to Greg Kroah-Hartman6.18-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
@@ -1623,14 +1623,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) ||
@@ -1639,6 +1631,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
@@ -1712,11 +1712,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) ||
@@ -1727,6 +1722,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 321/957 PCI: tegra194: Dont force the device into the D0 state before L2
In reply to Greg Kroah-Hartman6.18-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
@@ -1287,44 +1287,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" );
@@ -1654,7 +1616,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);
@@ -2370,7 +2331,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);
@@ -2444,7 +2404,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 322/957 PCI: tegra194: Disable PERST# IRQ only in Endpoint mode
In reply to Greg Kroah-Hartman6.18-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
@@ -1054,7 +1054,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 323/957 PCI: tegra194: Use devm_gpiod_get_optional() to parse "nvidia,refclk-select"
In reply to Greg Kroah-Hartman6.18-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
@@ -1196,9 +1196,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 324/957 PCI: tegra194: Disable direct speed change for Endpoint mode
In reply to Greg Kroah-Hartman6.18-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
@@ -1834,6 +1834,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 325/957 PCI: tegra194: Set LTR message request before PCIe link up in Endpoint mode
In reply to Greg Kroah-Hartman6.18-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
@@ -487,15 +487,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 ;
@@ -1832,6 +1823,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 326/957 PCI: tegra194: Allow system suspend when the Endpoint link is not up
In reply to Greg Kroah-Hartman6.18-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
@@ -2304,16 +2304,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 ;
@@ -2333,6 +2345,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 ;
@@ -2347,6 +2362,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 ;
@@ -2379,8 +2397,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)
@@ -2485,6 +2503,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 327/957 PCI: tegra194: Free up Endpoint resources during remove()
In reply to Greg Kroah-Hartman6.18-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
@@ -2285,6 +2285,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)
@@ -2296,6 +2297,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 328/957 PCI: tegra194: Use DWC IP core version
In reply to Greg Kroah-Hartman6.18-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 329/957 PCI: dwc: Apply ECRC workaround to DesignWare 5.00a as well
In reply to Greg Kroah-Hartman6.18-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
@@ -486,13 +486,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
@@ -559,7 +559,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 330/957 PCI: tegra194: Remove unnecessary L1SS disable code
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjorn Helgaas <[email protected]>
[ Upstream commit 07c99eac0bc2c1fe962e56d8b5dc5b1152d421bf ]
The DWC core clears the L1 Substates Supported bits unless the driver sets the "dw_pcie.l1ss_support" flag.
The tegra194 init_host_aspm() sets "dw_pcie.l1ss_support" if the platform has the "supports-clkreq" DT property. If "supports-clkreq" is absent, "dw_pcie.l1ss_support" is not set, and the DWC core will clear the L1 Substates Supported bits.
The tegra194 code to clear the L1 Substates Supported bits is unnecessary, so remove it.
Stable-dep-of: f59df1d9e6bd ("PCI: tegra194: Disable L1.2 capability of Tegra234 EP")
--- drivers/pci/controller/dwc/pcie-tegra194.c | 45 +++------------------- 1 file changed, 5 insertions(+), 40 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +5 -40
@@ -263,7 +263,6 @@ struct tegra_pcie_dw {u32 msi_ctrl_int;u32 num_lanes;u32 cid; -u32 cfg_link_cap_l1sub;u32 ras_des_cap;u32 pcie_cap_base;u32 aspm_cmrt;
@@ -478,8 +477,7 @@ static irqreturn_t tegra_pcie_ep_irq_thread(int irq, void *arg)return IRQ_HANDLED ;/* If EP doesn't advertise L1SS, just return */ - val =dw_pcie_readl_dbi (pci, pcie->cfg_link_cap_l1sub); -if (!(val & (PCI_L1SS_CAP_ASPM_L1_1 |PCI_L1SS_CAP_ASPM_L1_2 ))) +if (!pci->l1ss_support)return IRQ_HANDLED ;/* Check if BME is set to '1' */
@@ -602,24 +600,6 @@ static struct pci_ops tegra_pci_ops = { };#if defined(CONFIG_PCIEASPM ) -static void disable_aspm_l11 (struct tegra_pcie_dw *pcie) -{ -u32 val; - - val =dw_pcie_readl_dbi (&pcie->pci, pcie->cfg_link_cap_l1sub); - val &= ~PCI_L1SS_CAP_ASPM_L1_1 ; -dw_pcie_writel_dbi (&pcie->pci, pcie->cfg_link_cap_l1sub, val); -} - -static void disable_aspm_l12 (struct tegra_pcie_dw *pcie) -{ -u32 val; - - val =dw_pcie_readl_dbi (&pcie->pci, pcie->cfg_link_cap_l1sub); - val &= ~PCI_L1SS_CAP_ASPM_L1_2 ; -dw_pcie_writel_dbi (&pcie->pci, pcie->cfg_link_cap_l1sub, val); -} -static inline u32 event_counter_prog (struct tegra_pcie_dw *pcie,u32 event) {u32 val;
@@ -676,10 +656,9 @@ static int aspm_state_cnt(struct seq_file *s, void *data)static void init_host_aspm (struct tegra_pcie_dw *pcie) {struct dw_pcie *pci = &pcie->pci; -u32 val; +u32 l1ss, val; - val =dw_pcie_find_ext_capability (pci,PCI_EXT_CAP_ID_L1SS ); - pcie->cfg_link_cap_l1sub = val +PCI_L1SS_CAP ; + l1ss =dw_pcie_find_ext_capability (pci,PCI_EXT_CAP_ID_L1SS ); pcie->ras_des_cap =dw_pcie_find_ext_capability (&pcie->pci,PCI_EXT_CAP_ID_VNDR );
@@ -691,11 +670,11 @@ static void init_host_aspm(struct tegra_pcie_dw *pcie) PCIE_RAS_DES_EVENT_COUNTER_CONTROL, val);/* Program T_cmrt and T_pwr_on values */ - val =dw_pcie_readl_dbi (pci, pcie->cfg_link_cap_l1sub); + val =dw_pcie_readl_dbi (pci, l1ss +PCI_L1SS_CAP ); val &= ~(PCI_L1SS_CAP_CM_RESTORE_TIME |PCI_L1SS_CAP_P_PWR_ON_VALUE ); val |= (pcie->aspm_cmrt <<8 ); val |= (pcie->aspm_pwr_on_t <<19 ); -dw_pcie_writel_dbi (pci, pcie->cfg_link_cap_l1sub, val); +dw_pcie_writel_dbi (pci, l1ss +PCI_L1SS_CAP , val);if (pcie->supports_clkreq) pci->l1ss_support = true;
@@ -723,8 +702,6 @@ static void init_debugfs(struct tegra_pcie_dw *pcie) aspm_state_cnt); }#else -static inline void disable_aspm_l12 (struct tegra_pcie_dw *pcie) {return ; } -static inline void disable_aspm_l11 (struct tegra_pcie_dw *pcie) {return ; }static inline void init_host_aspm (struct tegra_pcie_dw *pcie) {return ; }static inline void init_debugfs (struct tegra_pcie_dw *pcie) {return ; }#endif
@@ -928,12 +905,6 @@ static int tegra_pcie_dw_host_init(struct dw_pcie_rp *pp)init_host_aspm (pcie); -/* Disable ASPM-L1SS advertisement if there is no CLKREQ routing */ -if (!pcie->supports_clkreq) { -disable_aspm_l11 (pcie); -disable_aspm_l12 (pcie); - } -if (!pcie->of_data->has_l1ss_exit_fix) { val =dw_pcie_readl_dbi (pci,GEN3_RELATED_OFF ); val &= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL ;
@@ -1848,12 +1819,6 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)init_host_aspm (pcie); -/* Disable ASPM-L1SS advertisement if there is no CLKREQ routing */ -if (!pcie->supports_clkreq) { -disable_aspm_l11 (pcie); -disable_aspm_l12 (pcie); - } -if (!pcie->of_data->has_l1ss_exit_fix) { val =dw_pcie_readl_dbi (pci,GEN3_RELATED_OFF ); val &= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 331/957 PCI: tegra194: Disable L1.2 capability of Tegra234 EP
In reply to Greg Kroah-Hartman6.18-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 ;
@@ -2443,6 +2461,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 332/957 PCI: tegra194: Fix CBB timeout caused by DBI access before core power-on
In reply to Greg Kroah-Hartman6.18-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 333/957 spi: mtk-snfi: unregister ECC engine on probe failure and remove() callback
In reply to Greg Kroah-Hartman6.18-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 334/957 ALSA: sc6000: Keep the programmed board state in card-private data
In reply to Greg Kroah-Hartman6.18-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 335/957 dm cache: fix missing return in invalidate_committeds error path
In reply to Greg Kroah-Hartman6.18-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 336/957 sched_ext: Track @ps rq lock across set_cpus_allowed_scx -> ops.set_cpumask
In reply to Greg Kroah-Hartman6.18-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
@@ -2606,7 +2606,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 337/957 sched_ext: Fix ops.cgroup_move() invocation kf_mask and rq tracking
In reply to Greg Kroah-Hartman6.18-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
@@ -3225,7 +3225,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 338/957 crypto: jitterentropy - replace long-held spinlock with mutex
In reply to Greg Kroah-Hartman6.18-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. We allocate only the generic
@@ -265,7 +266,6 @@ static int jent_kcapi_init(struct crypto_tfm *tfm) goto err; } -spin_lock_init (&rng->jent_lock);return 0 ; err:
@@ -280,7 +280,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);
@@ -306,7 +306,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 339/957 ALSA: usb-audio: Exclude Scarlett 18i20 1st Gen from SKIP_IFACE_SETUP
In reply to Greg Kroah-Hartman6.18-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
@@ -2426,6 +2426,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 340/957 ALSA: hda/realtek - fixed speaker no sound update
In reply to Greg Kroah-Hartman6.18-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
@@ -3615,22 +3615,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 ; }
@@ -3653,10 +3642,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 341/957 gfs2: Call unlock_new_inode before d_instantiate
In reply to Greg Kroah-Hartman6.18-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