6.12.2-rc1 review
Subsystems (8)
Greg Kroah-Hartman
maintainerPATCH 115/826 ARM: dts: microchip: sam9x60: Add missing property atmel,usart-mode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrei Simion <[email protected]>
[ Upstream commit 2f9d013a0c6f1b9109ada5acb28ee26eefc77c03 ]
Add the atmel,usart-mode property to the UART nodes. This ensures compliance with the atmel,at91-usart.yaml schema and resolves the errors below:
serial@200: $nodename:0: 'serial@200' does not match '^spi(@.*|-([0-9]|[1-9][0-9]+))?$'
serial@200: atmel,use-dma-rx: False schema does not allow True serial@200: atmel,use-dma-tx: False schema does not allow True serial@200: atmel,fifo-size: False schema does not allow [[16]]
These errors indicate that the property atmel,usart-mode = <AT91_USART_MODE_SERIAL> is missing for UART nodes 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, and 12.
[claudiu.beznea: move the atmel,usart-mode close to vendor specific
properties to cope with DTS coding style]
--- arch/arm/boot/dts/microchip/sam9x60.dtsi | 12 ++++++++++++ 1 file changed, 12 insertions(+)
arch/arm/boot/dts/microchip/sam9x60.dtsi +12 -0
@@ -186,6 +186,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 13>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -388,6 +389,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 32>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -439,6 +441,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 33>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -598,6 +601,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 9>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -649,6 +653,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 10>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -700,6 +705,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 11>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -751,6 +757,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 5>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -821,6 +828,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 6>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -891,6 +899,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 7>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -961,6 +970,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 8>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -1086,6 +1096,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 15>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
@@ -1137,6 +1148,7 @@ AT91_XDMAC_DT_PER_IF(1) | dma-names = "tx", "rx"; clocks = <&pmc PMC_TYPE_PERIPHERAL 16>; clock-names = "usart"; + atmel,usart-mode = <AT91_USART_MODE_SERIAL>; atmel,use-dma-rx; atmel,use-dma-tx; atmel,fifo-size = <16>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 116/826 mmc: mmc_spi: drop buggy snprintf()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bartosz Golaszewski <[email protected]>
[ Upstream commit 328bda09cc91b3d93bc64f4a4dadc44313dd8140 ]
GCC 13 complains about the truncated output of snprintf():
drivers/mmc/host/mmc_spi.c: In function ‘mmc_spi_response_get’:drivers/mmc/host/mmc_spi.c:227:64: error: ‘snprintf’ output may be truncated before the last format character [-Werror=format-truncation=]
227 | snprintf(tag, sizeof(tag), " ... CMD%d response SPI_%s",
| ^drivers/mmc/host/mmc_spi.c:227:9: note: ‘snprintf’ output between 26 and 43 bytes into a destination of size 32
227 | snprintf(tag, sizeof(tag), " ... CMD%d response SPI_%s",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
228 | cmd->opcode, maptype(cmd));Drop it and fold the string it generates into the only place where it's emitted - the dev_dbg() call at the end of the function.
--- drivers/mmc/host/mmc_spi.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/mmc/host/mmc_spi.c +3 -6
@@ -222,10 +222,6 @@ static int mmc_spi_response_get(struct mmc_spi_host *host,u8 leftover =0 ;unsigned short rotator;int i; -char tag[32 ]; - -snprintf (tag,sizeof (tag)," ... CMD%d response SPI_%s" , - cmd->opcode,maptype (cmd));/* Except for data block reads, the whole response will already * be stored in the scratch buffer. It's somewhere after the
@@ -378,8 +374,9 @@ static int mmc_spi_response_get(struct mmc_spi_host *host, }if (value <0 ) -dev_dbg (&host->spi->dev,"%s: resp %04x %08x\n" , - tag, cmd->resp[0 ], cmd->resp[1 ]); +dev_dbg (&host->spi->dev, +" ... CMD%d response SPI_%s: resp %04x %08x\n" , + cmd->opcode,maptype (cmd), cmd->resp[0 ], cmd->resp[1 ]);/* disable chipselect on errors and some success cases */ if (value >=0 && cs_on)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 117/826 scripts/kernel-doc: Do not track section counter across processed files
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
[ Upstream commit be9264110e4e874622d588a75daf930539fdf6ea ]
The section counter tracks how many sections of kernel-doc were added. The only real use of the counter value is to check if anything was actually supposed to be output and give a warning is nothing is available.
The current logic of remembering the initial value and then resetting the value then when processing each file means that if a file has the same number of sections as the previously processed one, a warning is incorrectly given.
--- scripts/kernel-doc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
scripts/kernel-doc +1 -3
@@ -2322,7 +2322,6 @@ sub process_inline($$) { sub process_file($) { my $file; - my $initial_section_counter = $section_counter; my ($orig_file) = @_; $file = map_filename($orig_file);
@@ -2360,8 +2359,7 @@ sub process_file($) { } # Make sure we got something interesting. - if ($initial_section_counter == $section_counter && $ - output_mode ne "none") { + if (!$section_counter && $output_mode ne "none") { if ($output_selection == OUTPUT_INCLUDE) { emit_warning("${file}:1", "'$_' not found\n") for keys %function_table;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 118/826 arm64: dts: qcom: x1e80100-slim7x: Drop orientation-switch from USB SS[0-1] QMP PHYs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abel Vesa <[email protected]>
[ Upstream commit eb2dd93d03b16ed0e8b09311f8d35cc5a691a9b7 ]
The orientation-switch is already set in the x1e80100 SoC dtsi, so drop from Slim 7X dts.
--- arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts | 4 ---- 1 file changed, 4 deletions(-)
arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts +0 -4
@@ -898,8 +898,6 @@ &usb_1_ss0_qmpphy { vdda-phy-supply = <&vreg_l3e_1p2>; vdda-pll-supply = <&vreg_l1j_0p8>; - orientation-switch; - status = "okay"; };
@@ -932,8 +930,6 @@ &usb_1_ss1_qmpphy { vdda-phy-supply = <&vreg_l3e_1p2>; vdda-pll-supply = <&vreg_l2d_0p9>; - orientation-switch; - status = "okay"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 119/826 arm64: dts: qcom: x1e80100-vivobook-s15: Drop orientation-switch from USB SS[0-1] QMP PHYs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abel Vesa <[email protected]>
[ Upstream commit 27344eb70c8fd60fe7c570e2e12f169ff89d2c47 ]
The orientation-switch is already set in the x1e80100 SoC dtsi, so drop from Vivobook S15 dts.
--- arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts | 4 ---- 1 file changed, 4 deletions(-)
arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts +0 -4
@@ -594,8 +594,6 @@ &usb_1_ss0_qmpphy { vdda-phy-supply = <&vreg_l3e_1p2>; vdda-pll-supply = <&vreg_l1j_0p8>; - orientation-switch; - status = "okay"; };
@@ -628,8 +626,6 @@ &usb_1_ss1_qmpphy { vdda-phy-supply = <&vreg_l3e_1p2>; vdda-pll-supply = <&vreg_l2d_0p9>; - orientation-switch; - status = "okay"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 120/826 openrisc: Implement fixmap to fix earlycon
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stafford Horne <[email protected]>
[ Upstream commit 1037d186edfc551fa7ba2d4336e74e7575a07a65 ]
With commit 53c98e35dcbc ("openrisc: mm: remove unneeded early ioremap code") it was commented that early ioremap was not used in OpenRISC. I acked this but was wrong, earlycon was using it. Earlycon setup now fails with the below trace:
Kernel command line: earlycon
------------[ cut here ]------------
WARNING: CPU: 0 PID: 0 at mm/ioremap.c:23
generic_ioremap_prot+0x118/0x130
Modules linked in:
CPU: 0 UID: 0 PID: 0 Comm: swapper Not tainted
6.11.0-rc5-00001-gce02fd891c38-dirty #141
Call trace:
[<(ptrval)>] dump_stack_lvl+0x7c/0x9c
[<(ptrval)>] dump_stack+0x1c/0x2c
[<(ptrval)>] __warn+0xb4/0x108
[<(ptrval)>] ? generic_ioremap_prot+0x118/0x130
[<(ptrval)>] warn_slowpath_fmt+0x60/0x98
[<(ptrval)>] generic_ioremap_prot+0x118/0x130
[<(ptrval)>] ioremap_prot+0x20/0x30
[<(ptrval)>] of_setup_earlycon+0xd4/0x2e0
[<(ptrval)>] early_init_dt_scan_chosen_stdout+0x18c/0x1c8
[<(ptrval)>] param_setup_earlycon+0x3c/0x60
[<(ptrval)>] do_early_param+0xb0/0x118
[<(ptrval)>] parse_args+0x184/0x4b8
[<(ptrval)>] ? start_kernel+0x0/0x78c
[<(ptrval)>] parse_early_options+0x40/0x50
[<(ptrval)>] ? do_early_param+0x0/0x118
[<(ptrval)>] parse_early_param+0x48/0x68
[<(ptrval)>] ? start_kernel+0x318/0x78c
[<(ptrval)>] ? start_kernel+0x0/0x78c
---[ end trace 0000000000000000 ]---To fix this we could either implement early_ioremap again or implement fixmap. In this patch we choose the later option of implementing basic fixmap support.
While fixing this we also remove the old FIX_IOREMAP slots that were used by early ioremap code. That code was also removed by commit 53c98e35dcbc ("openrisc: mm: remove unneeded early ioremap code") but these definitions were not cleaned up.
--- arch/openrisc/Kconfig | 3 +++ arch/openrisc/include/asm/fixmap.h | 21 ++++------------- arch/openrisc/mm/init.c | 37 ++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 16 deletions(-)
arch/openrisc/Kconfig +3 -0
@@ -65,6 +65,9 @@ config STACKTRACE_SUPPORT config LOCKDEP_SUPPORT def_bool y +config FIX_EARLYCON_MEM + def_bool y + menu "Processor type and features" choice
arch/openrisc/include/asm/fixmap.h +5 -16
@@ -26,29 +26,18 @@#include <linux/bug.h> #include <asm/page.h> -/* -* On OpenRISC we use these special fixed_addresses for doing ioremap -* early in the boot process before memory initialization is complete. -* This is used, in particular, by the early serial console code. -* -* It's not really 'fixmap', per se, but fits loosely into the same -* paradigm. -*/ enum fixed_addresses { -/* -* FIX_IOREMAP entries are useful for mapping physical address -* space before ioremap() is useable, e.g. really early in boot -* before kmalloc() is working. -*/ -#define FIX_N_IOREMAPS 32 - FIX_IOREMAP_BEGIN, -FIX_IOREMAP_END =FIX_IOREMAP_BEGIN +FIX_N_IOREMAPS -1 , +FIX_EARLYCON_MEM_BASE , __end_of_fixed_addresses };#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)/* FIXADDR_BOTTOM might be a better name here... */ #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) +#define FIXMAP_PAGE_IO PAGE_KERNEL_NOCACHE + +extern void __set_fixmap (enum fixed_addresses idx, +phys_addr_t phys,pgprot_t flags);#include <asm-generic/fixmap.h>
arch/openrisc/mm/init.c +37 -0
@@ -207,6 +207,43 @@ void __init mem_init(void)return ; } +static int __init map_page (unsigned long va,phys_addr_t pa,pgprot_t prot) +{ +p4d_t *p4d; +pud_t *pud; +pmd_t *pmd; +pte_t *pte; + + p4d =p4d_offset (pgd_offset_k (va), va); + pud =pud_offset (p4d, va); + pmd =pmd_offset (pud, va); + pte =pte_alloc_kernel (pmd, va); + +if (pte ==NULL ) +return -ENOMEM ; + +if (pgprot_val (prot)) +set_pte_at (&init_mm, va, pte,pfn_pte (pa >>PAGE_SHIFT , prot)); +else +pte_clear (&init_mm, va, pte); + +local_flush_tlb_page (NULL , va); +return 0 ; +} + +void __init __set_fixmap (enum fixed_addresses idx, +phys_addr_t phys,pgprot_t prot) +{ +unsigned long address =__fix_to_virt (idx); + +if (idx >= __end_of_fixed_addresses) { +BUG (); +return ; + } + +map_page (address, phys, prot); +} +static const pgprot_t protection_map[16 ] = { [VM_NONE ] =PAGE_NONE , [VM_READ ] =PAGE_READONLY_X ,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 121/826 efi/libstub: fix efi_parse_options() ignoring the default command line
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Marek <[email protected]>
[ Upstream commit aacfa0ef247b0130b7a98bb52378f8cd727a66ca ]
efi_convert_cmdline() always returns a size of at least 1 because it counts the NUL terminator, so the "cmdline_size == 0" condition is never satisfied.
Change it to check if the string starts with a NUL character to get the intended behavior: to use CONFIG_CMDLINE when load_options_size == 0.
--- drivers/firmware/efi/libstub/efi-stub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/firmware/efi/libstub/efi-stub.c +1 -1
@@ -129,7 +129,7 @@ efi_status_t efi_handle_cmdline(efi_loaded_image_t *image, char **cmdline_ptr)if (IS_ENABLED (CONFIG_CMDLINE_EXTEND ) ||IS_ENABLED (CONFIG_CMDLINE_FORCE ) || - cmdline_size ==0 ) { + cmdline[0 ] ==0 ) { status =efi_parse_options (CONFIG_CMDLINE );if (status !=EFI_SUCCESS ) {efi_err ("Failed to parse options\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 122/826 tpm: fix signed/unsigned bug when checking event logs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gregory Price <[email protected]>
[ Upstream commit e6d654e9f5a97742cfe794b1c4bb5d3fb2d25e98 ]
A prior bugfix that fixes a signed/unsigned error causes another signed unsigned error.
A situation where log_tbl->size is invalid can cause the size passed to memblock_reserve to become negative.
log_size from the main event log is an unsigned int, and the code reduces to the following
u64 value = (int)unsigned_value;
This results in sign extension, and the value sent to memblock_reserve becomes effectively negative.
--- drivers/firmware/efi/tpm.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/firmware/efi/tpm.c +9 -8
@@ -40,7 +40,8 @@ int __init efi_tpm_eventlog_init(void) {struct linux_efi_tpm_eventlog *log_tbl;struct efi_tcg2_final_events_table *final_tbl; -int tbl_size; +unsigned int tbl_size; +int final_tbl_size;int ret =0 ;if (efi.tpm_log ==EFI_INVALID_TABLE_ADDR ) {
@@ -80,26 +81,26 @@ int __init efi_tpm_eventlog_init(void) goto out; } - tbl_size =0 ; + final_tbl_size =0 ;if (final_tbl->nr_events !=0 ) {void *events = (void *)efi.tpm_final_log +sizeof (final_tbl->version) +sizeof (final_tbl->nr_events); - tbl_size =tpm2_calc_event_log_size (events, - final_tbl->nr_events, - log_tbl->log); + final_tbl_size =tpm2_calc_event_log_size (events, + final_tbl->nr_events, + log_tbl->log); } -if (tbl_size <0 ) { +if (final_tbl_size <0 ) {pr_err (FW_BUG "Failed to parse event in TPM Final Events Log\n" ); ret = -EINVAL ; goto out_calc; }memblock_reserve (efi.tpm_final_log, - tbl_size +sizeof (*final_tbl)); - efi_tpm_final_log_size = tbl_size; + final_tbl_size +sizeof (*final_tbl)); + efi_tpm_final_log_size = final_tbl_size; out_calc:early_memunmap (final_tbl,sizeof (*final_tbl));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 123/826 media: i2c: max96717: clean up on error in max96717_subdev_init()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit d56786977ba11ed15b066495c1363889bcb1c3bb ]
Call v4l2_ctrl_handler_free() to clean up from v4l2_ctrl_handler_init().
--- drivers/media/i2c/max96717.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/media/i2c/max96717.c +4 -2
@@ -697,8 +697,10 @@ static int max96717_subdev_init(struct max96717_priv *priv) priv->pads[MAX96717_PAD_SOURCE ].flags =MEDIA_PAD_FL_SOURCE ; ret =media_entity_pads_init (&priv->sd.entity,2 , priv->pads); -if (ret) -return dev_err_probe (dev, ret,"Failed to init pads\n" ); +if (ret) { +dev_err_probe (dev, ret,"Failed to init pads\n" ); + goto err_free_ctrl; + } ret =v4l2_subdev_init_finalize (&priv->sd);if (ret) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 124/826 media: i2c: vgxy61: Fix an error handling path in vgxy61_detect()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 0d5c92cde4d38825eeadf5b4e1534350f80a9924 ]
If cci_read() fails, 'st' is set to 0 in cci_read(), so we return success, instead of the expected error code.
Fix it and return the expected error.
--- drivers/media/i2c/vgxy61.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/i2c/vgxy61.c +1 -1
@@ -1617,7 +1617,7 @@ static int vgxy61_detect(struct vgxy61_dev *sensor) ret =cci_read (sensor->regmap,VGXY61_REG_NVM , &st,NULL );if (ret <0 ) -return st; +return ret;if (st !=VGXY61_NVM_OK )dev_warn (&client->dev,"Bad nvm state got %u\n" , (u8 )st);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 125/826 media: i2c: ds90ub960: Fix missing return check on ub960_rxport_read call
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
[ Upstream commit 24ad2d1f773a11f69eecec3ec37ea3d76f2e9e7d ]
The function ub960_rxport_read is being called and afterwards ret is being checked for any failures, however ret is not being assigned to the return of the function call. Fix this by assigning ret to the return of the call which appears to be missing.
--- drivers/media/i2c/ds90ub960.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/i2c/ds90ub960.c +1 -1
@@ -1286,7 +1286,7 @@ static int ub960_rxport_get_strobe_pos(struct ub960_data *priv, clk_delay += v &UB960_IR_RX_ANA_STROBE_SET_CLK_DELAY_MASK ; -ub960_rxport_read (priv, nport,UB960_RR_SFILTER_STS_1 , &v); + ret =ub960_rxport_read (priv, nport,UB960_RR_SFILTER_STS_1 , &v);if (ret)return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 126/826 arm64: dts: mt8183: krane: Fix the address of eeprom at i2c4
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hsin-Te Yuan <[email protected]>
[ Upstream commit e9c60c34948662b5d47573490ee538439b29e462 ]
The address of eeprom should be 50.
--- arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi +2 -2
@@ -88,9 +88,9 @@ &i2c4 { clock-frequency = <400000>; vbus-supply = <&mt6358_vcn18_reg>; - eeprom@54 { + eeprom@50 { compatible = "atmel,24c32"; - reg = <0x54>; + reg = <0x50>; pagesize = <32>; vcc-supply = <&mt6358_vcn18_reg>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 127/826 arm64: dts: mt8183: kukui: Fix the address of eeprom at i2c4
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hsin-Te Yuan <[email protected]>
[ Upstream commit edbde4923f208aa83abb48d4b2463299e5fc2586 ]
The address of eeprom should be 50.
--- arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi | 4 ++-- arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi +2 -2
@@ -92,9 +92,9 @@ &i2c4 { clock-frequency = <400000>; vbus-supply = <&mt6358_vcn18_reg>; - eeprom@54 { + eeprom@50 { compatible = "atmel,24c32"; - reg = <0x54>; + reg = <0x50>; pagesize = <32>; vcc-supply = <&mt6358_vcn18_reg>; };
arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi +2 -2
@@ -79,9 +79,9 @@ &i2c4 { clock-frequency = <400000>; vbus-supply = <&mt6358_vcn18_reg>; - eeprom@54 { + eeprom@50 { compatible = "atmel,24c64"; - reg = <0x54>; + reg = <0x50>; pagesize = <32>; vcc-supply = <&mt6358_vcn18_reg>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 128/826 arm64: dts: qcom: x1e80100: Resize GIC Redistributor register region
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sibi Sankar <[email protected]>
[ Upstream commit 9ed1a2b8784262e85ec300792a1a37ebd8473be2 ]
Resize the GICR register region as it currently seeps into the CPU Control Processor mailbox RX region.
--- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/x1e80100.dtsi +1 -1
@@ -5752,7 +5752,7 @@ apps_smmu: iommu@15000000 { intc: interrupt-controller@17000000 { compatible = "arm,gic-v3"; reg = <0 0x17000000 0 0x10000>, /* GICD */ - <0 0x17080000 0 0x480000>; /* GICR * 12 */ + <0 0x17080000 0 0x300000>; /* GICR * 12 */ interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 129/826 kernel-doc: allow object-like macros in ReST output
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit bb8fd09e2811e2386bb40b9f0d3c7dd6e7961a1e ]
output_function_rst() does not handle object-like macros. It presents a trailing "()" while output_function_man() handles these macros correctly.
Update output_function_rst() to handle object-like macros. Don't show the "Parameters" heading if there are no parameters.
For output_function_man(), don't show the "ARGUMENTS" heading if there are no parameters.
I have tested this quite a bit with my ad hoc test files for both ReST and man format outputs. The generated output looks good.
--- scripts/kernel-doc | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-)
scripts/kernel-doc +30 -13
@@ -569,6 +569,8 @@ sub output_function_man(%) { my %args = %{$_[0]}; my ($parameter, $section); my $count; + my $func_macro = $args{'func_macro'}; + my $paramcount = $#{$args{'parameterlist'}}; # -1 is empty print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Kernel Hacker's Manual\" LINUX\n";
@@ -600,7 +602,10 @@ sub output_function_man(%) { $parenth = ""; } - print ".SH ARGUMENTS\n"; + $paramcount = $#{$args{'parameterlist'}}; # -1 is empty + if ($paramcount >= 0) { + print ".SH ARGUMENTS\n"; + } foreach $parameter (@{$args{'parameterlist'}}) { my $parameter_name = $parameter; $parameter_name =~ s/\[.*//;
@@ -822,10 +827,16 @@ sub output_function_rst(%) { my $oldprefix = $lineprefix; my $signature = ""; - if ($args{'functiontype'} ne "") { - $signature = $args{'functiontype'} . " " . $args{'function'} . " ("; - } else { - $signature = $args{'function'} . " ("; + my $func_macro = $args{'func_macro'}; + my $paramcount = $#{$args{'parameterlist'}}; # -1 is empty + + if ($func_macro) { + $signature = $args{'function'}; + } else { + if ($args{'functiontype'}) { + $signature = $args{'functiontype'} . " "; + } + $signature .= $args{'function'} . " ("; } my $count = 0;
@@ -844,7 +855,9 @@ sub output_function_rst(%) { } } - $signature .= ")"; + if (!$func_macro) { + $signature .= ")"; + } if ($sphinx_major < 3) { if ($args{'typedef'}) {
@@ -888,9 +901,11 @@ sub output_function_rst(%) { # Put our descriptive text into a container (thus an HTML <div>) to help # set the function prototypes apart. # - print ".. container:: kernelindent\n\n"; $lineprefix = " "; - print $lineprefix . "**Parameters**\n\n"; + if ($paramcount >= 0) { + print ".. container:: kernelindent\n\n"; + print $lineprefix . "**Parameters**\n\n"; + } foreach $parameter (@{$args{'parameterlist'}}) { my $parameter_name = $parameter; $parameter_name =~ s/\[.*//;
@@ -1704,7 +1719,7 @@ sub check_return_section { sub dump_function($$) { my $prototype = shift; my $file = shift; - my $noret = 0; + my $func_macro = 0; print_lineno($new_start_line);
@@ -1769,7 +1784,7 @@ sub dump_function($$) { # declaration_name and opening parenthesis (notice the \s+). $return_type = $1; $declaration_name = $2; - $noret = 1; + $func_macro = 1; } elsif ($prototype =~ m/^()($name)\s*$prototype_end/ || $prototype =~ m/^($type1)\s+($name)\s*$prototype_end/ || $prototype =~ m/^($type2+)\s*($name)\s*$prototype_end/) {
@@ -1796,7 +1811,7 @@ sub dump_function($$) { # of warnings goes sufficiently down, the check is only performed in # -Wreturn mode. # TODO: always perform the check. - if ($Wreturn && !$noret) { + if ($Wreturn && !$func_macro) { check_return_section($file, $declaration_name, $return_type); }
@@ -1814,7 +1829,8 @@ sub dump_function($$) { 'parametertypes' => \%parametertypes, 'sectionlist' => \@sectionlist, 'sections' => \%sections, - 'purpose' => $declaration_purpose + 'purpose' => $declaration_purpose, + 'func_macro' => $func_macro }); } else { output_declaration($declaration_name,
@@ -1827,7 +1843,8 @@ sub dump_function($$) { 'parametertypes' => \%parametertypes, 'sectionlist' => \@sectionlist, 'sections' => \%sections, - 'purpose' => $declaration_purpose + 'purpose' => $declaration_purpose, + 'func_macro' => $func_macro }); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 130/826 arm64: dts: ti: k3-am62x-phyboard-lyra: Drop unnecessary McASP AFIFOs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nathan Morrisson <[email protected]>
[ Upstream commit c33a0a02a29bde53a85407f86f332ac4bbc5ab87 ]
Drop the McASP AFIFOs for better audio latency. This adds back a change that was lost while refactoring the device tree.
--- arch/arm64/boot/dts/ti/k3-am62x-phyboard-lyra.dtsi | 2 -- 1 file changed, 2 deletions(-)
arch/arm64/boot/dts/ti/k3-am62x-phyboard-lyra.dtsi +0 -2
@@ -433,8 +433,6 @@ &mcasp2 { 0 0 0 0 0 0 0 0 >; - tx-num-evt = <32>; - rx-num-evt = <32>; status = "okay"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 131/826 gpio: sloppy-logic-analyzer remove reference to rcu_momentary_dyntick_idle()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srikar Dronamraju <[email protected]>
[ Upstream commit a0b6594e411dcae0cc563f5157cf062e93603388 ]
There is one last reference to rcu_momentary_dyntick_idle() after commit 32a9f26e5e26 ("rcu: Rename rcu_momentary_dyntick_idle() into rcu_momentary_eqs()")
Rename it for consistency.
--- tools/gpio/gpio-sloppy-logic-analyzer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/gpio/gpio-sloppy-logic-analyzer.sh +1 -1
@@ -113,7 +113,7 @@ init_cpu() taskset -p "$newmask" "$p" || continue done 2>/dev/null >/dev/null - # Big hammer! Working with 'rcu_momentary_dyntick_idle()' for a more fine-grained solution + # Big hammer! Working with 'rcu_momentary_eqs()' for a more fine-grained solution # still printed warnings. Same for re-enabling the stall detector after sampling. echo 1 > /sys/module/rcupdate/parameters/rcu_cpu_stall_suppress
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 132/826 arm64: dts: mediatek: mt8173-elm-hana: Add vdd-supply to second source trackpad
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
[ Upstream commit f766fae08f6a2eaeb45d8d2c053724c91526835c ]
The Hana device has a second source option trackpad, but it is missing its regulator supply. It only works because the regulator is marked as always-on.
Add the regulator supply, but leave out the post-power-on delay. Instead, document the post-power-on delay along with the reason for not adding it in a comment.
--- arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi +8 -0
@@ -49,6 +49,14 @@ trackpad2: trackpad@2c { interrupts-extended = <&pio 117 IRQ_TYPE_LEVEL_LOW>; reg = <0x2c>; hid-descr-addr = <0x0020>; + /* + * The trackpad needs a post-power-on delay of 100ms, + * but at time of writing, the power supply for it on + * this board is always on. The delay is therefore not + * added to avoid impacting the readiness of the + * trackpad. + */ + vdd-supply = <&mt6397_vgp6_reg>; wakeup-source; }; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 133/826 arm64: dts: mediatek: mt8188: Fix USB3 PHY port default status
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fei Shao <[email protected]>
[ Upstream commit 6bb64877a41561bc78e0f4e9e04d524a0155d6aa ]
The T-PHY controller at 0x11e40000 controls two underlying USB2 and USB3 PHY ports. The USB3 port works normally just like the others, so there's no point in disabling it separately. Otherwise, board DTs would have to enable both the T-PHY controller and one of its sub-nodes in particular, which is slightly redundant and confusing.
Remove the status line in the u3port1 node, so it's ready to be used once the T-PHY controller is enabled.
--- arch/arm64/boot/dts/mediatek/mt8188.dtsi | 1 - 1 file changed, 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt8188.dtsi +0 -1
@@ -1689,7 +1689,6 @@ u3port1: usb-phy@700 { <&clk26m>; clock-names = "ref", "da_ref"; #phy-cells = <1>; - status = "disabled"; }; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 134/826 arm64: dts: mediatek: mt8195-cherry: Use correct audio codec DAI
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fei Shao <[email protected]>
[ Upstream commit 7d5794e6d964940e46286fadbe69a3245fa51e44 ]
The RT5682i and RT5682s drivers describe two DAIs: AIF1 supports both playback and capture, while AIF2 supports capture only.
Cherry doesn't specify which DAI to use. Although this doesn't cause real issues because AIF1 happens to be the first DAI, it should be corrected:
codec@1a: #sound-dai-cells: 1 was expected
Update #sound-dai-cells to 1 and adjust DAI link usages accordingly.
--- arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi +3 -3
@@ -438,7 +438,7 @@ audio_codec: codec@1a { /* Realtek RT5682i or RT5682s, sharing the same configuration */ reg = <0x1a>; interrupts-extended = <&pio 89 IRQ_TYPE_EDGE_BOTH>; - #sound-dai-cells = <0>; + #sound-dai-cells = <1>; realtek,jd-src = <1>; AVDD-supply = <&mt6359_vio18_ldo_reg>;
@@ -1181,7 +1181,7 @@ hs-playback-dai-link { link-name = "ETDM1_OUT_BE"; mediatek,clk-provider = "cpu"; codec { - sound-dai = <&audio_codec>; + sound-dai = <&audio_codec 0>; }; };
@@ -1189,7 +1189,7 @@ hs-capture-dai-link { link-name = "ETDM2_IN_BE"; mediatek,clk-provider = "cpu"; codec { - sound-dai = <&audio_codec>; + sound-dai = <&audio_codec 0>; }; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 135/826 Revert "cgroup: Fix memory leak caused by missing cgroup_bpf_offline"
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Ridong <[email protected]>
[ Upstream commit feb301c60970bd2a1310a53ce2d6e4375397a51b ]
This reverts commit 04f8ef5643bcd8bcde25dfdebef998aea480b2ba.
Only cgroup v2 can be attached by cgroup by BPF programs. Revert this commit and cgroup_bpf_inherit and cgroup_bpf_offline won't be called in cgroup v1. The memory leak issue will be fixed with next patch.
--- kernel/cgroup/cgroup.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
kernel/cgroup/cgroup.c +1 -3
@@ -2314,10 +2314,8 @@ static void cgroup_kill_sb(struct super_block *sb)* And don't kill the default root. */ if (list_empty (&root->cgrp.self.children) && root != &cgrp_dfl_root && - !percpu_ref_is_dying (&root->cgrp.self.refcnt)) { -cgroup_bpf_offline (&root->cgrp); + !percpu_ref_is_dying (&root->cgrp.self.refcnt))percpu_ref_kill (&root->cgrp.self.refcnt); - }cgroup_put (&root->cgrp);kernfs_kill_sb (sb); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 136/826 cgroup/bpf: only cgroup v2 can be attached by bpf programs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Ridong <[email protected]>
[ Upstream commit 2190df6c91373fdec6db9fc07e427084f232f57e ]
Only cgroup v2 can be attached by bpf programs, so this patch introduces that cgroup_bpf_inherit and cgroup_bpf_offline can only be called in cgroup v2, and this can fix the memleak mentioned by commit 04f8ef5643bc ("cgroup: Fix memory leak caused by missing cgroup_bpf_offline"), which has been reverted.
--- kernel/cgroup/cgroup.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
kernel/cgroup/cgroup.c +11 -6
@@ -2140,8 +2140,10 @@ int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask)if (ret) goto exit_stats; - ret =cgroup_bpf_inherit (root_cgrp); -WARN_ON_ONCE (ret); +if (root == &cgrp_dfl_root) { + ret =cgroup_bpf_inherit (root_cgrp); +WARN_ON_ONCE (ret); + }trace_cgroup_setup_root (root);
@@ -5708,9 +5710,11 @@ static struct cgroup *cgroup_create(struct cgroup *parent, const char *name,if (ret) goto out_kernfs_remove; - ret =cgroup_bpf_inherit (cgrp); -if (ret) - goto out_psi_free; +if (cgrp->root == &cgrp_dfl_root) { + ret =cgroup_bpf_inherit (cgrp); +if (ret) + goto out_psi_free; + }/* * New cgroup inherits effective freeze counter, and
@@ -6024,7 +6028,8 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)cgroup1_check_for_release (parent); -cgroup_bpf_offline (cgrp); +if (cgrp->root == &cgrp_dfl_root) +cgroup_bpf_offline (cgrp);/* put the base reference */ percpu_ref_kill (&cgrp->self.refcnt);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 137/826 regulator: rk808: Restrict DVS GPIOs to the RK808 variant only
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragan Simic <[email protected]>
[ Upstream commit 0d214f27c0e3d9694284c95bac1502c2d247355b ]
The rk808-regulator driver supports multiple PMIC variants from the Rockckip RK80x and RK81x series, but the DVS GPIOs are supported on the RK808 variant only, according to the DT bindings [1][2][3][4][5][6] and the datasheets for the supported PMIC variants. [7][8][9][10][11][12]
Thus, change the probe path so the "dvs-gpios" property is checked for and its value possibly used only when the handled PMIC variant is RK808. There's no point in doing that on the other PMIC variants, because they don't support the DVS GPIOs, and it goes against the DT bindings to allow a possible out- of-place "dvs-gpios" property to actually be handled in the driver.
This eliminates the following messages, emitted when the "dvs-gpios" property isn't found in the DT, from the kernel log on boards that actually don't use the RK808 variant, which may have provided a source of confusion:
rk808-regulator rk808-regulator.2.auto: there is no dvs0 gpio rk808-regulator rk808-regulator.2.auto: there is no dvs1 gpio
Furthermore, demote these kernel messages to debug messages, because they are useful during the board bringup phase only. Emitting them afterwards, on the boards that use the RK808 variant, but actually don't use the DVS0/1 GPIOs, clutters the kernel log a bit, while they provide no value and may actually cause false impression that some PMIC-related issues are present.
[1] Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml
[2] Documentation/devicetree/bindings/mfd/rockchip,rk806.yaml
[3] Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml
[4] Documentation/devicetree/bindings/mfd/rockchip,rk816.yaml
[5] Documentation/devicetree/bindings/mfd/rockchip,rk817.yaml
[6] Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml
[7] https://rockchip.fr/RK805%20datasheet%20V1.2.pdf
[8] https://wmsc.lcsc.com/wmsc/upload/file/pdf/v2/lcsc/2401261533_Rockchip-RK806-1_C5156483.pdf
[9] https://rockchip.fr/RK808%20datasheet%20V1.4.pdf
[10] https://rockchip.fr/RK816%20datasheet%20V1.3.pdf
[11] https://rockchip.fr/RK817%20datasheet%20V1.01.pdf
[12] https://rockchip.fr/RK818%20datasheet%20V1.0.pdf
--- drivers/regulator/rk808-regulator.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/regulator/rk808-regulator.c +8 -7
@@ -1853,7 +1853,7 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev, }if (!pdata->dvs_gpio[i]) { -dev_info (dev,"there is no dvs%d gpio\n" , i); +dev_dbg (dev,"there is no dvs%d gpio\n" , i);continue ; }
@@ -1889,12 +1889,6 @@ static int rk808_regulator_probe(struct platform_device *pdev)if (!pdata)return -ENOMEM ; - ret =rk808_regulator_dt_parse_pdata (&pdev->dev, regmap, pdata); -if (ret <0 ) -return ret; - -platform_set_drvdata (pdev, pdata); -switch (rk808->variant) {case RK805_ID : regulators = rk805_reg;
@@ -1905,6 +1899,11 @@ static int rk808_regulator_probe(struct platform_device *pdev) nregulators =ARRAY_SIZE (rk806_reg);break ;case RK808_ID : +/* DVS0/1 GPIOs are supported on the RK808 only */ + ret =rk808_regulator_dt_parse_pdata (&pdev->dev, regmap, pdata); +if (ret <0 ) +return ret; + regulators = rk808_reg; nregulators =RK808_NUM_REGULATORS ;break ;
@@ -1930,6 +1929,8 @@ static int rk808_regulator_probe(struct platform_device *pdev)return -EINVAL ; } +platform_set_drvdata (pdev, pdata); + config.dev = &pdev->dev; config.driver_data = pdata; config.regmap = regmap;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 138/826 power: sequencing: make the QCom PMU pwrseq driver depend on CONFIG_OF
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bartosz Golaszewski <[email protected]>
[ Upstream commit f82bf3c5796e1630d553669fb451e6c9d4070512 ]
This driver uses various OF-specific functions and depends on phandle parsing. There's no reason to make it available to non-OF systems so add a relevant dependency switch to its Kconfig entry.
--- drivers/power/sequencing/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/power/sequencing/Kconfig +1 -0
@@ -16,6 +16,7 @@ if POWER_SEQUENCING config POWER_SEQUENCING_QCOM_WCN tristate "Qualcomm WCN family PMU driver" default m if ARCH_QCOM + depends on OF help Say Y here to enable the power sequencing driver for Qualcomm WCN Bluetooth/WLAN chipsets.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 139/826 arm64: tegra: p2180: Add mandatory compatible for WiFi node
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomasz Maciej Nowak <[email protected]>
[ Upstream commit 2e57d3dc7bff60b9fb05eaaf4ebad87cd3651068 ]
The dtschema requires to specify common ancestor which all SDIO chips are derived from, so add accordingly.
--- arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi +1 -1
@@ -351,7 +351,7 @@ mmc@700b0200 { #size-cells = <0>; wifi@1 { - compatible = "brcm,bcm4354-fmac"; + compatible = "brcm,bcm4354-fmac", "brcm,bcm4329-fmac"; reg = <1>; interrupt-parent = <&gpio>; interrupts = <TEGRA_GPIO(H, 2) IRQ_TYPE_LEVEL_HIGH>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 140/826 arm64: dts: rockchip: Remove enable-active-low from two boards
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Stuebner <[email protected]>
[ Upstream commit 4a9d7e6596f90631f21bca9cb46c6de05d8e86d4 ]
The 'enable-active-low' property is not a valid, because it is the default behaviour of the fixed regulator.
Only 'enable-active-high' is valid, and when this property is absent the fixed regulator will act as active low by default.
Both the rk3588-orange-pi-5 and the Wolfvision pf5 io expander overlay smuggled those enable-active-low properties in, so remove them to make dtbscheck happier.
--- .../boot/dts/rockchip/rk3568-wolfvision-pf5-io-expander.dtso | 1 - arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts | 1 - 2 files changed, 2 deletions(-)
arch/arm64/boot/dts/rockchip/rk3568-wolfvision-pf5-io-expander.dtso +0 -1
@@ -49,7 +49,6 @@ vcc1v8_eth: vcc1v8-eth-regulator { vcc3v3_eth: vcc3v3-eth-regulator { compatible = "regulator-fixed"; - enable-active-low; gpio = <&gpio0 RK_PC0 GPIO_ACTIVE_LOW>; pinctrl-names = "default"; pinctrl-0 = <&vcc3v3_eth_enn>;
arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts +0 -1
@@ -71,7 +71,6 @@ vcc5v0_sys: vcc5v0-sys-regulator { vcc_3v3_sd_s0: vcc-3v3-sd-s0-regulator { compatible = "regulator-fixed"; - enable-active-low; gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_LOW>; regulator-name = "vcc_3v3_sd_s0"; regulator-boot-on;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 141/826 arm64: dts: mt8183: fennel: add i2c2s i2c-scl-internal-delay-ns
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daolong Zhu <[email protected]>
[ Upstream commit c802db127dfb9602aaa9338e433c0553d34f1a9c ]
Add i2c2's i2c-scl-internal-delay-ns.
Reviewed-by:
--- arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi | 3 +++ 1 file changed, 3 insertions(+)
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi +3 -0
@@ -25,3 +25,6 @@ trackpad@2c { }; }; +&i2c2 { + i2c-scl-internal-delay-ns = <21500>; +};
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 142/826 arm64: dts: mt8183: burnet: add i2c2s i2c-scl-internal-delay-ns
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daolong Zhu <[email protected]>
[ Upstream commit 85af64983889c621e8868b744c8ca03bd5038c02 ]
Add i2c2's i2c-scl-internal-delay-ns.
--- arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts | 3 +++ 1 file changed, 3 insertions(+)
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts +3 -0
@@ -30,3 +30,6 @@ touchscreen@2c { }; }; +&i2c2 { + i2c-scl-internal-delay-ns = <4100>; +};
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 143/826 arm64: dts: mt8183: cozmo: add i2c2s i2c-scl-internal-delay-ns
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daolong Zhu <[email protected]>
[ Upstream commit bd0eb3b1f7aee698b86513edf10a50e2d0c7cb14 ]
Add i2c2's i2c-scl-internal-delay-ns.
--- arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts +2 -0
@@ -18,6 +18,8 @@ &i2c_tunnel { }; &i2c2 { + i2c-scl-internal-delay-ns = <25000>; + trackpad@2c { compatible = "hid-over-i2c"; reg = <0x2c>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 144/826 arm64: dts: mt8183: Damu: add i2c2s i2c-scl-internal-delay-ns
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daolong Zhu <[email protected]>
[ Upstream commit 6ff2d45f2121c698a57c959ae21885a048615908 ]
Add i2c2's i2c-scl-internal-delay-ns.
--- arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts | 3 +++ 1 file changed, 3 insertions(+)
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts +3 -0
@@ -30,3 +30,6 @@ &qca_wifi { qcom,ath10k-calibration-variant = "GO_DAMU"; }; +&i2c2 { + i2c-scl-internal-delay-ns = <20000>; +};
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 145/826 pwm: imx27: Workaround of the pwm output bug when decrease the duty cycle
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clark Wang <[email protected]>
[ Upstream commit a25351e4c7740eb22561a3ee4ef17611c6f410b0 ]
Implement workaround for ERR051198
(https://www.nxp.com/docs/en/errata/IMX8MN_0N14Y.pdf)
PWM output may not function correctly if the FIFO is empty when a new SAR value is programmed.
Description:
When the PWM FIFO is empty, a new value programmed to the PWM Sample register (PWM_PWMSAR) will be directly applied even if the current timer period has not expired. If the new SAMPLE value programmed in the PWM_PWMSAR register is less than the previous value, and the PWM counter register (PWM_PWMCNR) that contains the current COUNT value is greater than the new programmed SAMPLE value, the current period will not flip the level. This may result in an output pulse with a duty cycle of 100%.
Workaround:
Program the current SAMPLE value in the PWM_PWMSAR register before updating the new duty cycle to the SAMPLE value in the PWM_PWMSAR register. This will ensure that the new SAMPLE value is modified during a non-empty FIFO, and can be successfully updated after the period expires.
Write the old SAR value before updating the new duty cycle to SAR. This avoids writing the new value into an empty FIFO.
This only resolves the issue when the PWM period is longer than 2us (or <500kHz) because write register is not quick enough when PWM period is very short.
Reproduce steps:
cd /sys/class/pwm/pwmchip1/pwm0
echo 2000000000 > period # It is easy to observe by using long period
echo 1000000000 > duty_cycle
echo 1 > enable
echo 8000 > duty_cycle # One full high pulse will be seen by scope
--- drivers/pwm/pwm-imx27.c | 98 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-)
drivers/pwm/pwm-imx27.c +96 -2
@@ -26,6 +26,7 @@#define MX3_PWMSR 0x04/* PWM Status Register */ #define MX3_PWMSAR 0x0C/* PWM Sample Register */ #define MX3_PWMPR 0x10/* PWM Period Register */ +#define MX3_PWMCNR 0x14/* PWM Counter Register */ #define MX3_PWMCR_FWM GENMASK(27, 26)#define MX3_PWMCR_STOPEN BIT(25)
@@ -219,10 +220,12 @@ static void pwm_imx27_wait_fifo_slot(struct pwm_chip *chip,static int pwm_imx27_apply (struct pwm_chip *chip,struct pwm_device *pwm,const struct pwm_state *state) { -unsigned long period_cycles, duty_cycles, prescale; +unsigned long period_cycles, duty_cycles, prescale, period_us, tmp;struct pwm_imx27_chip *imx =to_pwm_imx27_chip (chip);unsigned long long c;unsigned long long clkrate; +unsigned long flags; +int val;int ret;u32 cr;
@@ -263,7 +266,98 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,pwm_imx27_sw_reset (chip); } -writel (duty_cycles, imx->mmio_base +MX3_PWMSAR ); + val =readl (imx->mmio_base +MX3_PWMPR ); + val = val >=MX3_PWMPR_MAX ?MX3_PWMPR_MAX : val; + cr =readl (imx->mmio_base +MX3_PWMCR ); + tmp =NSEC_PER_SEC * (u64)(val +2 ) *MX3_PWMCR_PRESCALER_GET (cr); + tmp =DIV_ROUND_UP_ULL (tmp, clkrate); + period_us =DIV_ROUND_UP_ULL (tmp,1000 ); + +/* +* ERR051198: +* PWM: PWM output may not function correctly if the FIFO is empty when +* a new SAR value is programmed +* +* Description: +* When the PWM FIFO is empty, a new value programmed to the PWM Sample +* register (PWM_PWMSAR) will be directly applied even if the current +* timer period has not expired. +* +* If the new SAMPLE value programmed in the PWM_PWMSAR register is +* less than the previous value, and the PWM counter register +* (PWM_PWMCNR) that contains the current COUNT value is greater than +* the new programmed SAMPLE value, the current period will not flip +* the level. This may result in an output pulse with a duty cycle of +* 100%. +* +* Consider a change from +* ________ +* / \______/ +* ^ * ^ +* to +* ____ +* / \__________/ +* ^ ^ +* At the time marked by *, the new write value will be directly applied +* to SAR even the current period is not over if FIFO is empty. +* +* ________ ____________________ +* / \______/ \__________/ +* ^ ^ * ^ ^ +* |<-- old SAR -->| |<-- new SAR -->| +* +* That is the output is active for a whole period. +* +* Workaround: +* Check new SAR less than old SAR and current counter is in errata +* windows, write extra old SAR into FIFO and new SAR will effect at +* next period. +* +* Sometime period is quite long, such as over 1 second. If add old SAR +* into FIFO unconditional, new SAR have to wait for next period. It +* may be too long. +* +* Turn off the interrupt to ensure that not IRQ and schedule happen +* during above operations. If any irq and schedule happen, counter +* in PWM will be out of data and take wrong action. +* +* Add a safety margin 1.5us because it needs some time to complete +* IO write. +* +* Use writel_relaxed() to minimize the interval between two writes to +* the SAR register to increase the fastest PWM frequency supported. +* +* When the PWM period is longer than 2us(or <500kHz), this workaround +* can solve this problem. No software workaround is available if PWM +* period is shorter than IO write. Just try best to fill old data +* into FIFO. +*/ + c = clkrate *1500 ; +do_div (c,NSEC_PER_SEC ); + +local_irq_save (flags); + val =FIELD_GET (MX3_PWMSR_FIFOAV ,readl_relaxed (imx->mmio_base +MX3_PWMSR )); + +if (duty_cycles < imx->duty_cycle && (cr &MX3_PWMCR_EN )) { +if (period_us <2 ) {/* 2us = 500 kHz */ +/* Best effort attempt to fix up >500 kHz case */ +udelay (3 * period_us); +writel_relaxed (imx->duty_cycle, imx->mmio_base +MX3_PWMSAR ); +writel_relaxed (imx->duty_cycle, imx->mmio_base +MX3_PWMSAR ); + }else if (val <MX3_PWMSR_FIFOAV_2WORDS ) { + val =readl_relaxed (imx->mmio_base +MX3_PWMCNR ); +/* +* If counter is close to period, controller may roll over when +* next IO write. +*/ +if ((val + c >= duty_cycles && val < imx->duty_cycle) || + val + c >= period_cycles) +writel_relaxed (imx->duty_cycle, imx->mmio_base +MX3_PWMSAR ); + } + } +writel_relaxed (duty_cycles, imx->mmio_base +MX3_PWMSAR ); +local_irq_restore (flags); +writel (period_cycles, imx->mmio_base +MX3_PWMPR );/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 146/826 ARM: dts: cubieboard4: Fix DCDC5 regulator constraints
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andre Przywara <[email protected]>
[ Upstream commit dd36ad71ad65968f97630808bc8d605c929b128e ]
The DCDC5 voltage rail in the X-Powers AXP809 PMIC has a resolution of 50mV, so the currently enforced limits of 1.475 and 1.525 volts cannot be set, when the existing regulator value is beyond this range.
This will lead to the whole regulator driver to give up and fail probing, which in turn will hang the system, as essential devices depend on the PMIC.
In this case a bug in U-Boot set the voltage to 1.75V (meant for DCDC4), and the AXP driver's attempt to correct this lead to this error:
==================
[ 4.447653] axp20x-rsb sunxi-rsb-3a3: AXP20X driver loaded [ 4.450066] vcc-dram: Bringing 1750000uV into 1575000-1575000uV [ 4.460272] vcc-dram: failed to apply 1575000-1575000uV constraint: -EINVAL [ 4.474788] axp20x-regulator axp20x-regulator.0: Failed to register dcdc5 [ 4.482276] axp20x-regulator axp20x-regulator.0: probe with driver axp20x-regulator failed with error -22
==================
Set the limits to values that can be programmed, so any correction will be successful.
--- arch/arm/boot/dts/allwinner/sun9i-a80-cubieboard4.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/allwinner/sun9i-a80-cubieboard4.dts +2 -2
@@ -280,8 +280,8 @@ reg_dcdc4: dcdc4 { reg_dcdc5: dcdc5 { regulator-always-on; - regulator-min-microvolt = <1425000>; - regulator-max-microvolt = <1575000>; + regulator-min-microvolt = <1450000>; + regulator-max-microvolt = <1550000>; regulator-name = "vcc-dram"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 147/826 arm64: dts: ti: k3-j7200: Fix register map for main domain pmx
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jared McArthur <[email protected]>
[ Upstream commit b7af8b4acb3e08c710cd48f098ce8cd07cf43a1e ]
Commit 0d0a0b441346 ("arm64: dts: ti: k3-j7200: fix main pinmux range") split the main_pmx0 into two nodes: main_pmx0 and main_pmx1 due to a non-addressable region, but incorrectly represented the ranges. As a result, the memory map for the pinctrl is incorrect. Fix this by introducing the correct ranges.
The ranges are taken from the J7200 TRM [1] (Table 5-695. CTRL_MMR0 Registers).
Padconfig starting addresses and ranges:
- 0 to 66: 0x11c000, 0x10c
- 68: 0x11c110, 0x004
- 71 to 73: 0x11c11c, 0x00c
- 89 to 90: 0x11c164, 0x008
The datasheet [2] doesn't contain PADCONFIG63 (Table 6-106. Pin Multiplexing), but the pin is necessary for enabling the MMC1 CLKLP pad loopback and should be included in the pinmux register map.
Due to the change in pinmux node addresses, change the pinmux node for the USB0_DRVVBUS pin to main_pmx2. The offset has not changed since the new main_pmx2 node has the same base address and range as the original main_pmx1 node. All other pinmuxing done within J7200 dts or dtso files only uses main_pmx0 which has not changed.
[1] https://www.ti.com/lit/pdf/spruiu1
[2] https://www.ti.com/lit/gpn/dra821u
--- .../dts/ti/k3-j7200-common-proc-board.dts | 2 +- arch/arm64/boot/dts/ti/k3-j7200-main.dtsi | 22 +++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/ti/k3-j7200-common-proc-board.dts +1 -1
@@ -254,7 +254,7 @@ J721E_IOPAD(0x38, PIN_OUTPUT, 0) /* (Y21) MCAN3_TX */ }; }; -&main_pmx1 { +&main_pmx2 { main_usbss0_pins_default: main-usbss0-default-pins { pinctrl-single,pins = < J721E_IOPAD(0x04, PIN_OUTPUT, 0) /* (T4) USB0_DRVVBUS */
arch/arm64/boot/dts/ti/k3-j7200-main.dtsi +20 -2
@@ -426,10 +426,28 @@ main_pmx0: pinctrl@11c000 { pinctrl-single,function-mask = <0xffffffff>; }; - main_pmx1: pinctrl@11c11c { + main_pmx1: pinctrl@11c110 { compatible = "ti,j7200-padconf", "pinctrl-single"; /* Proxy 0 addressing */ - reg = <0x00 0x11c11c 0x00 0xc>; + reg = <0x00 0x11c110 0x00 0x004>; + #pinctrl-cells = <1>; + pinctrl-single,register-width = <32>; + pinctrl-single,function-mask = <0xffffffff>; + }; + + main_pmx2: pinctrl@11c11c { + compatible = "ti,j7200-padconf", "pinctrl-single"; + /* Proxy 0 addressing */ + reg = <0x00 0x11c11c 0x00 0x00c>; + #pinctrl-cells = <1>; + pinctrl-single,register-width = <32>; + pinctrl-single,function-mask = <0xffffffff>; + }; + + main_pmx3: pinctrl@11c164 { + compatible = "ti,j7200-padconf", "pinctrl-single"; + /* Proxy 0 addressing */ + reg = <0x00 0x11c164 0x00 0x008>; #pinctrl-cells = <1>; pinctrl-single,register-width = <32>; pinctrl-single,function-mask = <0xffffffff>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 148/826 arm64: dts: ti: k3-j7200: Fix clock ids for MCSPI instances
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anurag Dutta <[email protected]>
[ Upstream commit 3a47e381670f130870caef6e1155ac531b17b032 ]
The clock IDs for multiple MCSPI instances across wakeup as well as main domain in J7200 are incorrect when compared with documentation [1]. This results in kernel crashes when the said instances are enabled. Fix the clock ids to their appropriate values.
[1]https://software-dl.ti.com/tisci/esd/latest/5_soc_doc/j7200/clocks.html
--- arch/arm64/boot/dts/ti/k3-j7200-main.dtsi | 16 ++++++++-------- arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-)
arch/arm64/boot/dts/ti/k3-j7200-main.dtsi +8 -8
@@ -1163,7 +1163,7 @@ main_spi0: spi@2100000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 266 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 266 1>; + clocks = <&k3_clks 266 4>; status = "disabled"; };
@@ -1174,7 +1174,7 @@ main_spi1: spi@2110000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 267 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 267 1>; + clocks = <&k3_clks 267 4>; status = "disabled"; };
@@ -1185,7 +1185,7 @@ main_spi2: spi@2120000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 268 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 268 1>; + clocks = <&k3_clks 268 4>; status = "disabled"; };
@@ -1196,7 +1196,7 @@ main_spi3: spi@2130000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 269 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 269 1>; + clocks = <&k3_clks 269 4>; status = "disabled"; };
@@ -1207,7 +1207,7 @@ main_spi4: spi@2140000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 270 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 270 1>; + clocks = <&k3_clks 270 2>; status = "disabled"; };
@@ -1218,7 +1218,7 @@ main_spi5: spi@2150000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 271 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 271 1>; + clocks = <&k3_clks 271 4>; status = "disabled"; };
@@ -1229,7 +1229,7 @@ main_spi6: spi@2160000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 272 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 272 1>; + clocks = <&k3_clks 272 4>; status = "disabled"; };
@@ -1240,7 +1240,7 @@ main_spi7: spi@2170000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 273 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 273 1>; + clocks = <&k3_clks 273 4>; status = "disabled"; };
arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi +3 -3
@@ -494,7 +494,7 @@ mcu_spi0: spi@40300000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 274 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 274 0>; + clocks = <&k3_clks 274 4>; status = "disabled"; };
@@ -505,7 +505,7 @@ mcu_spi1: spi@40310000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 275 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 275 0>; + clocks = <&k3_clks 275 4>; status = "disabled"; };
@@ -516,7 +516,7 @@ mcu_spi2: spi@40320000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 276 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 276 0>; + clocks = <&k3_clks 276 2>; status = "disabled"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 149/826 arm64: dts: ti: k3-j721e: Fix clock IDs for MCSPI instances
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anurag Dutta <[email protected]>
[ Upstream commit ab09a68f3be04b2f9d1fc7cfc0e2225025cb9421 ]
The clock IDs for multiple MCSPI instances across wakeup domain in J721e are incorrect when compared with documentation [1]. Fix the clock ids to their appropriate values.
[1]https://software-dl.ti.com/tisci/esd/latest/5_soc_doc/j721e/clocks.html
--- arch/arm64/boot/dts/ti/k3-j721e-mcu-wakeup.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/ti/k3-j721e-mcu-wakeup.dtsi +3 -3
@@ -654,7 +654,7 @@ mcu_spi0: spi@40300000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 274 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 274 0>; + clocks = <&k3_clks 274 1>; status = "disabled"; };
@@ -665,7 +665,7 @@ mcu_spi1: spi@40310000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 275 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 275 0>; + clocks = <&k3_clks 275 1>; status = "disabled"; };
@@ -676,7 +676,7 @@ mcu_spi2: spi@40320000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 276 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 276 0>; + clocks = <&k3_clks 276 1>; status = "disabled"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 150/826 arm64: dts: ti: k3-j721s2: Fix clock IDs for MCSPI instances
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anurag Dutta <[email protected]>
[ Upstream commit 891874f015e98f67ab2fda76f2e859921e136621 ]
The clock IDs for multiple MCSPI instances across wakeup domain in J721s2 are incorrect when compared with documentation [1]. Fix the clock IDs to their appropriate values.
[1]https://software-dl.ti.com/tisci/esd/latest/5_soc_doc/j721s2/clocks.html
--- arch/arm64/boot/dts/ti/k3-j721s2-main.dtsi | 16 ++++++++-------- arch/arm64/boot/dts/ti/k3-j721s2-mcu-wakeup.dtsi | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-)
arch/arm64/boot/dts/ti/k3-j721s2-main.dtsi +8 -8
@@ -1708,7 +1708,7 @@ main_spi0: spi@2100000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 339 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 339 1>; + clocks = <&k3_clks 339 2>; status = "disabled"; };
@@ -1719,7 +1719,7 @@ main_spi1: spi@2110000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 340 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 340 1>; + clocks = <&k3_clks 340 2>; status = "disabled"; };
@@ -1730,7 +1730,7 @@ main_spi2: spi@2120000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 341 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 341 1>; + clocks = <&k3_clks 341 2>; status = "disabled"; };
@@ -1741,7 +1741,7 @@ main_spi3: spi@2130000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 342 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 342 1>; + clocks = <&k3_clks 342 2>; status = "disabled"; };
@@ -1752,7 +1752,7 @@ main_spi4: spi@2140000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 343 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 343 1>; + clocks = <&k3_clks 343 2>; status = "disabled"; };
@@ -1763,7 +1763,7 @@ main_spi5: spi@2150000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 344 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 344 1>; + clocks = <&k3_clks 344 2>; status = "disabled"; };
@@ -1774,7 +1774,7 @@ main_spi6: spi@2160000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 345 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 345 1>; + clocks = <&k3_clks 345 2>; status = "disabled"; };
@@ -1785,7 +1785,7 @@ main_spi7: spi@2170000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 346 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 346 1>; + clocks = <&k3_clks 346 2>; status = "disabled"; };
arch/arm64/boot/dts/ti/k3-j721s2-mcu-wakeup.dtsi +3 -3
@@ -425,7 +425,7 @@ mcu_spi0: spi@40300000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 347 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 347 0>; + clocks = <&k3_clks 347 2>; status = "disabled"; };
@@ -436,7 +436,7 @@ mcu_spi1: spi@40310000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 348 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 348 0>; + clocks = <&k3_clks 348 2>; status = "disabled"; };
@@ -447,7 +447,7 @@ mcu_spi2: spi@40320000 { #address-cells = <1>; #size-cells = <0>; power-domains = <&k3_pds 349 TI_SCI_PD_EXCLUSIVE>; - clocks = <&k3_clks 349 0>; + clocks = <&k3_clks 349 2>; status = "disabled"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 151/826 watchdog: Add HAS_IOPORT dependency for SBC8360 and SBC7240
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit d4d3125a3452a54acca69050be67b87ee2900e77 ]
Both drivers use I/O port accesses without declaring a dependency on CONFIG_HAS_IOPORT. For sbc8360_wdt this causes a compile error on UML once inb()/outb() helpers become conditional.
For sbc7240_wdt this causes no such errors with UML because this driver depends on both x86_32 and !UML. Nevertheless add HAS_IOPORT as a dependency for both drivers to be explicit and drop the !UML dependency for sbc7240_wdt as it is now redundant since UML implies no HAS_IOPORT.
--- drivers/watchdog/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/watchdog/Kconfig +2 -2
@@ -1509,7 +1509,7 @@ config 60XX_WDT config SBC8360_WDT tristate "SBC8360 Watchdog Timer" - depends on X86_32 + depends on X86_32 && HAS_IOPORT help This is the driver for the hardware watchdog on the SBC8360 Single
@@ -1522,7 +1522,7 @@ config SBC8360_WDT config SBC7240_WDT tristate "SBC Nano 7240 Watchdog Timer" - depends on X86_32 && !UML + depends on X86_32 && HAS_IOPORT help This is the driver for the hardware watchdog found on the IEI single board computers EPIC Nano 7240 (and likely others). This
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 152/826 arm64: dts: qcom: x1e80100: Update C4/C5 residency/exit numbers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 2e65616ef07fa4c72c3898b22e5bede7d468cf32 ]
Update the numbers based on the information found in the DSDT.
--- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/qcom/x1e80100.dtsi +3 -3
@@ -279,8 +279,8 @@ CLUSTER_C4: cpu-sleep-0 { idle-state-name = "ret"; arm,psci-suspend-param = <0x00000004>; entry-latency-us = <180>; - exit-latency-us = <320>; - min-residency-us = <1000>; + exit-latency-us = <500>; + min-residency-us = <600>; }; };
@@ -299,7 +299,7 @@ CLUSTER_CL5: cluster-sleep-1 { idle-state-name = "ret-pll-off"; arm,psci-suspend-param = <0x01000054>; entry-latency-us = <2200>; - exit-latency-us = <2500>; + exit-latency-us = <4000>; min-residency-us = <7000>; }; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 153/826 dt-bindings: cache: qcom,llcc: Fix X1E80100 reg entries
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abel Vesa <[email protected]>
[ Upstream commit f9759e2b57049f9c4ea8d7254ba6afcf6eb10cd6 ]
Document the missing Broadcast_AND region for x1e80100.
--- .../devicetree/bindings/cache/qcom,llcc.yaml | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/cache/qcom,llcc.yaml +34 -2
@@ -39,11 +39,11 @@ properties: reg: minItems: 2 - maxItems: 9 + maxItems: 10 reg-names: minItems: 2 - maxItems: 9 + maxItems: 10 interrupts: maxItems: 1
@@ -134,6 +134,36 @@ allOf: - qcom,qdu1000-llcc - qcom,sc8180x-llcc - qcom,sc8280xp-llcc + then: + properties: + reg: + items: + - description: LLCC0 base register region + - description: LLCC1 base register region + - description: LLCC2 base register region + - description: LLCC3 base register region + - description: LLCC4 base register region + - description: LLCC5 base register region + - description: LLCC6 base register region + - description: LLCC7 base register region + - description: LLCC broadcast base register region + reg-names: + items: + - const: llcc0_base + - const: llcc1_base + - const: llcc2_base + - const: llcc3_base + - const: llcc4_base + - const: llcc5_base + - const: llcc6_base + - const: llcc7_base + - const: llcc_broadcast_base + + - if: + properties: + compatible: + contains: + enum: - qcom,x1e80100-llcc then: properties:
@@ -148,6 +178,7 @@ allOf: - description: LLCC6 base register region - description: LLCC7 base register region - description: LLCC broadcast base register region + - description: LLCC broadcast AND register region reg-names: items: - const: llcc0_base
@@ -159,6 +190,7 @@ allOf: - const: llcc6_base - const: llcc7_base - const: llcc_broadcast_base + - const: llcc_broadcast_and_base - if: properties:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 154/826 of/fdt: add dt_phys arg to early_init_dt_scan and early_init_dt_verify
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Usama Arif <[email protected]>
[ Upstream commit b2473a359763e27567993e7d8f37de82f57a0829 ]
__pa() is only intended to be used for linear map addresses and using
it for initial_boot_params which is in fixmap for arm64 will give an incorrect value. Hence save the physical address when it is known at boot time when calling early_init_dt_scan for arm64 and use it at kexec time instead of converting the virtual address using __pa().
Note that arm64 doesn't need the FDT region reserved in the DT as the kernel explicitly reserves the passed in FDT. Therefore, only a debug warning is fixed with this change.
--- arch/arc/kernel/devtree.c | 2 +- arch/arm/kernel/devtree.c | 2 +- arch/arm64/kernel/setup.c | 6 +++++- arch/csky/kernel/setup.c | 4 ++-- arch/loongarch/kernel/setup.c | 2 +- arch/microblaze/kernel/prom.c | 2 +- arch/mips/kernel/prom.c | 2 +- arch/mips/kernel/relocate.c | 2 +- arch/nios2/kernel/prom.c | 4 ++-- arch/openrisc/kernel/prom.c | 2 +- arch/powerpc/kernel/dt_cpu_ftrs.c | 2 +- arch/powerpc/kernel/prom.c | 2 +- arch/powerpc/platforms/pseries/plpks.c | 2 +- arch/riscv/kernel/setup.c | 2 +- arch/sh/kernel/setup.c | 2 +- arch/um/kernel/dtb.c | 2 +- arch/x86/kernel/devicetree.c | 2 +- arch/xtensa/kernel/setup.c | 2 +- drivers/of/fdt.c | 14 ++++++++------ drivers/of/kexec.c | 2 +- include/linux/of_fdt.h | 5 +++-- 21 files changed, 36 insertions(+), 29 deletions(-)
arch/arc/kernel/devtree.c +1 -1
@@ -62,7 +62,7 @@ const struct machine_desc * __init setup_machine_fdt(void *dt)const struct machine_desc *mdesc;unsigned long dt_root; -if (!early_init_dt_scan (dt)) +if (!early_init_dt_scan (dt,__pa (dt)))return NULL ; mdesc =of_flat_dt_match_machine (NULL , arch_get_next_mach);
arch/arm/kernel/devtree.c +1 -1
@@ -200,7 +200,7 @@ const struct machine_desc * __init setup_machine_fdt(void *dt_virt) mdesc_best = &__mach_desc_GENERIC_DT; -if (!dt_virt || !early_init_dt_verify (dt_virt)) +if (!dt_virt || !early_init_dt_verify (dt_virt,__pa (dt_virt)))return NULL ; mdesc =of_flat_dt_match_machine (mdesc_best, arch_get_next_mach);
arch/arm64/kernel/setup.c +5 -1
@@ -175,7 +175,11 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)if (dt_virt)memblock_reserve (dt_phys, size); -if (!dt_virt || !early_init_dt_scan (dt_virt)) { +/* +* dt_virt is a fixmap address, hence __pa(dt_virt) can't be used. +* Pass dt_phys directly. +*/ +if (!early_init_dt_scan (dt_virt, dt_phys)) {pr_crit ("\n" "Error: invalid device tree blob at physical address %pa (virtual address 0x%px)\n" "The dtb must be 8-byte aligned and must not exceed 2 MB in size\n"
arch/csky/kernel/setup.c +2 -2
@@ -112,9 +112,9 @@ asmlinkage __visible void __init csky_start(unsigned int unused,pre_trap_init ();if (dtb_start ==NULL ) -early_init_dt_scan (__dtb_start); +early_init_dt_scan (__dtb_start,__pa (dtb_start));else -early_init_dt_scan (dtb_start); +early_init_dt_scan (dtb_start,__pa (dtb_start));start_kernel ();
arch/loongarch/kernel/setup.c +1 -1
@@ -291,7 +291,7 @@ static void __init fdt_setup(void)if (!fdt_pointer ||fdt_check_header (fdt_pointer))return ; -early_init_dt_scan (fdt_pointer); +early_init_dt_scan (fdt_pointer,__pa (fdt_pointer));early_init_fdt_reserve_self (); max_low_pfn =PFN_PHYS (memblock_end_of_DRAM ());
arch/microblaze/kernel/prom.c +1 -1
@@ -18,7 +18,7 @@ void __init early_init_devtree(void *params) {pr_debug (" -> early_init_devtree(%p)\n" , params); -early_init_dt_scan (params); +early_init_dt_scan (params,__pa (params));if (!strlen (boot_command_line))strscpy (boot_command_line, cmd_line,COMMAND_LINE_SIZE );
arch/mips/kernel/prom.c +1 -1
@@ -41,7 +41,7 @@ char *mips_get_machine_name(void)void __init __dt_setup_arch (void *bph) { -if (!early_init_dt_scan (bph)) +if (!early_init_dt_scan (bph,__pa (bph)))return ;mips_set_machine_name (of_flat_dt_get_machine_name ());
arch/mips/kernel/relocate.c +1 -1
@@ -337,7 +337,7 @@ void *__init relocate_kernel(void)#if defined(CONFIG_USE_OF )/* Deal with the device tree */ fdt =plat_get_fdt (); -early_init_dt_scan (fdt); +early_init_dt_scan (fdt,__pa (fdt));if (boot_command_line[0 ]) {/* Boot command line was passed in device tree */ strscpy (arcs_cmdline, boot_command_line,COMMAND_LINE_SIZE );
arch/nios2/kernel/prom.c +2 -2
@@ -27,7 +27,7 @@ void __init early_init_devtree(void *params)if (be32_to_cpup ((__be32 *)CONFIG_NIOS2_DTB_PHYS_ADDR ) ==OF_DT_HEADER ) { params = (void *)CONFIG_NIOS2_DTB_PHYS_ADDR ; -early_init_dt_scan (params); +early_init_dt_scan (params,__pa (params));return ; }#endif
@@ -37,5 +37,5 @@ void __init early_init_devtree(void *params) params = (void *)__dtb_start;#endif -early_init_dt_scan (params); +early_init_dt_scan (params,__pa (params)); }
arch/openrisc/kernel/prom.c +1 -1
@@ -22,6 +22,6 @@void __init early_init_devtree (void *params) { -early_init_dt_scan (params); +early_init_dt_scan (params,__pa (params));memblock_allow_resize (); }
arch/powerpc/kernel/dt_cpu_ftrs.c +1 -1
@@ -867,7 +867,7 @@ bool __init dt_cpu_ftrs_init(void *fdt) using_dt_cpu_ftrs = false;/* Setup and verify the FDT, if it fails we just bail */ -if (!early_init_dt_verify (fdt)) +if (!early_init_dt_verify (fdt,__pa (fdt)))return false;if (!of_scan_flat_dt (fdt_find_cpu_features,NULL ))
arch/powerpc/kernel/prom.c +1 -1
@@ -791,7 +791,7 @@ void __init early_init_devtree(void *params)DBG (" -> early_init_devtree(%px)\n" , params);/* Too early to BUG_ON(), do it by hand */ -if (!early_init_dt_verify (params)) +if (!early_init_dt_verify (params,__pa (params)))panic ("BUG: Failed verifying flat device tree, bad version?" );of_scan_flat_dt (early_init_dt_scan_model,NULL );
arch/powerpc/platforms/pseries/plpks.c +1 -1
@@ -683,7 +683,7 @@ void __init plpks_early_init_devtree(void) out:fdt_nop_property (fdt, chosen_node,"ibm,plpks-pw" );// Since we've cleared the password, we must update the FDT checksum -early_init_dt_verify (fdt); +early_init_dt_verify (fdt,__pa (fdt)); }static __init int pseries_plpks_init (void )
arch/riscv/kernel/setup.c +1 -1
@@ -227,7 +227,7 @@ static void __init init_resources(void)static void __init parse_dtb (void ) {/* Early scan of device tree from init memory */ -if (early_init_dt_scan (dtb_early_va)) { +if (early_init_dt_scan (dtb_early_va,__pa (dtb_early_va))) {const char *name =of_flat_dt_get_machine_name ();if (name) {
arch/sh/kernel/setup.c +1 -1
@@ -255,7 +255,7 @@ void __ref sh_fdt_init(phys_addr_t dt_phys) dt_virt =phys_to_virt (dt_phys);#endif -if (!dt_virt || !early_init_dt_scan (dt_virt)) { +if (!dt_virt || !early_init_dt_scan (dt_virt,__pa (dt_virt))) {pr_crit ("Error: invalid device tree blob" " at physical address %p\n" , (void *)dt_phys);
arch/um/kernel/dtb.c +1 -1
@@ -17,7 +17,7 @@ void uml_dtb_init(void) area =uml_load_file (dtb, &size);if (area) { -if (!early_init_dt_scan (area)) { +if (!early_init_dt_scan (area,__pa (area))) {pr_err ("invalid DTB %s\n" , dtb);memblock_free (area, size);return ;
arch/x86/kernel/devicetree.c +1 -1
@@ -305,7 +305,7 @@ void __init x86_flattree_get_config(void) map_len = size; } -early_init_dt_verify (dt); +early_init_dt_verify (dt,__pa (dt)); }unflatten_and_copy_device_tree ();
arch/xtensa/kernel/setup.c +1 -1
@@ -216,7 +216,7 @@ static int __init xtensa_dt_io_area(unsigned long node, const char *uname,void __init early_init_devtree (void *params) { -early_init_dt_scan (params); +early_init_dt_scan (params,__pa (params));of_scan_flat_dt (xtensa_dt_io_area,NULL );if (!command_line[0 ])
drivers/of/fdt.c +8 -6
@@ -457,6 +457,7 @@ int __initdata dt_root_addr_cells;int __initdata dt_root_size_cells;void *initial_boot_params__ro_after_init ; +phys_addr_t initial_boot_params_pa__ro_after_init ;#ifdef CONFIG_OF_EARLY_FLATTREE
@@ -1136,17 +1137,18 @@ static void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)return ptr; } -bool __init early_init_dt_verify (void *params) +bool __init early_init_dt_verify (void *dt_virt,phys_addr_t dt_phys) { -if (!params) +if (!dt_virt)return false;/* check device tree validity */ -if (fdt_check_header (params)) +if (fdt_check_header (dt_virt))return false;/* Setup flat device-tree pointer */ - initial_boot_params = params; + initial_boot_params = dt_virt; + initial_boot_params_pa = dt_phys; of_fdt_crc32 =crc32_be (~0 , initial_boot_params,fdt_totalsize (initial_boot_params));
@@ -1173,11 +1175,11 @@ void __init early_init_dt_scan_nodes(void)early_init_dt_check_for_usable_mem_range (); } -bool __init early_init_dt_scan (void *params) +bool __init early_init_dt_scan (void *dt_virt,phys_addr_t dt_phys) {bool status; - status =early_init_dt_verify (params); + status =early_init_dt_verify (dt_virt, dt_phys);if (!status)return false;
drivers/of/kexec.c +1 -1
@@ -301,7 +301,7 @@ void *of_kexec_alloc_and_setup_fdt(const struct kimage *image, }/* Remove memory reservation for the current device tree. */ - ret =fdt_find_and_del_mem_rsv (fdt,__pa (initial_boot_params), + ret =fdt_find_and_del_mem_rsv (fdt, initial_boot_params_pa,fdt_totalsize (initial_boot_params));if (ret == -EINVAL ) {pr_err ("Error removing memory reservation.\n" );
include/linux/of_fdt.h +3 -2
@@ -31,6 +31,7 @@ extern void *of_fdt_unflatten_tree(const unsigned long *blob,extern int __initdata dt_root_addr_cells;extern int __initdata dt_root_size_cells;extern void *initial_boot_params; +extern phys_addr_t initial_boot_params_pa;extern char __dtb_start[];extern char __dtb_end[];
@@ -70,8 +71,8 @@ extern u64 dt_mem_next_cell(int s, const __be32 **cellp);/* Early flat tree scan hooks */ extern int early_init_dt_scan_root (void ); -extern bool early_init_dt_scan (void *params); -extern bool early_init_dt_verify (void *params); +extern bool early_init_dt_scan (void *dt_virt,phys_addr_t dt_phys); +extern bool early_init_dt_verify (void *dt_virt,phys_addr_t dt_phys);extern void early_init_dt_scan_nodes (void );extern const char *of_flat_dt_get_machine_name (void );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 155/826 pmdomain: ti-sci: Add missing of_node_put() for args.np
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Zekun <[email protected]>
[ Upstream commit afc2331ef81657493c074592c409dac7c3cb8ccc ]
of_parse_phandle_with_args() needs to call of_node_put() to decrement the refcount of args.np. So, Add the missing of_node_put() in the loop.
Message-ID: <[email protected]>
--- drivers/pmdomain/ti/ti_sci_pm_domains.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/pmdomain/ti/ti_sci_pm_domains.c +4 -0
@@ -161,6 +161,7 @@ static int ti_sci_pm_domain_probe(struct platform_device *pdev)break ;if (args.args_count >=1 && args.np == dev->of_node) { +of_node_put (args.np);if (args.args[0 ] > max_id) { max_id = args.args[0 ]; }else {
@@ -192,7 +193,10 @@ static int ti_sci_pm_domain_probe(struct platform_device *pdev)pm_genpd_init (&pd->pd,NULL , true);list_add (&pd->node, &pd_provider->pd_list); + }else { +of_node_put (args.np); } + index++; } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 156/826 spi: tegra210-quad: Avoid shift-out-of-bounds
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit f399051ec1ff02e74ae5c2517aed2cc486fd005b ]
A shift-out-of-bounds issue was identified by UBSAN in the tegra_qspi_fill_tx_fifo_from_client_txbuf() function.
UBSAN: shift-out-of-bounds in drivers/spi/spi-tegra210-quad.c:345:27 shift exponent 32 is too large for 32-bit type 'u32' (aka 'unsigned int') Call trace: tegra_qspi_start_cpu_based_transfer
The problem arises when shifting the contents of tx_buf left by 8 times the value of i, which can exceed 4 and result in an exponent larger than 32 bits.
Resolve this by restrict the value of i to be less than 4, preventing the shift operation from overflowing.
--- drivers/spi/spi-tegra210-quad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-tegra210-quad.c +1 -1
@@ -341,7 +341,7 @@ tegra_qspi_fill_tx_fifo_from_client_txbuf(struct tegra_qspi *tqspi, struct spi_tfor (count =0 ; count < max_n_32bit; count++) {u32 x =0 ; -for (i =0 ; len && (i < bytes_per_word); i++, len--) +for (i =0 ; len && (i <min (4 , bytes_per_word)); i++, len--) x |= (u32)(*tx_buf++) << (i *8 );tegra_qspi_writel (tqspi, x,QSPI_TX_FIFO ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 157/826 spi: zynqmp-gqspi: Undo runtime PM changes at driver exit time
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 2219576883e709737f3100aa9ded84976be49bd7 ]
It's important to undo pm_runtime_use_autosuspend() with pm_runtime_dont_use_autosuspend() at driver exit time.
So, call pm_runtime_dont_use_autosuspend() at driver exit time to fix it.
--- drivers/spi/spi-zynqmp-gqspi.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/spi/spi-zynqmp-gqspi.c +2 -0
@@ -1351,6 +1351,7 @@ static int zynqmp_qspi_probe(struct platform_device *pdev) clk_dis_all:pm_runtime_disable (&pdev->dev); +pm_runtime_dont_use_autosuspend (&pdev->dev);pm_runtime_put_noidle (&pdev->dev);pm_runtime_set_suspended (&pdev->dev);clk_disable_unprepare (xqspi->refclk);
@@ -1379,6 +1380,7 @@ static void zynqmp_qspi_remove(struct platform_device *pdev)zynqmp_gqspi_write (xqspi,GQSPI_EN_OFST ,0x0 );pm_runtime_disable (&pdev->dev); +pm_runtime_dont_use_autosuspend (&pdev->dev);pm_runtime_put_noidle (&pdev->dev);pm_runtime_set_suspended (&pdev->dev);clk_disable_unprepare (xqspi->refclk);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 158/826 regmap: irq: Set lockdep class for hierarchical IRQ domains
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 953e549471cabc9d4980f1da2e9fa79f4c23da06 ]
Lockdep gives a false positive splat as it can't distinguish the lock which is taken by different IRQ descriptors from different IRQ chips that are organized in a way of a hierarchy:
======================================================
WARNING: possible circular locking dependency detected
6.12.0-rc5-next-20241101-00148-g9fabf8160b53 #562 Tainted: G W
------------------------------------------------------
modprobe/141 is trying to acquire lock:
ffff899446947868 (intel_soc_pmic_bxtwc:502:(&bxtwc_regmap_config)->lock){+.+.}-{4:4}, at: regmap_update_bits_base+0x33/0x90
but task is already holding lock:
ffff899446947c68 (&d->lock){+.+.}-{4:4}, at: __setup_irq+0x682/0x790
which lock already depends on the new lock.
-> #3 (&d->lock){+.+.}-{4:4}:
-> #2 (&desc->request_mutex){+.+.}-{4:4}:
-> #1 (ipclock){+.+.}-{4:4}:
-> #0 (intel_soc_pmic_bxtwc:502:(&bxtwc_regmap_config)->lock){+.+.}-{4:4}:
Chain exists of:
intel_soc_pmic_bxtwc:502:(&bxtwc_regmap_config)->lock --> &desc->request_mutex --> &d->lock
Possible unsafe locking scenario: CPU0 CPU1
---- ----
lock(&d->lock);
lock(&desc->request_mutex);
lock(&d->lock);
lock(intel_soc_pmic_bxtwc:502:(&bxtwc_regmap_config)->lock);
*** DEADLOCK ***3 locks held by modprobe/141:
#0: ffff8994419368f8 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xf6/0x250
#1: ffff89944690b250 (&desc->request_mutex){+.+.}-{4:4}, at: __setup_irq+0x1a2/0x790
#2: ffff899446947c68 (&d->lock){+.+.}-{4:4}, at: __setup_irq+0x682/0x790Set a lockdep class when we map the IRQ so that it doesn't warn about a lockdep bug that doesn't exist.
--- drivers/base/regmap/regmap-irq.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/base/regmap/regmap-irq.c +4 -0
@@ -514,12 +514,16 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)return IRQ_NONE ; } +static struct lock_class_key regmap_irq_lock_class; +static struct lock_class_key regmap_irq_request_class; +static int regmap_irq_map (struct irq_domain *h,unsigned int virq,irq_hw_number_t hw) {struct regmap_irq_chip_data *data = h->host_data;irq_set_chip_data (virq, data); +irq_set_lockdep_class (virq, ®map_irq_lock_class, ®map_irq_request_class);irq_set_chip (virq, &data->irq_chip);irq_set_nested_thread (virq,1 );irq_set_parent (virq, data->irq);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 159/826 arm64: dts: renesas: hihope: Drop #sound-dai-cells
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lad Prabhakar <[email protected]>
[ Upstream commit 9cc926e3fab42dd292219796cfc94e41f4ab749d ]
"#sound-dai-cells" is required if the board is using "simple-card". However, the HiHope board uses "audio-graph", thus remove the unneeded #sound-dai-cells.
Commit 9e72606cd2db ("arm64: dts: renesas: #sound-dai-cells is used when simple-card") updated the comment regarding usage of "#sound-dai-cells" in the SoC DTSI but missed to remove "#sound-dai-cells" from board DTS files.
--- arch/arm64/boot/dts/renesas/hihope-rev2.dtsi | 3 --- arch/arm64/boot/dts/renesas/hihope-rev4.dtsi | 3 --- 2 files changed, 6 deletions(-)
arch/arm64/boot/dts/renesas/hihope-rev2.dtsi +0 -3
@@ -69,9 +69,6 @@ &rcar_sound { status = "okay"; - /* Single DAI */ - #sound-dai-cells = <0>; - rsnd_port: port { rsnd_endpoint: endpoint { remote-endpoint = <&dw_hdmi0_snd_in>;
arch/arm64/boot/dts/renesas/hihope-rev4.dtsi +0 -3
@@ -84,9 +84,6 @@ &rcar_sound { pinctrl-names = "default"; status = "okay"; - /* Single DAI */ - #sound-dai-cells = <0>; - /* audio_clkout0/1/2/3 */ #clock-cells = <1>; clock-frequency = <12288000 11289600>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 160/826 arm64: dts: imx8mn-tqma8mqnl-mba8mx-usbot: fix coexistence of output-low and output-high in GPIO
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
[ Upstream commit c771d311b1901cd4679c8fc7f89a882fe07cf4a0 ]
Fix the issue where both 'output-low' and 'output-high' exist under GPIO hog nodes (rst_usb_hub_hog and sel_usb_hub_hog) when applying device tree overlays. Since /delete-property/ is not supported in the overlays, setting 'output-low' results in both properties being present. The workaround is to disable these hogs and create new ones with 'output-low' as needed.
Fix below CHECK_DTBS warning:arch/arm64/boot/dts/freescale/imx8mn-tqma8mqnl-mba8mx-usbotg.dtb: sel-usb-hub-hog:
{'output-low': True, 'gpio-hog': True, 'gpios': [[1, 0]], 'output-high': True, 'phandle': 108, '$nodename': ['sel-usb-hub-hog']}
is valid under each of {'required': ['output-low']}, {'required': ['output-high']
--- .../imx8mn-tqma8mqnl-mba8mx-usbotg.dtso | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/freescale/imx8mn-tqma8mqnl-mba8mx-usbotg.dtso +27 -2
@@ -29,12 +29,37 @@ usb_dr_connector: endpoint { }; }; +/* + * rst_usb_hub_hog and sel_usb_hub_hog have property 'output-high', + * dt overlay don't support /delete-property/. Both 'output-low' and + * 'output-high' will be exist under hog nodes if overlay file set + * 'output-low'. Workaround is disable these hog and create new hog with + * 'output-low'. + */ + &rst_usb_hub_hog { - output-low; + status = "disabled"; +}; + +&expander0 { + rst-usb-low-hub-hog { + gpio-hog; + gpios = <13 0>; + output-low; + line-name = "RST_USB_HUB#"; + }; }; &sel_usb_hub_hog { - output-low; + status = "disabled"; +}; + +&gpio2 { + sel-usb-low-hub-hog { + gpio-hog; + gpios = <1 GPIO_ACTIVE_HIGH>; + output-low; + }; }; &usbotg1 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 161/826 arm64: dts: mediatek: mt6358: fix dtbs_check error
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Macpaul Lin <[email protected]>
[ Upstream commit 76ab2ae0ab9ebb2d70e6ee8a9f59911621192c37 ]
Fix DTBS check errors for 'mt6358codec' and 'mt6358regulator':
Error message is:
pmic: 'mt6358codec' and 'mt6358regulator' does not match any of the
regexes: 'pinctrl-[0-9]+'.
Rename these two device node to generic 'audio-codec' and 'regulators'.
--- arch/arm64/boot/dts/mediatek/mt6358.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/mediatek/mt6358.dtsi +2 -2
@@ -15,12 +15,12 @@ pmic_adc: adc { #io-channel-cells = <1>; }; - mt6358codec: mt6358codec { + mt6358codec: audio-codec { compatible = "mediatek,mt6358-sound"; mediatek,dmic-mode = <0>; /* two-wires */ }; - mt6358regulator: mt6358regulator { + mt6358regulator: regulators { compatible = "mediatek,mt6358-regulator"; mt6358_vdram1_reg: buck_vdram1 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 162/826 arm64: dts: mediatek: mt8183-kukui-jacuzzi: Fix DP bridge supply names
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
[ Upstream commit c4e8cf13f1740037483565d5b802764e2426515b ]
Some of the regulator supplies for the MIPI-DPI-to-DP bridge and their associated nodes are incorrectly named. In particular, the 1.0V supply was modeled as a 1.2V supply.
Fix all the incorrect names, and also fix the voltage of the 1.0V regulator.
--- .../dts/mediatek/mt8183-kukui-jacuzzi.dtsi | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-)
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi +14 -12
@@ -8,11 +8,13 @@ #include <arm/cros-ec-keyboard.dtsi> / { - pp1200_mipibrdg: pp1200-mipibrdg { + pp1000_mipibrdg: pp1000-mipibrdg { compatible = "regulator-fixed"; - regulator-name = "pp1200_mipibrdg"; + regulator-name = "pp1000_mipibrdg"; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; pinctrl-names = "default"; - pinctrl-0 = <&pp1200_mipibrdg_en>; + pinctrl-0 = <&pp1000_mipibrdg_en>; enable-active-high; regulator-boot-on;
@@ -24,7 +26,7 @@ pp1800_mipibrdg: pp1800-mipibrdg { compatible = "regulator-fixed"; regulator-name = "pp1800_mipibrdg"; pinctrl-names = "default"; - pinctrl-0 = <&pp1800_lcd_en>; + pinctrl-0 = <&pp1800_mipibrdg_en>; enable-active-high; regulator-boot-on;
@@ -46,11 +48,11 @@ pp3300_panel: pp3300-panel { gpio = <&pio 35 GPIO_ACTIVE_HIGH>; }; - vddio_mipibrdg: vddio-mipibrdg { + pp3300_mipibrdg: pp3300-mipibrdg { compatible = "regulator-fixed"; - regulator-name = "vddio_mipibrdg"; + regulator-name = "pp3300_mipibrdg"; pinctrl-names = "default"; - pinctrl-0 = <&vddio_mipibrdg_en>; + pinctrl-0 = <&pp3300_mipibrdg_en>; enable-active-high; regulator-boot-on;
@@ -146,9 +148,9 @@ anx_bridge: anx7625@58 { pinctrl-0 = <&anx7625_pins>; enable-gpios = <&pio 45 GPIO_ACTIVE_HIGH>; reset-gpios = <&pio 73 GPIO_ACTIVE_HIGH>; - vdd10-supply = <&pp1200_mipibrdg>; + vdd10-supply = <&pp1000_mipibrdg>; vdd18-supply = <&pp1800_mipibrdg>; - vdd33-supply = <&vddio_mipibrdg>; + vdd33-supply = <&pp3300_mipibrdg>; ports { #address-cells = <1>;
@@ -391,14 +393,14 @@ &pio { "", ""; - pp1200_mipibrdg_en: pp1200-mipibrdg-en { + pp1000_mipibrdg_en: pp1000-mipibrdg-en { pins1 { pinmux = <PINMUX_GPIO54__FUNC_GPIO54>; output-low; }; }; - pp1800_lcd_en: pp1800-lcd-en { + pp1800_mipibrdg_en: pp1800-mipibrdg-en { pins1 { pinmux = <PINMUX_GPIO36__FUNC_GPIO36>; output-low;
@@ -460,7 +462,7 @@ trackpad-int { }; }; - vddio_mipibrdg_en: vddio-mipibrdg-en { + pp3300_mipibrdg_en: pp3300-mipibrdg-en { pins1 { pinmux = <PINMUX_GPIO37__FUNC_GPIO37>; output-low;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 163/826 arm64: dts: mediatek: mt8183-kukui-jacuzzi: Add supplies for fixed regulators
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
[ Upstream commit aaecb1da58a72bfbd2c35d4aadc43caa02f11862 ]
When the fixed regulators for the LCD panel and DP bridge were added, their supplies were not modeled in. These, except for the 1.0V supply, are just load switches, and need and have a supply.
Add the supplies for each of the fixed regulators.
--- arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi +4 -0
@@ -20,6 +20,7 @@ pp1000_mipibrdg: pp1000-mipibrdg { regulator-boot-on; gpio = <&pio 54 GPIO_ACTIVE_HIGH>; + vin-supply = <&pp1800_alw>; }; pp1800_mipibrdg: pp1800-mipibrdg {
@@ -32,6 +33,7 @@ pp1800_mipibrdg: pp1800-mipibrdg { regulator-boot-on; gpio = <&pio 36 GPIO_ACTIVE_HIGH>; + vin-supply = <&pp1800_alw>; }; pp3300_panel: pp3300-panel {
@@ -46,6 +48,7 @@ pp3300_panel: pp3300-panel { regulator-boot-on; gpio = <&pio 35 GPIO_ACTIVE_HIGH>; + vin-supply = <&pp3300_alw>; }; pp3300_mipibrdg: pp3300-mipibrdg {
@@ -58,6 +61,7 @@ pp3300_mipibrdg: pp3300-mipibrdg { regulator-boot-on; gpio = <&pio 37 GPIO_ACTIVE_HIGH>; + vin-supply = <&pp3300_alw>; }; volume_buttons: volume-buttons {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 164/826 selftests/resctrl: Print accurate buffer size as part of MBM results
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Reinette Chatre <[email protected]>
[ Upstream commit 1b4840395f08e9723a15fea42c2d31090e8375f3 ]
By default the MBM test uses the "fill_buf" benchmark to keep reading from a buffer with size DEFAULT_SPAN while measuring memory bandwidth. User space can provide an alternate benchmark or amend the size of the buffer "fill_buf" should use.
Analysis of the MBM measurements do not require that a buffer be used and thus do not require knowing the size of the buffer if it was used during testing. Even so, the buffer size is printed as informational as part of the MBM test results. What is printed as buffer size is hardcoded as DEFAULT_SPAN, even if the test relied on another benchmark (that may or may not use a buffer) or if user space amended the buffer size.
Ensure that accurate buffer size is printed when using "fill_buf" benchmark and omit the buffer size information if another benchmark is used.
--- tools/testing/selftests/resctrl/mbm_test.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
tools/testing/selftests/resctrl/mbm_test.c +14 -2
@@ -40,7 +40,8 @@ show_bw_info(unsigned long *bw_imc, unsigned long *bw_resc, size_t span)ksft_print_msg ("%s Check MBM diff within %d%%\n" , ret ?"Fail:" :"Pass:" ,MAX_DIFF_PERCENT );ksft_print_msg ("avg_diff_per: %d%%\n" , avg_diff_per); -ksft_print_msg ("Span (MB): %zu\n" , span /MB ); +if (span) +ksft_print_msg ("Span (MB): %zu\n" , span /MB );ksft_print_msg ("avg_bw_imc: %lu\n" , avg_bw_imc);ksft_print_msg ("avg_bw_resc: %lu\n" , avg_bw_resc);
@@ -138,15 +139,26 @@ static int mbm_run_test(const struct resctrl_test *test, const struct user_param .setup = mbm_setup, .measure = mbm_measure, }; +char *endptr =NULL ; +size_t span =0 ;int ret;remove (RESULT_FILE_NAME ); +if (uparams->benchmark_cmd[0 ] &&strcmp (uparams->benchmark_cmd[0 ],"fill_buf" ) ==0 ) { +if (uparams->benchmark_cmd[1 ] && *uparams->benchmark_cmd[1 ] !='\0' ) { + errno =0 ; + span =strtoul (uparams->benchmark_cmd[1 ], &endptr,10 ); +if (errno || *endptr !='\0' ) +return -EINVAL ; + } + } + ret =resctrl_val (test, uparams, uparams->benchmark_cmd, ¶m);if (ret)return ret; - ret =check_results (DEFAULT_SPAN ); + ret =check_results (span);if (ret && (get_vendor () ==ARCH_INTEL ))ksft_print_msg ("Intel MBM may be inaccurate when Sub-NUMA Clustering is enabled. Check BIOS configuration.\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 165/826 selftests/resctrl: Fix memory overflow due to unhandled wraparound
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Reinette Chatre <[email protected]>
[ Upstream commit caf02626b2bf164a02c808240f19dbf97aced664 ]
alloc_buffer() allocates and initializes (with random data) a buffer of requested size. The initialization starts from the beginning of the allocated buffer and incrementally assigns sizeof(uint64_t) random data to each cache line. The initialization uses the size of the buffer to control the initialization flow, decrementing the amount of buffer needing to be initialized after each iteration.
The size of the buffer is stored in an unsigned (size_t) variable s64 and the test "s64 > 0" is used to decide if initialization is complete. The problem is that decrementing the buffer size may wrap around if the buffer size is not divisible by "CL_SIZE / sizeof(uint64_t)" resulting in the "s64 > 0" test being true and memory beyond the buffer "initialized".
Use a signed value for the buffer size to support all buffer sizes.
--- tools/testing/selftests/resctrl/fill_buf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/resctrl/fill_buf.c +1 -1
@@ -127,7 +127,7 @@ unsigned char *alloc_buffer(size_t buf_size, int memflush) {void *buf =NULL ;uint64_t *p64; -size_t s64; +ssize_t s64;int ret; ret =posix_memalign (&buf,PAGE_SIZE , buf_size);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 166/826 selftests/resctrl: Protect against array overrun during iMC config parsing
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Reinette Chatre <[email protected]>
[ Upstream commit 48ed4e799e8fbebae838dca404a8527763d41191 ]
The MBM and MBA tests need to discover the event and umask with which to configure the performance event used to measure read memory bandwidth. This is done by parsing the /sys/bus/event_source/devices/uncore_imc_<imc instance>/events/cas_count_read file for each iMC instance that contains the formatted
output: "event=<event>,umask=<umask>"
Parsing of cas_count_read contents is done by initializing an array of MAX_TOKENS elements with tokens (deliminated by "=,") from this file. Remove the unnecessary append of a delimiter to the string needing to be parsed. Per the strtok() man page: "delimiter bytes at the start or end of the string are ignored". This has no impact on the token placement within the array.
After initialization, the actual event and umask is determined by parsing the tokens directly following the "event" and "umask" tokens respectively.
Iterating through the array up to index "i < MAX_TOKENS" but then accessing index "i + 1" risks array overrun during the final iteration. Avoid array overrun by ensuring that the index used within for loop will always be valid.
--- tools/testing/selftests/resctrl/resctrl_val.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
tools/testing/selftests/resctrl/resctrl_val.c +1 -2
@@ -83,13 +83,12 @@ void get_event_and_umask(char *cas_count_cfg, int count, bool op)char *token[MAX_TOKENS ];int i =0 ; -strcat (cas_count_cfg,"," ); token[0 ] =strtok (cas_count_cfg,"=," );for (i =1 ; i <MAX_TOKENS ; i++) token[i] =strtok (NULL ,"=," ); -for (i =0 ; i <MAX_TOKENS ; i++) { +for (i =0 ; i <MAX_TOKENS -1 ; i++) {if (!token[i])break ;if (strcmp (token[i],"event" ) ==0 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 167/826 firmware: arm_scpi: Check the DVFS OPP count returned by the firmware
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luo Qiu <[email protected]>
[ Upstream commit 109aa654f85c5141e813b2cd1bd36d90be678407 ]
Fix a kernel crash with the below call trace when the SCPI firmware returns OPP count of zero.
dvfs_info.opp_count may be zero on some platforms during the reboot test, and the kernel will crash after dereferencing the pointer to kcalloc(info->count, sizeof(*opp), GFP_KERNEL).
| Unable to handle kernel NULL pointer dereference at virtual address 0000000000000028 | Mem abort info: | ESR = 0x96000004 | Exception class = DABT (current EL), IL = 32 bits | SET = 0, FnV = 0 | EA = 0, S1PTW = 0 | Data abort info: | ISV = 0, ISS = 0x00000004 | CM = 0, WnR = 0 | user pgtable: 4k pages, 48-bit VAs, pgdp = 00000000faefa08c | [0000000000000028] pgd=0000000000000000 | Internal error: Oops: 96000004 [#1] SMP | scpi-hwmon: probe of PHYT000D:00 failed with error -110 | Process systemd-udevd (pid: 1701, stack limit = 0x00000000aaede86c) | CPU: 2 PID: 1701 Comm: systemd-udevd Not tainted 4.19.90+ #1 | Hardware name: PHYTIUM LTD Phytium FT2000/4/Phytium FT2000/4, BIOS | pstate: 60000005 (nZCv daif -PAN -UAO) | pc : scpi_dvfs_recalc_rate+0x40/0x58 [clk_scpi] | lr : clk_register+0x438/0x720 | Call trace: | scpi_dvfs_recalc_rate+0x40/0x58 [clk_scpi] | devm_clk_hw_register+0x50/0xa0 | scpi_clk_ops_init.isra.2+0xa0/0x138 [clk_scpi] | scpi_clocks_probe+0x528/0x70c [clk_scpi] | platform_drv_probe+0x58/0xa8 | really_probe+0x260/0x3d0 | driver_probe_device+0x12c/0x148 | device_driver_attach+0x74/0x98 | __driver_attach+0xb4/0xe8 | bus_for_each_dev+0x88/0xe0 | driver_attach+0x30/0x40 | bus_add_driver+0x178/0x2b0 | driver_register+0x64/0x118 | __platform_driver_register+0x54/0x60 | scpi_clocks_driver_init+0x24/0x1000 [clk_scpi] | do_one_initcall+0x54/0x220 | do_init_module+0x54/0x1c8 | load_module+0x14a4/0x1668 | __se_sys_finit_module+0xf8/0x110 | __arm64_sys_finit_module+0x24/0x30 | el0_svc_common+0x78/0x170 | el0_svc_handler+0x38/0x78 | el0_svc+0x8/0x340 | Code: 937d7c00 a94153f3 a8c27bfd f9400421 (b8606820) | ---[ end trace 06feb22469d89fa8 ]--- | Kernel panic - not syncing: Fatal exception | SMP: stopping secondary CPUs | Kernel Offset: disabled | CPU features: 0x10,a0002008 | Memory Limit: none
Message-Id: <[email protected]>
--- drivers/firmware/arm_scpi.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/firmware/arm_scpi.c +3 -0
@@ -630,6 +630,9 @@ static struct scpi_dvfs_info *scpi_dvfs_get_info(u8 domain)if (ret)return ERR_PTR (ret); +if (!buf.opp_count) +return ERR_PTR (-ENOENT ); + info =kmalloc (sizeof (*info),GFP_KERNEL );if (!info)return ERR_PTR (-ENOMEM );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 168/826 media: ipu6: Fix DMA and physical address debugging messages for 32-bit
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sakari Ailus <[email protected]>
[ Upstream commit 199c204bcc732ec18dbaec2b9d6445addbd376ea ]
Fix printing DMA and physical address printing on 32-bit platforms, by using correct types. Also cast DMA_BIT_MASK() result to dma_addr_t to make Clang happy.
Stable-dep-of: daabc5c64703 ("media: ipu6: not override the dma_ops of device in driver")
--- drivers/media/pci/intel/ipu6/ipu6-dma.c | 7 ++++--- drivers/media/pci/intel/ipu6/ipu6-mmu.c | 28 +++++++++++++++---------- 2 files changed, 21 insertions(+), 14 deletions(-)
drivers/media/pci/intel/ipu6/ipu6-dma.c +4 -3
@@ -428,11 +428,12 @@ static int ipu6_dma_map_sg(struct device *dev, struct scatterlist *sglist, iova_addr = iova->pfn_lo;for_each_sg (sglist, sg, count, i) { +phys_addr_t iova_pa;int ret; -dev_dbg (dev,"mapping entry %d: iova 0x%llx phy %pad size %d\n" , - i,PFN_PHYS (iova_addr), &sg_dma_address (sg), -sg_dma_len (sg)); + iova_pa =PFN_PHYS (iova_addr); +dev_dbg (dev,"mapping entry %d: iova %pap phy %pap size %d\n" , + i, &iova_pa, &sg_dma_address (sg),sg_dma_len (sg)); ret = ipu6_mmu_map(mmu->dmap->mmu_info, PFN_PHYS(iova_addr), sg_dma_address(sg),
drivers/media/pci/intel/ipu6/ipu6-mmu.c +17 -11
@@ -97,13 +97,15 @@ static void page_table_dump(struct ipu6_mmu_info *mmu_info)for (l1_idx =0 ; l1_idx <ISP_L1PT_PTES ; l1_idx++) {u32 l2_idx;u32 iova = (phys_addr_t )l1_idx <<ISP_L1PT_SHIFT ; +phys_addr_t l2_phys;if (mmu_info->l1_pt[l1_idx] == mmu_info->dummy_l2_pteval)continue ; + + l2_phys = TBL_PHYS_ADDR(mmu_info->l1_pt[l1_idx];)dev_dbg (mmu_info->dev, -"l1 entry %u; iovas 0x%8.8x-0x%8.8x, at %pa\n" , - l1_idx, iova, iova +ISP_PAGE_SIZE , -TBL_PHYS_ADDR (mmu_info->l1_pt[l1_idx])); +"l1 entry %u; iovas 0x%8.8x-0x%8.8x, at %pap\n" , + l1_idx, iova, iova +ISP_PAGE_SIZE , &l2_phys);for (l2_idx =0 ; l2_idx <ISP_L2PT_PTES ; l2_idx++) {u32 *l2_pt = mmu_info->l2_pts[l1_idx];
@@ -227,7 +229,7 @@ static u32 *alloc_l1_pt(struct ipu6_mmu_info *mmu_info) } mmu_info->l1_pt_dma = dma >>ISP_PADDR_SHIFT ; -dev_dbg (mmu_info->dev,"l1 pt %p mapped at %llx\n" , pt, dma); +dev_dbg (mmu_info->dev,"l1 pt %p mapped at %pad\n" , pt, &dma);return pt;
@@ -330,8 +332,8 @@ static int __ipu6_mmu_map(struct ipu6_mmu_info *mmu_info, unsigned long iova,u32 iova_end =ALIGN (iova + size,ISP_PAGE_SIZE );dev_dbg (mmu_info->dev, -"mapping iova 0x%8.8x--0x%8.8x, size %zu at paddr 0x%10.10llx\n" , - iova_start, iova_end, size, paddr); +"mapping iova 0x%8.8x--0x%8.8x, size %zu at paddr %pap\n" , + iova_start, iova_end, size, &paddr);return l2_map (mmu_info, iova_start, paddr, size); }
@@ -361,10 +363,13 @@ static size_t l2_unmap(struct ipu6_mmu_info *mmu_info, unsigned long iova,for (l2_idx = (iova_start &ISP_L2PT_MASK ) >>ISP_L2PT_SHIFT ; (iova_start &ISP_L1PT_MASK ) + (l2_idx <<ISP_PAGE_SHIFT ) < iova_start + size && l2_idx <ISP_L2PT_PTES ; l2_idx++) { +phys_addr_t pteval; + l2_pt = mmu_info->l2_pts[l1_idx]; + pteval =TBL_PHYS_ADDR (l2_pt[l2_idx]);dev_dbg (mmu_info->dev, -"unmap l2 index %u with pteval 0x%10.10llx\n" , - l2_idx,TBL_PHYS_ADDR (l2_pt[l2_idx])); +"unmap l2 index %u with pteval 0x%p\n" , + l2_idx, &pteval); l2_pt[l2_idx] = mmu_info->dummy_page_pteval; clflush_cache_range((void *)&l2_pt[l2_idx],
@@ -525,9 +530,10 @@ static struct ipu6_mmu_info *ipu6_mmu_alloc(struct ipu6_device *isp)return NULL ; mmu_info->aperture_start =0 ; - mmu_info->aperture_end =DMA_BIT_MASK (isp->secure_mode ? -IPU6_MMU_ADDR_BITS : -IPU6_MMU_ADDR_BITS_NON_SECURE ); + mmu_info->aperture_end = + (dma_addr_t )DMA_BIT_MASK (isp->secure_mode ? +IPU6_MMU_ADDR_BITS : +IPU6_MMU_ADDR_BITS_NON_SECURE ); mmu_info->pgsize_bitmap =SZ_4K ; mmu_info->dev = &isp->pdev->dev;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 169/826 media: ipu6: not override the dma_ops of device in driver
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bingbu Cao <[email protected]>
[ Upstream commit daabc5c64703432c4a8798421a3588c2c142c51b ]
DMA ops are a helper for architectures and not for drivers to override the DMA implementation. Driver should not override the DMA implementation.
This patch removes the dma_ops override from auxiliary device and adds driver-internal helpers that use the actual DMA mapping APIs.
--- drivers/media/pci/intel/ipu6/ipu6-bus.c | 6 - drivers/media/pci/intel/ipu6/ipu6-buttress.c | 21 +- drivers/media/pci/intel/ipu6/ipu6-cpd.c | 18 +- drivers/media/pci/intel/ipu6/ipu6-dma.c | 195 +++++++++---------- drivers/media/pci/intel/ipu6/ipu6-dma.h | 34 +++- drivers/media/pci/intel/ipu6/ipu6-fw-com.c | 14 +- 6 files changed, 156 insertions(+), 132 deletions(-)
drivers/media/pci/intel/ipu6/ipu6-bus.c +0 -6
@@ -94,8 +94,6 @@ ipu6_bus_initialize_device(struct pci_dev *pdev, struct device *parent,if (!adev)return ERR_PTR (-ENOMEM ); - adev->dma_mask =DMA_BIT_MASK (isp->secure_mode ?IPU6_MMU_ADDR_BITS : -IPU6_MMU_ADDR_BITS_NON_SECURE ); adev->isp = isp; adev->ctrl = ctrl; adev->pdata = pdata;
@@ -106,10 +104,6 @@ ipu6_bus_initialize_device(struct pci_dev *pdev, struct device *parent, auxdev->dev.parent = parent; auxdev->dev.release = ipu6_bus_release; - auxdev->dev.dma_ops = &ipu6_dma_ops; - auxdev->dev.dma_mask = &adev->dma_mask; - auxdev->dev.dma_parms = pdev->dev.dma_parms; - auxdev->dev.coherent_dma_mask = adev->dma_mask; ret =auxiliary_device_init (auxdev);if (ret <0 ) {
drivers/media/pci/intel/ipu6/ipu6-buttress.c +16 -5
@@ -24,6 +24,7 @@#include "ipu6.h" #include "ipu6-bus.h" +#include "ipu6-dma.h" #include "ipu6-buttress.h" #include "ipu6-platform-buttress-regs.h"
@@ -553,6 +554,7 @@ int ipu6_buttress_map_fw_image(struct ipu6_bus_device *sys, const struct firmware *fw, struct sg_table *sgt) { bool is_vmalloc = is_vmalloc_addr(fw->data); +struct pci_dev *pdev = sys->isp->pdev;struct page **pages;const void *addr;unsigned long n_pages;
@@ -588,14 +590,20 @@ int ipu6_buttress_map_fw_image(struct ipu6_bus_device *sys, goto out; } - ret =dma_map_sgtable (&sys->auxdev.dev, sgt,DMA_TO_DEVICE ,0 ); -if (ret <0 ) { - ret = -ENOMEM ; + ret =dma_map_sgtable (&pdev->dev, sgt,DMA_TO_DEVICE ,0 ); +if (ret) { +sg_free_table (sgt); + goto out; + } + + ret =ipu6_dma_map_sgtable (sys, sgt,DMA_TO_DEVICE ,0 ); +if (ret) { +dma_unmap_sgtable (&pdev->dev, sgt,DMA_TO_DEVICE ,0 );sg_free_table (sgt); goto out; } -dma_sync_sgtable_for_device (&sys->auxdev.dev, sgt,DMA_TO_DEVICE ); +ipu6_dma_sync_sgtable (sys, sgt); out:kfree (pages);
@@ -607,7 +615,10 @@ EXPORT_SYMBOL_NS_GPL(ipu6_buttress_map_fw_image, INTEL_IPU6);void ipu6_buttress_unmap_fw_image (struct ipu6_bus_device *sys,struct sg_table *sgt) { -dma_unmap_sgtable (&sys->auxdev.dev, sgt,DMA_TO_DEVICE ,0 ); +struct pci_dev *pdev = sys->isp->pdev; + +ipu6_dma_unmap_sgtable (sys, sgt,DMA_TO_DEVICE ,0 ); +dma_unmap_sgtable (&pdev->dev, sgt,DMA_TO_DEVICE ,0 );sg_free_table (sgt); }EXPORT_SYMBOL_NS_GPL (ipu6_buttress_unmap_fw_image,INTEL_IPU6 );
drivers/media/pci/intel/ipu6/ipu6-cpd.c +9 -9
@@ -15,6 +15,7 @@#include "ipu6.h" #include "ipu6-bus.h" #include "ipu6-cpd.h" +#include "ipu6-dma.h" /* 15 entries + header*/ #define MAX_PKG_DIR_ENT_CNT 16
@@ -162,7 +163,6 @@ int ipu6_cpd_create_pkg_dir(struct ipu6_bus_device *adev, const void *src) {dma_addr_t dma_addr_src =sg_dma_address (adev->fw_sgt.sgl);const struct ipu6_cpd_ent *ent, *man_ent, *met_ent; -struct device *dev = &adev->auxdev.dev;struct ipu6_device *isp = adev->isp;unsigned int man_sz, met_sz;void *pkg_dir_pos;
@@ -175,8 +175,8 @@ int ipu6_cpd_create_pkg_dir(struct ipu6_bus_device *adev, const void *src) met_sz = met_ent->len; adev->pkg_dir_size =PKG_DIR_SIZE + man_sz + met_sz; - adev->pkg_dir =dma_alloc_attrs (dev, adev->pkg_dir_size, - &adev->pkg_dir_dma_addr,GFP_KERNEL ,0 ); + adev->pkg_dir =ipu6_dma_alloc (adev, adev->pkg_dir_size, + &adev->pkg_dir_dma_addr,GFP_KERNEL ,0 );if (!adev->pkg_dir)return -ENOMEM ;
@@ -198,8 +198,8 @@ int ipu6_cpd_create_pkg_dir(struct ipu6_bus_device *adev, const void *src) met_ent->len);if (ret) {dev_err (&isp->pdev->dev,"Failed to parse module data\n" ); -dma_free_attrs (dev, adev->pkg_dir_size, - adev->pkg_dir, adev->pkg_dir_dma_addr,0 ); +ipu6_dma_free (adev, adev->pkg_dir_size, + adev->pkg_dir, adev->pkg_dir_dma_addr,0 );return ret; }
@@ -211,8 +211,8 @@ int ipu6_cpd_create_pkg_dir(struct ipu6_bus_device *adev, const void *src) pkg_dir_pos += man_sz;memcpy (pkg_dir_pos, src + met_ent->offset, met_sz); -dma_sync_single_range_for_device (dev, adev->pkg_dir_dma_addr, -0 , adev->pkg_dir_size,DMA_TO_DEVICE ); +ipu6_dma_sync_single (adev, adev->pkg_dir_dma_addr, + adev->pkg_dir_size);return 0 ; }
@@ -220,8 +220,8 @@ EXPORT_SYMBOL_NS_GPL(ipu6_cpd_create_pkg_dir, INTEL_IPU6);void ipu6_cpd_free_pkg_dir (struct ipu6_bus_device *adev) { -dma_free_attrs (&adev->auxdev.dev, adev->pkg_dir_size, adev->pkg_dir, - adev->pkg_dir_dma_addr,0 ); +ipu6_dma_free (adev, adev->pkg_dir_size, adev->pkg_dir, + adev->pkg_dir_dma_addr,0 ); }EXPORT_SYMBOL_NS_GPL (ipu6_cpd_free_pkg_dir,INTEL_IPU6 );
drivers/media/pci/intel/ipu6/ipu6-dma.c +92 -103
357 lines not on this page · raw message
drivers/media/pci/intel/ipu6/ipu6-dma.h +32 -2
@@ -5,7 +5,13 @@#define IPU6_DMA_H #include <linux/dma-map-ops.h> +#include <linux/dma-mapping.h> #include <linux/iova.h> +#include <linux/iova.h> +#include <linux/scatterlist.h> +#include <linux/types.h> + +#include "ipu6-bus.h" struct ipu6_mmu_info ;
@@ -14,6 +20,30 @@ struct ipu6_dma_mapping {struct iova_domain iovad; }; -extern const struct dma_map_ops ipu6_dma_ops; - +void ipu6_dma_sync_single (struct ipu6_bus_device *sys,dma_addr_t dma_handle, +size_t size); +void ipu6_dma_sync_sg (struct ipu6_bus_device *sys,struct scatterlist *sglist, +int nents); +void ipu6_dma_sync_sgtable (struct ipu6_bus_device *sys,struct sg_table *sgt); +void *ipu6_dma_alloc (struct ipu6_bus_device *sys,size_t size, +dma_addr_t *dma_handle,gfp_t gfp, +unsigned long attrs); +void ipu6_dma_free (struct ipu6_bus_device *sys,size_t size,void *vaddr, +dma_addr_t dma_handle,unsigned long attrs); +int ipu6_dma_mmap (struct ipu6_bus_device *sys,struct vm_area_struct *vma, +void *addr,dma_addr_t iova,size_t size, +unsigned long attrs); +int ipu6_dma_map_sg (struct ipu6_bus_device *sys,struct scatterlist *sglist, +int nents,enum dma_data_direction dir, +unsigned long attrs); +void ipu6_dma_unmap_sg (struct ipu6_bus_device *sys,struct scatterlist *sglist, +int nents,enum dma_data_direction dir, +unsigned long attrs); +int ipu6_dma_map_sgtable (struct ipu6_bus_device *sys,struct sg_table *sgt, +enum dma_data_direction dir,unsigned long attrs); +void ipu6_dma_unmap_sgtable (struct ipu6_bus_device *sys,struct sg_table *sgt, +enum dma_data_direction dir,unsigned long attrs); +int ipu6_dma_get_sgtable (struct ipu6_bus_device *sys,struct sg_table *sgt, +void *cpu_addr,dma_addr_t handle,size_t size, +unsigned long attrs);#endif /* IPU6_DMA_H */
drivers/media/pci/intel/ipu6/ipu6-fw-com.c +7 -7
@@ -12,6 +12,7 @@#include <linux/types.h> #include "ipu6-bus.h" +#include "ipu6-dma.h" #include "ipu6-fw-com.h" /*
@@ -88,7 +89,6 @@ struct ipu6_fw_com_context {void *dma_buffer;dma_addr_t dma_addr;unsigned int dma_size; -unsigned long attrs;struct ipu6_fw_sys_queue *input_queue;/* array of host to SP queues */ struct ipu6_fw_sys_queue *output_queue;/* array of SP to host */
@@ -164,7 +164,6 @@ void *ipu6_fw_com_prepare(struct ipu6_fw_com_cfg *cfg,struct ipu6_fw_com_context *ctx;struct device *dev = &adev->auxdev.dev;size_t sizeall, offset; -unsigned long attrs =0 ;void *specific_host_addr;unsigned int i;
@@ -206,9 +205,8 @@ void *ipu6_fw_com_prepare(struct ipu6_fw_com_cfg *cfg, sizeall += sizeinput + sizeoutput; - ctx->dma_buffer =dma_alloc_attrs (dev, sizeall, &ctx->dma_addr, -GFP_KERNEL , attrs); - ctx->attrs = attrs; + ctx->dma_buffer =ipu6_dma_alloc (adev, sizeall, &ctx->dma_addr, +GFP_KERNEL ,0 );if (!ctx->dma_buffer) {dev_err (dev,"failed to allocate dma memory\n" );kfree (ctx);
@@ -239,6 +237,8 @@ void *ipu6_fw_com_prepare(struct ipu6_fw_com_cfg *cfg,memcpy (specific_host_addr, cfg->specific_addr, cfg->specific_size); +ipu6_dma_sync_single (adev, ctx->config_vied_addr, sizeall); +/* initialize input queues */ offset += specific_size; res.reg =SYSCOM_QPR_BASE_REG ;
@@ -315,8 +315,8 @@ int ipu6_fw_com_release(struct ipu6_fw_com_context *ctx, unsigned int force)if (!force && !ctx->cell_ready (ctx->adev))return -EBUSY ; -dma_free_attrs (&ctx->adev->auxdev.dev, ctx->dma_size, - ctx->dma_buffer, ctx->dma_addr, ctx->attrs); +ipu6_dma_free (ctx->adev, ctx->dma_size, + ctx->dma_buffer, ctx->dma_addr,0 );kfree (ctx);return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 170/826 media: ipu6: remove architecture DMA ops dependency in Kconfig
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bingbu Cao <[email protected]>
[ Upstream commit c8e9120c2065868d97e9e94bceee777e5db08c3e ]
IPU6 driver doesn't override the dma_ops of device now, it doesn't depends on the ARCH_HAS_DMA_OPS, so remove the dependency in Kconfig.
--- drivers/media/pci/intel/ipu6/Kconfig | 6 ------ 1 file changed, 6 deletions(-)
drivers/media/pci/intel/ipu6/Kconfig +0 -6
@@ -4,12 +4,6 @@ config VIDEO_INTEL_IPU6 depends on VIDEO_DEV depends on X86 && X86_64 && HAS_DMA depends on IPU_BRIDGE || !IPU_BRIDGE - # - # This driver incorrectly tries to override the dma_ops. It should - # never have done that, but for now keep it working on architectures - # that use dma ops - # - depends on ARCH_HAS_DMA_OPS select AUXILIARY_BUS select IOMMU_IOVA select VIDEO_V4L2_SUBDEV_API
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 171/826 media: venus: fix enc/dec destruction order
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Senozhatsky <[email protected]>
[ Upstream commit 6c9934c5a00ae722a98d1a06ed44b673514407b5 ]
We destroy mutex-es too early as they are still taken in v4l2_fh_exit()->v4l2_event_unsubscribe()->v4l2_ctrl_find().
We should destroy mutex-es right before kfree(). Also do not vdec_ctrl_deinit() before v4l2_fh_exit().
--- drivers/media/platform/qcom/venus/vdec.c | 7 ++++--- drivers/media/platform/qcom/venus/venc.c | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-)
drivers/media/platform/qcom/venus/vdec.c +4 -3
@@ -1750,13 +1750,14 @@ static int vdec_close(struct file *file)cancel_work_sync (&inst->delayed_process_work);v4l2_m2m_ctx_release (inst->m2m_ctx);v4l2_m2m_release (inst->m2m_dev); -vdec_ctrl_deinit (inst);ida_destroy (&inst->dpb_ids);hfi_session_destroy (inst); -mutex_destroy (&inst->lock); -mutex_destroy (&inst->ctx_q_lock);v4l2_fh_del (&inst->fh);v4l2_fh_exit (&inst->fh); +vdec_ctrl_deinit (inst); + +mutex_destroy (&inst->lock); +mutex_destroy (&inst->ctx_q_lock);vdec_pm_put (inst, false);
drivers/media/platform/qcom/venus/venc.c +3 -3
@@ -1517,14 +1517,14 @@ static int venc_close(struct file *file)v4l2_m2m_ctx_release (inst->m2m_ctx);v4l2_m2m_release (inst->m2m_dev); -venc_ctrl_deinit (inst);hfi_session_destroy (inst); -mutex_destroy (&inst->lock); -mutex_destroy (&inst->ctx_q_lock);v4l2_fh_del (&inst->fh);v4l2_fh_exit (&inst->fh); +venc_ctrl_deinit (inst); inst->enc_state =VENUS_ENC_STATE_DEINIT ; +mutex_destroy (&inst->lock); +mutex_destroy (&inst->ctx_q_lock);venc_pm_put (inst, false);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 172/826 media: venus: sync with threaded IRQ during inst destruction
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Senozhatsky <[email protected]>
[ Upstream commit 45b1a1b348ec178a599323f1ce7d7932aea8c6d4 ]
When destroying an inst we should make sure that we don't race against threaded IRQ (or pending IRQ), otherwise we can concurrently kfree() inst context and inst itself.
BUG: KASAN: slab-use-after-free in vb2_queue_error+0x80/0x90 Call trace: dump_backtrace+0x1c4/0x1f8 show_stack+0x38/0x60 dump_stack_lvl+0x168/0x1f0 print_report+0x170/0x4c8 kasan_report+0x94/0xd0 __asan_report_load2_noabort+0x20/0x30 vb2_queue_error+0x80/0x90 venus_helper_vb2_queue_error+0x54/0x78 venc_event_notify+0xec/0x158 hfi_event_notify+0x878/0xd20 hfi_process_msg_packet+0x27c/0x4e0 venus_isr_thread+0x258/0x6e8 hfi_isr_thread+0x70/0x90 venus_isr_thread+0x34/0x50 irq_thread_fn+0x88/0x130 irq_thread+0x160/0x2c0 kthread+0x294/0x328 ret_from_fork+0x10/0x20 Allocated by task 20291: kasan_set_track+0x4c/0x80 kasan_save_alloc_info+0x28/0x38 __kasan_kmalloc+0x84/0xa0 kmalloc_trace+0x7c/0x98 v4l2_m2m_ctx_init+0x74/0x280 venc_open+0x444/0x6d0 v4l2_open+0x19c/0x2a0 chrdev_open+0x374/0x3f0 do_dentry_open+0x710/0x10a8 vfs_open+0x88/0xa8 path_openat+0x1e6c/0x2700 do_filp_open+0x1a4/0x2e0 do_sys_openat2+0xe8/0x508 do_sys_open+0x15c/0x1a0 __arm64_sys_openat+0xa8/0xc8 invoke_syscall+0xdc/0x270 el0_svc_common+0x1ec/0x250 do_el0_svc+0x54/0x70 el0_svc+0x50/0xe8 el0t_64_sync_handler+0x48/0x120 el0t_64_sync+0x1a8/0x1b0 Freed by task 20291: kasan_set_track+0x4c/0x80 kasan_save_free_info+0x3c/0x60 ____kasan_slab_free+0x124/0x1a0 __kasan_slab_free+0x18/0x28 __kmem_cache_free+0x134/0x300 kfree+0xc8/0x1a8 v4l2_m2m_ctx_release+0x44/0x60 venc_close+0x78/0x130 [venus_enc] v4l2_release+0x20c/0x2f8 __fput+0x328/0x7f0 ____fput+0x2c/0x48 task_work_run+0x1e0/0x280 get_signal+0xfb8/0x1190 do_notify_resume+0x34c/0x16a8 el0_svc+0x9c/0xe8 el0t_64_sync_handler+0x48/0x120 el0t_64_sync+0x1a8/0x1b0
Rearrange inst destruction. First remove the inst from the core->instances list, second synchronize IRQ/IRQ-thread to make sure that nothing else would see the inst while we take it down.
--- drivers/media/platform/qcom/venus/vdec.c | 12 +++++++++++- drivers/media/platform/qcom/venus/venc.c | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-)
drivers/media/platform/qcom/venus/vdec.c +11 -1
@@ -1748,10 +1748,20 @@ static int vdec_close(struct file *file)vdec_pm_get (inst);cancel_work_sync (&inst->delayed_process_work); +/* +* First, remove the inst from the ->instances list, so that +* to_instance() will return NULL. +*/ +hfi_session_destroy (inst); +/* +* Second, make sure we don't have IRQ/IRQ-thread currently running +* or pending execution, which would race with the inst destruction. +*/ +synchronize_irq (inst->core->irq); +v4l2_m2m_ctx_release (inst->m2m_ctx);v4l2_m2m_release (inst->m2m_dev);ida_destroy (&inst->dpb_ids); -hfi_session_destroy (inst);v4l2_fh_del (&inst->fh);v4l2_fh_exit (&inst->fh);vdec_ctrl_deinit (inst);
drivers/media/platform/qcom/venus/venc.c +11 -1
@@ -1515,9 +1515,19 @@ static int venc_close(struct file *file)venc_pm_get (inst); +/* +* First, remove the inst from the ->instances list, so that +* to_instance() will return NULL. +*/ +hfi_session_destroy (inst); +/* +* Second, make sure we don't have IRQ/IRQ-thread currently running +* or pending execution, which would race with the inst destruction. +*/ +synchronize_irq (inst->core->irq); +v4l2_m2m_ctx_release (inst->m2m_ctx);v4l2_m2m_release (inst->m2m_dev); -hfi_session_destroy (inst);v4l2_fh_del (&inst->fh);v4l2_fh_exit (&inst->fh);venc_ctrl_deinit (inst);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 173/826 pwm: Assume a disabled PWM to emit a constant inactive output
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit b2eaa1170e45dc18eb09dcc9abafbe9a7502e960 ]
Some PWM hardwares (e.g. MC33XS2410) cannot implement a zero duty cycle but can instead disable the hardware which also results in a constant inactive output.
There are some checks (enabled with CONFIG_PWM_DEBUG) to help implementing a driver without violating the normal rounding rules. Make them less strict to let above described hardware pass without warning.
--- drivers/pwm/core.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/pwm/core.c +7 -3
@@ -75,7 +75,7 @@ static void pwm_apply_debug(struct pwm_device *pwm, state->duty_cycle < state->period)dev_warn (pwmchip_parent (chip),".apply ignored .polarity\n" ); -if (state->enabled && +if (state->enabled && s2.enabled && last->polarity == state->polarity && last->period > s2.period && last->period <= state->period)
@@ -83,7 +83,11 @@ static void pwm_apply_debug(struct pwm_device *pwm,".apply didn't pick the best available period (requested: %llu, applied: %llu, possible: %llu)\n" , state->period, s2.period, last->period); -if (state->enabled && state->period < s2.period) +/* +* Rounding period up is fine only if duty_cycle is 0 then, because a +* flat line doesn't have a characteristic period. +*/ +if (state->enabled && s2.enabled && state->period < s2.period && s2.duty_cycle)dev_warn (pwmchip_parent (chip),".apply is supposed to round down period (requested: %llu, applied: %llu)\n" , state->period, s2.period);
@@ -99,7 +103,7 @@ static void pwm_apply_debug(struct pwm_device *pwm, s2.duty_cycle, s2.period, last->duty_cycle, last->period); -if (state->enabled && state->duty_cycle < s2.duty_cycle) +if (state->enabled && s2.enabled && state->duty_cycle < s2.duty_cycle) dev_warn(pwmchip_parent(chip), ".apply is supposed to round down duty_cycle (requested: %llu/%llu, applied: %llu/%llu)\n", state->duty_cycle, state->period,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 174/826 media: atomisp: Add check for rgby_data memory allocation failure
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Huafei <[email protected]>
[ Upstream commit ed61c59139509f76d3592683c90dc3fdc6e23cd6 ]
In ia_css_3a_statistics_allocate(), there is no check on the allocation result of the rgby_data memory. If rgby_data is not successfully allocated, it may trigger the assert(host_stats->rgby_data) assertion in ia_css_s3a_hmem_decode(). Adding a check to fix this potential issue.
--- drivers/staging/media/atomisp/pci/sh_css_params.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/staging/media/atomisp/pci/sh_css_params.c +2 -0
@@ -4181,6 +4181,8 @@ ia_css_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid) goto err;/* No weighted histogram, no structure, treat the histogram data as a byte dump in a byte array */ me->rgby_data =kvmalloc (sizeof_hmem (HMEM0_ID ),GFP_KERNEL ); +if (!me->rgby_data) + goto err;IA_CSS_LEAVE ("return=%p" , me);return me;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 175/826 arm64: dts: rockchip: correct analog audio name on Indiedroid Nova
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Morgan <[email protected]>
[ Upstream commit 42d85557527266804579bc5d20c101d93f6be3c6 ]
Correct the audio name for the Indiedroid Nova from rockchip,es8388-codec to rockchip,es8388. This name change corrects a kernel log error of "ASoC: driver name too long 'rockchip,es8388-codec' -> 'rockchip_es8388'".
--- arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts +1 -1
@@ -62,7 +62,7 @@ sdio_pwrseq: sdio-pwrseq { sound { compatible = "audio-graph-card"; - label = "rockchip,es8388-codec"; + label = "rockchip,es8388"; widgets = "Microphone", "Mic Jack", "Headphone", "Headphones"; routing = "LINPUT2", "Mic Jack",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 176/826 sched_ext: scx_bpf_dispatch_from_dsq_set_*() are allowed from unlocked context
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
[ Upstream commit 72b85bf6a7f6f6c38c39a1e5b04bc1da1bf5016e ]
4c30f5ce4f7a ("sched_ext: Implement scx_bpf_dispatch[_vtime]_from_dsq()") added four kfuncs for dispatching while iterating. They are allowed from the dispatch and unlocked contexts but two of the kfuncs were only added in the dispatch section. Add missing declarations in the unlocked section.
--- kernel/sched/ext.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/sched/ext.c +2 -0
@@ -6473,6 +6473,8 @@ __bpf_kfunc_end_defs(); BTF_KFUNCS_START(scx_kfunc_ids_unlocked) BTF_ID_FLAGS(func, scx_bpf_create_dsq, KF_SLEEPABLE) +BTF_ID_FLAGS(func, scx_bpf_dispatch_from_dsq_set_slice) +BTF_ID_FLAGS(func, scx_bpf_dispatch_from_dsq_set_vtime) BTF_ID_FLAGS(func, scx_bpf_dispatch_from_dsq, KF_RCU) BTF_ID_FLAGS(func, scx_bpf_dispatch_vtime_from_dsq, KF_RCU) BTF_KFUNCS_END(scx_kfunc_ids_unlocked)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 177/826 HID: hyperv: streamline driver probe to avoid devres issues
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vitaly Kuznetsov <[email protected]>
[ Upstream commit 66ef47faa90d838cda131fe1f7776456cc3b59f2 ]
It was found that unloading 'hid_hyperv' module results in a devres complaint:
...
hv_vmbus: unregistering driver hid_hyperv
------------[ cut here ]------------ WARNING: CPU: 2 PID: 3983 at drivers/base/devres.c:691 devres_release_group+0x1f2/0x2c0 ... Call Trace: <TASK> ? devres_release_group+0x1f2/0x2c0 ? __warn+0xd1/0x1c0 ? devres_release_group+0x1f2/0x2c0 ? report_bug+0x32a/0x3c0 ? handle_bug+0x53/0xa0 ? exc_invalid_op+0x18/0x50 ? asm_exc_invalid_op+0x1a/0x20 ? devres_release_group+0x1f2/0x2c0 ? devres_release_group+0x90/0x2c0 ? rcu_is_watching+0x15/0xb0 ? __pfx_devres_release_group+0x10/0x10 hid_device_remove+0xf5/0x220 device_release_driver_internal+0x371/0x540 ? klist_put+0xf3/0x170 bus_remove_device+0x1f1/0x3f0 device_del+0x33f/0x8c0 ? __pfx_device_del+0x10/0x10 ? cleanup_srcu_struct+0x337/0x500 hid_destroy_device+0xc8/0x130 mousevsc_remove+0xd2/0x1d0 [hid_hyperv] device_release_driver_internal+0x371/0x540 driver_detach+0xc5/0x180 bus_remove_driver+0x11e/0x2a0 ? __mutex_unlock_slowpath+0x160/0x5e0 vmbus_driver_unregister+0x62/0x2b0 [hv_vmbus] ...
And the issue seems to be that the corresponding devres group is not allocated. Normally, devres_open_group() is called from __hid_device_probe() but Hyper-V HID driver overrides 'hid_dev->driver' with 'mousevsc_hid_driver' stub and basically re-implements __hid_device_probe() by calling hid_parse() and hid_hw_start() but not devres_open_group(). hid_device_probe() does not call __hid_device_probe() for it. Later, when the driver is removed, hid_device_remove() calls devres_release_group() as it doesn't check whether hdev->driver was initially overridden or not.
The issue seems to be related to the commit 62c68e7cee33 ("HID: ensure timely release of driver-allocated resources") but the commit itself seems to be correct.
Fix the issue by dropping the 'hid_dev->driver' override and using hid_register_driver()/hid_unregister_driver() instead. Alternatively, it would have been possible to rely on the default handling but HID_CONNECT_DEFAULT implies HID_CONNECT_HIDRAW and it doesn't seem to work for mousevsc as-is.
--- drivers/hid/hid-hyperv.c | 58 ++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 17 deletions(-)
drivers/hid/hid-hyperv.c +41 -17
@@ -422,6 +422,25 @@ static int mousevsc_hid_raw_request(struct hid_device *hid,return 0 ; } +static int mousevsc_hid_probe (struct hid_device *hid_dev,const struct hid_device_id *id) +{ +int ret; + + ret =hid_parse (hid_dev); +if (ret) { +hid_err (hid_dev,"parse failed\n" ); +return ret; + } + + ret =hid_hw_start (hid_dev,HID_CONNECT_HIDINPUT |HID_CONNECT_HIDDEV ); +if (ret) { +hid_err (hid_dev,"hw start failed\n" ); +return ret; + } + +return 0 ; +} +static const struct hid_ll_driver mousevsc_ll_driver = { .parse = mousevsc_hid_parse, .open = mousevsc_hid_open,
@@ -431,7 +450,16 @@ static const struct hid_ll_driver mousevsc_ll_driver = { .raw_request = mousevsc_hid_raw_request, }; -static struct hid_driver mousevsc_hid_driver; +static const struct hid_device_id mousevsc_devices[] = { + {HID_DEVICE (BUS_VIRTUAL ,HID_GROUP_ANY ,0x045E ,0x0621 ) }, + { } +}; + +static struct hid_driver mousevsc_hid_driver = { + .name ="hid-hyperv" , + .id_table = mousevsc_devices, + .probe = mousevsc_hid_probe, +};static int mousevsc_probe (struct hv_device *device,const struct hv_vmbus_device_id *dev_id)
@@ -473,7 +501,6 @@ static int mousevsc_probe(struct hv_device *device, } hid_dev->ll_driver = &mousevsc_ll_driver; - hid_dev->driver = &mousevsc_hid_driver; hid_dev->bus =BUS_VIRTUAL ; hid_dev->vendor = input_dev->hid_dev_info.vendor; hid_dev->product = input_dev->hid_dev_info.product;
@@ -488,20 +515,6 @@ static int mousevsc_probe(struct hv_device *device,if (ret) goto probe_err2; - - ret =hid_parse (hid_dev); -if (ret) { -hid_err (hid_dev,"parse failed\n" ); - goto probe_err2; - } - - ret =hid_hw_start (hid_dev,HID_CONNECT_HIDINPUT |HID_CONNECT_HIDDEV ); - -if (ret) { -hid_err (hid_dev,"hw start failed\n" ); - goto probe_err2; - } -device_init_wakeup (&device->device, true); input_dev->connected = true;
@@ -579,12 +592,23 @@ static struct hv_driver mousevsc_drv = {static int __init mousevsc_init (void ) { -return vmbus_driver_register (&mousevsc_drv); +int ret; + + ret =hid_register_driver (&mousevsc_hid_driver); +if (ret) +return ret; + + ret =vmbus_driver_register (&mousevsc_drv); +if (ret) +hid_unregister_driver (&mousevsc_hid_driver); + +return ret; } static void __exit mousevsc_exit(void) {vmbus_driver_unregister (&mousevsc_drv); +hid_unregister_driver (&mousevsc_hid_driver); }MODULE_LICENSE ("GPL" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 178/826 platform/x86: asus-wmi: Fix inconsistent use of thermal policies
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit 895085ec3f2ed7a26389943729e2904df1f88dc0 ]
When changing the thermal policy using the platform profile API, a Vivobook thermal policy is stored in throttle_thermal_policy_mode.
However everywhere else a normal thermal policy is stored inside this variable, potentially confusing the platform profile.
Fix this by always storing normal thermal policy values inside throttle_thermal_policy_mode and only do the conversion when writing the thermal policy to hardware. This also fixes the order in which throttle_thermal_policy_switch_next() steps through the thermal modes on Vivobook machines.
--- drivers/platform/x86/asus-wmi.c | 64 +++++++++++---------------------- 1 file changed, 21 insertions(+), 43 deletions(-)
drivers/platform/x86/asus-wmi.c +21 -43
@@ -3696,10 +3696,28 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)/* Throttle thermal policy ****************************************************/ static int throttle_thermal_policy_write (struct asus_wmi *asus) { -u8 value = asus->throttle_thermal_policy_mode;u32 retval; +u8 value;int err; +if (asus->throttle_thermal_policy_dev ==ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO ) { +switch (asus->throttle_thermal_policy_mode) { +case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT : + value =ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO ; +break ; +case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST : + value =ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO ; +break ; +case ASUS_THROTTLE_THERMAL_POLICY_SILENT : + value =ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO ; +break ; +default : +return -EINVAL ; + } + }else { + value = asus->throttle_thermal_policy_mode; + } + err =asus_wmi_set_devstate (asus->throttle_thermal_policy_dev, value, &retval);
@@ -3804,46 +3822,6 @@ static ssize_t throttle_thermal_policy_store(struct device *dev,static DEVICE_ATTR_RW (throttle_thermal_policy);/* Platform profile ***********************************************************/ -static int asus_wmi_platform_profile_to_vivo (struct asus_wmi *asus,int mode) -{ -bool vivo; - - vivo = asus->throttle_thermal_policy_dev ==ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO ; - -if (vivo) { -switch (mode) { -case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT : -return ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO ; -case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST : -return ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO ; -case ASUS_THROTTLE_THERMAL_POLICY_SILENT : -return ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO ; - } - } - -return mode; -} - -static int asus_wmi_platform_profile_mode_from_vivo (struct asus_wmi *asus,int mode) -{ -bool vivo; - - vivo = asus->throttle_thermal_policy_dev ==ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO ; - -if (vivo) { -switch (mode) { -case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO : -return ASUS_THROTTLE_THERMAL_POLICY_DEFAULT ; -case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO : -return ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST ; -case ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO : -return ASUS_THROTTLE_THERMAL_POLICY_SILENT ; - } - } - -return mode; -} -static int asus_wmi_platform_profile_get (struct platform_profile_handler *pprof,enum platform_profile_option *profile) {
@@ -3853,7 +3831,7 @@ static int asus_wmi_platform_profile_get(struct platform_profile_handler *pprof, asus = container_of(pprof, struct asus_wmi, platform_profile_handler); tp = asus->throttle_thermal_policy_mode; -switch (asus_wmi_platform_profile_mode_from_vivo (asus, tp)) { +switch (tp) {case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT : *profile =PLATFORM_PROFILE_BALANCED ;break ;
@@ -3892,7 +3870,7 @@ static int asus_wmi_platform_profile_set(struct platform_profile_handler *pprof,return -EOPNOTSUPP ; } - asus->throttle_thermal_policy_mode =asus_wmi_platform_profile_to_vivo (asus, tp); + asus->throttle_thermal_policy_mode = tp;return throttle_thermal_policy_write (asus); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 179/826 platform/x86/intel/pmt: allow user offset for PMT callbacks
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael J. Ruhl <[email protected]>
[ Upstream commit 0c32840763b1579c923b4216c18bb756ca4ba473 ]
Usage of the telem sysfs file allows for partial reads at an offset. The current callback method returns the buffer starting from offset 0 only.
Include the requested offset in the callback and update the necessary address calculations with the offset.
Note: offset addition is moved from the caller to the local usage. For non-callback usage this is unchanged behavior.
--- drivers/platform/x86/intel/pmt/class.c | 8 +++++--- drivers/platform/x86/intel/pmt/class.h | 2 +- drivers/platform/x86/intel/pmt/telemetry.c | 2 +- include/linux/intel_vsec.h | 3 ++- 4 files changed, 9 insertions(+), 6 deletions(-)
drivers/platform/x86/intel/pmt/class.c +5 -3
@@ -59,10 +59,12 @@ pmt_memcpy64_fromio(void *to, const u64 __iomem *from, size_t count) }int pmt_telem_read_mmio (struct pci_dev *pdev,struct pmt_callbacks *cb,u32 guid,void *buf, -void __iomem *addr,u32 count) +void __iomem *addr,loff_t off,u32 count) {if (cb && cb->read_telem) -return cb->read_telem (pdev, guid, buf, count); +return cb->read_telem (pdev, guid, buf, off, count); + + addr += off;if (guid ==GUID_SPR_PUNIT )/* PUNIT on SPR only supports aligned 64-bit read */
@@ -96,7 +98,7 @@ intel_pmt_read(struct file *filp, struct kobject *kobj, count = entry->size - off; count =pmt_telem_read_mmio (entry->ep->pcidev, entry->cb, entry->header.guid, buf, - entry->base + off, count); + entry->base, off, count);return count; }
drivers/platform/x86/intel/pmt/class.h +1 -1
@@ -62,7 +62,7 @@ struct intel_pmt_namespace { };int pmt_telem_read_mmio (struct pci_dev *pdev,struct pmt_callbacks *cb,u32 guid,void *buf, -void __iomem *addr,u32 count); +void __iomem *addr,loff_t off,u32 count);bool intel_pmt_is_early_client_hw (struct device *dev); int intel_pmt_dev_create(struct intel_pmt_entry *entry, struct intel_pmt_namespace *ns,
drivers/platform/x86/intel/pmt/telemetry.c +1 -1
@@ -219,7 +219,7 @@ int pmt_telem_read(struct telem_endpoint *ep, u32 id, u64 *data, u32 count)if (offset +NUM_BYTES_QWORD (count) > size)return -EINVAL ; -pmt_telem_read_mmio (ep->pcidev, ep->cb, ep->header.guid, data, ep->base + offset, +pmt_telem_read_mmio (ep->pcidev, ep->cb, ep->header.guid, data, ep->base, offset,NUM_BYTES_QWORD (count));return ep->present ?0 : -EPIPE ;
include/linux/intel_vsec.h +2 -1
@@ -74,10 +74,11 @@ enum intel_vsec_quirks {* @pdev: PCI device reference for the callback's use * @guid: ID of data to acccss * @data: buffer for the data to be copied +* @off: offset into the requested buffer * @count: size of buffer */ struct pmt_callbacks { -int (*read_telem)(struct pci_dev *pdev,u32 guid,u64 *data,u32 count); +int (*read_telem)(struct pci_dev *pdev,u32 guid,u64 *data,loff_t off,u32 count); };/**
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 180/826 platform/x86: panasonic-laptop: Return errno correctly in show callback
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yao Zi <[email protected]>
[ Upstream commit 5c7bebc1a3f0661db558d60e14dde27fc216d9dc ]
When an error occurs in sysfs show callback, we should return the errno directly instead of formatting it as the result, which produces meaningless output and doesn't inform the userspace of the error.
--- drivers/platform/x86/panasonic-laptop.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/platform/x86/panasonic-laptop.c +7 -3
@@ -614,8 +614,7 @@ static ssize_t eco_mode_show(struct device *dev, struct device_attribute *attr, result =1 ;break ;default : - result = -EIO ; -break ; +return -EIO ; }return sysfs_emit (buf,"%u\n" , result); }
@@ -761,7 +760,12 @@ static ssize_t current_brightness_store(struct device *dev, struct device_attribstatic ssize_t cdpower_show (struct device *dev,struct device_attribute *attr,char *buf) { -return sysfs_emit (buf,"%d\n" ,get_optd_power_state ()); +int state =get_optd_power_state (); + +if (state <0 ) +return state; + +return sysfs_emit (buf,"%d\n" , state); } static ssize_t cdpower_store(struct device *dev, struct device_attribute *attr,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 181/826 drm/imagination: Convert to use time_before macro
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Yufan <[email protected]>
[ Upstream commit 7a5115ba1d691bd14db91d2fcc3ce0b056574ce9 ]
Use time_*() macros instead of using jiffies directly to handle overflow issues.
--- drivers/gpu/drm/imagination/pvr_ccb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/imagination/pvr_ccb.c +1 -1
@@ -321,7 +321,7 @@ static int pvr_kccb_reserve_slot_sync(struct pvr_device *pvr_dev)bool reserved = false;u32 retries =0 ; -while ((jiffies - start_timestamp) < (u32 )RESERVE_SLOT_TIMEOUT || +while (time_before (jiffies, start_timestamp +RESERVE_SLOT_TIMEOUT ) || retries <RESERVE_SLOT_MIN_RETRIES ) { reserved =pvr_kccb_try_reserve_slot (pvr_dev);if (reserved)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 182/826 drm/imagination: Use pvr_vm_context_get()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Coster <[email protected]>
[ Upstream commit eb4accc5234525e2cb2b720187ccaf6db99b705f ]
I missed this open-coded kref_get() while trying to debug a refcount bug, so let's use the helper function here to avoid that waste of time again in the future.
--- drivers/gpu/drm/imagination/pvr_vm.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/gpu/drm/imagination/pvr_vm.c +1 -3
@@ -654,9 +654,7 @@ pvr_vm_context_lookup(struct pvr_file *pvr_file, u32 handle)xa_lock (&pvr_file->vm_ctx_handles); vm_ctx =xa_load (&pvr_file->vm_ctx_handles, handle); -if (vm_ctx) -kref_get (&vm_ctx->ref_count); - +pvr_vm_context_get (vm_ctx);xa_unlock (&pvr_file->vm_ctx_handles);return vm_ctx;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 183/826 drm/mm: Mark drm_mm_interval_tree*() functions with __maybe_unused
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 53bd7c1c0077db533472ae32799157758302ef48 ]
The INTERVAL_TREE_DEFINE() uncoditionally provides a bunch of helper functions which in some cases may be not used. This, in particular, prevents kernel builds with clang, make W=1 and CONFIG_WERROR=y:
.../drm/drm_mm.c:152:1: error: unused function 'drm_mm_interval_tree_insert' [-Werror,-Wunused-function]
152 | INTERVAL_TREE_DEFINE(struct drm_mm_node, rb,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
153 | u64, __subtree_last,
| ~~~~~~~~~~~~~~~~~~~~
154 | START, LAST, static inline, drm_mm_interval_tree)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Fix this by marking drm_mm_interval_tree*() functions with __maybe_unused.
See also commit 6863f5643dd7 ("kbuild: allow Clang to find unused static inline functions for W=1 build").
--- drivers/gpu/drm/drm_mm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_mm.c +1 -1
@@ -151,7 +151,7 @@ static void show_leaks(struct drm_mm *mm) { } INTERVAL_TREE_DEFINE(struct drm_mm_node, rb, u64, __subtree_last, - START, LAST, static inline, drm_mm_interval_tree) + START, LAST, static inline __maybe_unused, drm_mm_interval_tree)struct drm_mm_node *__drm_mm_interval_first (const struct drm_mm *mm,u64 start,u64 last)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 184/826 drm/vc4: hvs: Dont write gamma luts on 2711
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 52efe364d1968ee3e3ed45eb44eb924b63635315 ]
The gamma block has changed in 2711, therefore writing the lut in vc4_hvs_lut_load is incorrect.
Whilst the gamma property isn't created for 2711, it is called from vc4_hvs_init_channel, so abort if attempted.
--- drivers/gpu/drm/vc4/vc4_hvs.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/vc4/vc4_hvs.c +3 -0
@@ -222,6 +222,9 @@ static void vc4_hvs_lut_load(struct vc4_hvs *hvs,if (!drm_dev_enter (drm, &idx))return ; +if (hvs->vc4->is_vc5) +return ; +/* The LUT memory is laid out with each HVS channel in order, * each of which takes 256 writes for R, 256 for G, then 256 * for B.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 185/826 drm/vc4: hdmi: Avoid hang with debug registers when suspended
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dom Cobley <[email protected]>
[ Upstream commit 223ee2567a55e4f80315c768d2969e6a3b9fb23d ]
Trying to read /sys/kernel/debug/dri/1/hdmi1_regs when the hdmi is disconnected results in a fatal system hang.
This is due to the pm suspend code disabling the dvp clock. That is just a gate of the 108MHz clock in DVP_HT_RPI_MISC_CONFIG, which results in accesses hanging AXI bus.
Protect against this.
--- drivers/gpu/drm/vc4/vc4_hdmi.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/vc4/vc4_hdmi.c +4 -0
@@ -147,6 +147,8 @@ static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused)if (!drm_dev_enter (drm, &idx))return -ENODEV ; +WARN_ON (pm_runtime_resume_and_get (&vc4_hdmi->pdev->dev)); +drm_print_regset32 (&p, &vc4_hdmi->hdmi_regset);drm_print_regset32 (&p, &vc4_hdmi->hd_regset);drm_print_regset32 (&p, &vc4_hdmi->cec_regset);
@@ -156,6 +158,8 @@ static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused)drm_print_regset32 (&p, &vc4_hdmi->ram_regset);drm_print_regset32 (&p, &vc4_hdmi->rm_regset); +pm_runtime_put (&vc4_hdmi->pdev->dev); +drm_dev_exit (idx);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 186/826 drm/vc4: hvs: Fix dlist debug not resetting the next entry pointer
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 6d5f76e0544b04ec5bdd2a09c19d90aeeb2cd479 ]
The debug function to display the dlists didn't reset next_entry_start when starting each display, so resulting in not stopping the list at the correct place.
--- drivers/gpu/drm/vc4/vc4_hvs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/vc4/vc4_hvs.c +2 -1
@@ -110,7 +110,7 @@ static int vc4_hvs_debugfs_dlist(struct seq_file *m, void *data)struct vc4_dev *vc4 =to_vc4_dev (dev);struct vc4_hvs *hvs = vc4->hvs;struct drm_printer p =drm_seq_file_printer (m); -unsigned int next_entry_start =0 ; +unsigned int next_entry_start;unsigned int i, j;u32 dlist_word, dispstat;
@@ -124,6 +124,7 @@ static int vc4_hvs_debugfs_dlist(struct seq_file *m, void *data) }drm_printf (&p,"HVS chan %u:\n" , i); + next_entry_start =0 ;for (j =HVS_READ (SCALER_DISPLISTX (i)); j <256 ; j++) { dlist_word =readl ((u32 __iomem *)vc4->hvs->dlist + j);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 187/826 drm/vc4: hvs: Remove incorrect limit from hvs_dlist debugfs function
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit d285bb622ebdfaa84f51df3a1abccb87036157ea ]
The debugfs function to dump dlists aborted at 256 bytes, when actually the dlist memory is generally significantly larger but varies based on SoC.
We already have the correct limit in __vc4_hvs_alloc, so store it for use in the debugfs dlist function.
--- drivers/gpu/drm/vc4/vc4_drv.h | 1 + drivers/gpu/drm/vc4/vc4_hvs.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-)
drivers/gpu/drm/vc4/vc4_drv.h +1 -0
@@ -315,6 +315,7 @@ struct vc4_hvs {struct platform_device *pdev;void __iomem *regs;u32 __iomem *dlist; +unsigned int dlist_mem_size;struct clk *core_clk;
drivers/gpu/drm/vc4/vc4_hvs.c +4 -2
@@ -110,6 +110,7 @@ static int vc4_hvs_debugfs_dlist(struct seq_file *m, void *data)struct vc4_dev *vc4 =to_vc4_dev (dev);struct vc4_hvs *hvs = vc4->hvs;struct drm_printer p =drm_seq_file_printer (m); +unsigned int dlist_mem_size = hvs->dlist_mem_size;unsigned int next_entry_start;unsigned int i, j;u32 dlist_word, dispstat;
@@ -126,7 +127,7 @@ static int vc4_hvs_debugfs_dlist(struct seq_file *m, void *data)drm_printf (&p,"HVS chan %u:\n" , i); next_entry_start =0 ; -for (j =HVS_READ (SCALER_DISPLISTX (i)); j <256 ; j++) { +for (j =HVS_READ (SCALER_DISPLISTX (i)); j < dlist_mem_size; j++) { dlist_word =readl ((u32 __iomem *)vc4->hvs->dlist + j);drm_printf (&p,"dlist: %02d: 0x%08x\n" , j, dlist_word);
@@ -804,9 +805,10 @@ struct vc4_hvs *__vc4_hvs_alloc(struct vc4_dev *vc4, struct platform_device *pde* our 16K), since we don't want to scramble the screen when * transitioning from the firmware's boot setup to runtime. */ + hvs->dlist_mem_size = (SCALER_DLIST_SIZE >>2 ) -HVS_BOOTLOADER_DLIST_END ;drm_mm_init (&hvs->dlist_mm,HVS_BOOTLOADER_DLIST_END , - (SCALER_DLIST_SIZE >>2 ) -HVS_BOOTLOADER_DLIST_END ); + hvs->dlist_mem_size);/* Set up the HVS LBM memory manager. We could have some more * complicated data structure that allowed reuse of LBM areas
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 188/826 drm/vc4: hvs: Correct logic on stopping an HVS channel
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 7ab6512e7942889c0962588355cb92424a690be6 ]
When factoring out __vc4_hvs_stop_channel, the logic got inverted from
if (condition) // stop channel to if (condition) goto out //stop channel out:
and also changed the exact register writes used to stop the channel.
Correct the logic so that the channel is actually stopped, and revert to the original register writes.
--- drivers/gpu/drm/vc4/vc4_hvs.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/gpu/drm/vc4/vc4_hvs.c +3 -5
@@ -420,13 +420,11 @@ void vc4_hvs_stop_channel(struct vc4_hvs *hvs, unsigned int chan)if (!drm_dev_enter (drm, &idx))return ; -if (HVS_READ (SCALER_DISPCTRLX (chan)) &SCALER_DISPCTRLX_ENABLE ) +if (!(HVS_READ (SCALER_DISPCTRLX (chan)) &SCALER_DISPCTRLX_ENABLE )) goto out; -HVS_WRITE (SCALER_DISPCTRLX (chan), -HVS_READ (SCALER_DISPCTRLX (chan)) |SCALER_DISPCTRLX_RESET ); -HVS_WRITE (SCALER_DISPCTRLX (chan), -HVS_READ (SCALER_DISPCTRLX (chan)) & ~SCALER_DISPCTRLX_ENABLE ); +HVS_WRITE (SCALER_DISPCTRLX (chan),SCALER_DISPCTRLX_RESET ); +HVS_WRITE (SCALER_DISPCTRLX (chan),0 );/* Once we leave, the scaler should be disabled and its fifo empty. */ WARN_ON_ONCE (HVS_READ (SCALER_DISPCTRLX (chan)) &SCALER_DISPCTRLX_RESET );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 189/826 wifi: ath9k: add range check for conn_rsp_epid in htc_connect_service()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeongjun Park <[email protected]>
[ Upstream commit 8619593634cbdf5abf43f5714df49b04e4ef09ab ]
I found the following bug in my fuzzer:
UBSAN: array-index-out-of-bounds in drivers/net/wireless/ath/ath9k/htc_hst.c:26:51 index 255 is out of range for type 'htc_endpoint [22]' CPU: 0 UID: 0 PID: 8 Comm: kworker/0:0 Not tainted 6.11.0-rc6-dirty #14 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 Workqueue: events request_firmware_work_func Call Trace: <TASK> dump_stack_lvl+0x180/0x1b0 __ubsan_handle_out_of_bounds+0xd4/0x130 htc_issue_send.constprop.0+0x20c/0x230 ? _raw_spin_unlock_irqrestore+0x3c/0x70 ath9k_wmi_cmd+0x41d/0x610 ? mark_held_locks+0x9f/0xe0 ...
Since this bug has been confirmed to be caused by insufficient verification of conn_rsp_epid, I think it would be appropriate to add a range check for conn_rsp_epid to htc_connect_service() to prevent the bug from occurring.
--- drivers/net/wireless/ath/ath9k/htc_hst.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/ath/ath9k/htc_hst.c +3 -0
@@ -294,6 +294,9 @@ int htc_connect_service(struct htc_target *target,return -ETIMEDOUT ; } +if (target->conn_rsp_epid <0 || target->conn_rsp_epid >=ENDPOINT_MAX ) +return -EINVAL ; + *conn_rsp_epid = target->conn_rsp_epid;return 0 ; err:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 190/826 drm/omap: Fix possible NULL dereference
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit a88fee2d67d9b78c24630a987a88ccf886b2498b ]
smatch reports:
drivers/gpu/drm/omapdrm/dss/base.c:176 omapdss_device_disconnect() error: we previously assumed 'src' could be null (see line 169)
This code is mostly from a time when omapdrm had its own display device model. I can't honestly remember the details, and I don't think it's worth digging in deeply into that for a legacy driver.
However, it looks like we only call omapdss_device_disconnect() and omapdss_device_connect() with NULL as the src parameter. We can thus drop the src parameter from both functions, and fix the smatch warning.
I don't think omapdss_device_disconnect() ever gets NULL for the dst parameter (if it did, we'd crash soon after returning from the function), but I have kept the !dst check, just in case, but I added a WARN_ON() there.
Also, if the dst parameter can be NULL, we can't always get the struct dss_device pointer from dst->dss (which is only used for a debug print). To make sure we can't hit that issue, do it similarly to the omapdss_device_connect() function: add 'struct dss_device *dss' as the first parameter, so that we always have it regardless of the dst.
--- drivers/gpu/drm/omapdrm/dss/base.c | 25 ++++++------------------- drivers/gpu/drm/omapdrm/dss/omapdss.h | 3 +-- drivers/gpu/drm/omapdrm/omap_drv.c | 4 ++-- 3 files changed, 9 insertions(+), 23 deletions(-)
drivers/gpu/drm/omapdrm/dss/base.c +6 -19
@@ -139,21 +139,13 @@ static bool omapdss_device_is_connected(struct omap_dss_device *dssdev) }int omapdss_device_connect (struct dss_device *dss, -struct omap_dss_device *src,struct omap_dss_device *dst) { -dev_dbg (&dss->pdev->dev,"connect(%s, %s)\n" , - src ?dev_name (src->dev) :"NULL" , +dev_dbg (&dss->pdev->dev,"connect(%s)\n" , dst ?dev_name (dst->dev) :"NULL" ); -if (!dst) { -/* -* The destination is NULL when the source is connected to a -* bridge instead of a DSS device. Stop here, we will attach -* the bridge later when we will have a DRM encoder. -*/ -return src && src->bridge ?0 : -EINVAL ; - } +if (!dst) +return -EINVAL ;if (omapdss_device_is_connected (dst))return -EBUSY ;
@@ -163,19 +155,14 @@ int omapdss_device_connect(struct dss_device *dss,return 0 ; } -void omapdss_device_disconnect (struct omap_dss_device *src, +void omapdss_device_disconnect (struct dss_device *dss,struct omap_dss_device *dst) { -struct dss_device *dss = src ? src->dss : dst->dss; - -dev_dbg (&dss->pdev->dev,"disconnect(%s, %s)\n" , - src ?dev_name (src->dev) :"NULL" , +dev_dbg (&dss->pdev->dev,"disconnect(%s)\n" , dst ?dev_name (dst->dev) :"NULL" ); -if (!dst) { -WARN_ON (!src->bridge); +if (WARN_ON (!dst))return ; - }if (!dst->id && !omapdss_device_is_connected (dst)) {WARN_ON (1 );
drivers/gpu/drm/omapdrm/dss/omapdss.h +1 -2
@@ -242,9 +242,8 @@ struct omap_dss_device *omapdss_device_get(struct omap_dss_device *dssdev);void omapdss_device_put (struct omap_dss_device *dssdev);struct omap_dss_device *omapdss_find_device_by_node (struct device_node *node);int omapdss_device_connect (struct dss_device *dss, -struct omap_dss_device *src,struct omap_dss_device *dst); -void omapdss_device_disconnect (struct omap_dss_device *src, +void omapdss_device_disconnect (struct dss_device *dss,struct omap_dss_device *dst);int omap_dss_get_num_overlay_managers (void );
drivers/gpu/drm/omapdrm/omap_drv.c +2 -2
@@ -307,7 +307,7 @@ static void omap_disconnect_pipelines(struct drm_device *ddev)for (i =0 ; i < priv->num_pipes; i++) {struct omap_drm_pipeline *pipe = &priv->pipes[i]; -omapdss_device_disconnect (NULL , pipe->output); +omapdss_device_disconnect (priv->dss, pipe->output);omapdss_device_put (pipe->output); pipe->output =NULL ;
@@ -325,7 +325,7 @@ static int omap_connect_pipelines(struct drm_device *ddev)int r;for_each_dss_output (output) { - r =omapdss_device_connect (priv->dss,NULL , output); + r =omapdss_device_connect (priv->dss, output);if (r == -EPROBE_DEFER ) {omapdss_device_put (output);return r;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 191/826 drm/omap: Fix locking in omap_gem_new_dmabuf()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit e6a1c4037227539373c8cf484ace83833e2ad6a2 ]
omap_gem_new_dmabuf() creates the new gem object, and then takes and holds the omap_obj->lock for the rest of the function. This has two issues:
- omap_gem_free_object(), which is called in the error paths, also takes the same lock, leading to deadlock
- Even if the above wouldn't happen, in the error cases omap_gem_new_dmabuf() still unlocks omap_obj->lock, even after the omap_obj has already been freed.
Furthermore, I don't think there's any reason to take the lock at all, as the object was just created and not yet shared with anyone else.
To fix all this, drop taking the lock.
--- drivers/gpu/drm/omapdrm/omap_gem.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
drivers/gpu/drm/omapdrm/omap_gem.c +2 -8
@@ -1402,8 +1402,6 @@ struct drm_gem_object *omap_gem_new_dmabuf(struct drm_device *dev, size_t size, omap_obj =to_omap_bo (obj); -mutex_lock (&omap_obj->lock); - omap_obj->sgt = sgt;if (omap_gem_sgt_is_contiguous (sgt, size)) {
@@ -1418,21 +1416,17 @@ struct drm_gem_object *omap_gem_new_dmabuf(struct drm_device *dev, size_t size, pages =kcalloc (npages,sizeof (*pages),GFP_KERNEL );if (!pages) {omap_gem_free_object (obj); - obj =ERR_PTR (-ENOMEM ); - goto done; +return ERR_PTR (-ENOMEM ); } omap_obj->pages = pages; ret =drm_prime_sg_to_page_array (sgt, pages, npages);if (ret) {omap_gem_free_object (obj); - obj =ERR_PTR (-ENOMEM ); - goto done; +return ERR_PTR (-ENOMEM ); } } -done: -mutex_unlock (&omap_obj->lock);return obj; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 192/826 drm/v3d: Appease lockdep while updating GPU stats
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
[ Upstream commit 06c3c406850e5495bb56ccf624d0c9477e1ba901 ]
Lockdep thinks our seqcount_t usage is unsafe because the update path can be both from irq and worker context:
[ ] ================================
[ ] WARNING: inconsistent lock state
[ ] 6.10.3-v8-16k-numa #159 Tainted: G WC
[ ] --------------------------------
[ ] inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage.
[ ] swapper/0/0 [HC1[1]:SC0[0]:HE0:SE1] takes:
[ ] ffff80003d7c08d0 (&v3d_priv->stats[i].lock){?.+.}-{0:0}, at: v3d_irq+0xc8/0x660 [v3d] [ ] {HARDIRQ-ON-W} state was registered at:
[ ] lock_acquire+0x1f8/0x328 [ ] v3d_job_start_stats.isra.0+0xd8/0x218 [v3d] [ ] v3d_bin_job_run+0x23c/0x388 [v3d] [ ] drm_sched_run_job_work+0x520/0x6d0 [gpu_sched] [ ] process_one_work+0x62c/0xb48 [ ] worker_thread+0x468/0x5b0 [ ] kthread+0x1c4/0x1e0 [ ] ret_from_fork+0x10/0x20
[ ] irq event stamp: 337094
[ ] hardirqs last enabled at (337093): [<ffffc0008144ce7c>] default_idle_call+0x11c/0x140 [ ] hardirqs last disabled at (337094): [<ffffc0008144a354>] el1_interrupt+0x24/0x58 [ ] softirqs last enabled at (337082): [<ffffc00080061d90>] handle_softirqs+0x4e0/0x538 [ ] softirqs last disabled at (337073): [<ffffc00080010364>] __do_softirq+0x1c/0x28 [ ]
other info that might help us debug this:
[ ] Possible unsafe locking scenario:
[ ] CPU0
[ ] ----
[ ] lock(&v3d_priv->stats[i].lock);
[ ] <Interrupt>
[ ] lock(&v3d_priv->stats[i].lock);
[ ]
*** DEADLOCK ***
[ ] no locks held by swapper/0/0.
[ ]
stack backtrace: [ ] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G WC 6.10.3-v8-16k-numa #159 [ ] Hardware name: Raspberry Pi 5 Model B Rev 1.0 (DT) [ ] Call trace: [ ] dump_backtrace+0x170/0x1b8 [ ] show_stack+0x20/0x38 [ ] dump_stack_lvl+0xb4/0xd0 [ ] dump_stack+0x18/0x28 [ ] print_usage_bug+0x3cc/0x3f0 [ ] mark_lock+0x4d0/0x968 [ ] __lock_acquire+0x784/0x18c8 [ ] lock_acquire+0x1f8/0x328 [ ] v3d_job_update_stats+0xec/0x2e0 [v3d] [ ] v3d_irq+0xc8/0x660 [v3d] [ ] __handle_irq_event_percpu+0x1f8/0x488 [ ] handle_irq_event+0x88/0x128 [ ] handle_fasteoi_irq+0x298/0x408 [ ] generic_handle_domain_irq+0x50/0x78
But it is a false positive because all the queue-stats pairs have their own lock and jobs are also one at a time.
Nevertheless we can appease lockdep by disabling local interrupts to make it see lock usage is consistent.
--- drivers/gpu/drm/v3d/v3d_sched.c | 46 +++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 5 deletions(-)
drivers/gpu/drm/v3d/v3d_sched.c +41 -5
@@ -135,8 +135,31 @@ v3d_job_start_stats(struct v3d_job *job, enum v3d_queue queue)struct v3d_stats *global_stats = &v3d->queue[queue].stats;struct v3d_stats *local_stats = &file->stats[queue];u64 now =local_clock (); - -preempt_disable (); +unsigned long flags; + +/* +* We only need to disable local interrupts to appease lockdep who +* otherwise would think v3d_job_start_stats vs v3d_stats_update has an +* unsafe in-irq vs no-irq-off usage problem. This is a false positive +* because all the locks are per queue and stats type, and all jobs are +* completely one at a time serialised. More specifically: +* +* 1. Locks for GPU queues are updated from interrupt handlers under a +* spin lock and started here with preemption disabled. +* +* 2. Locks for CPU queues are updated from the worker with preemption +* disabled and equally started here with preemption disabled. +* +* Therefore both are consistent. +* +* 3. Because next job can only be queued after the previous one has +* been signaled, and locks are per queue, there is also no scope for +* the start part to race with the update part. +*/ +if (IS_ENABLED (CONFIG_LOCKDEP )) +local_irq_save (flags); +else +preempt_disable ();write_seqcount_begin (&local_stats->lock); local_stats->start_ns = now;
@@ -146,7 +169,10 @@ v3d_job_start_stats(struct v3d_job *job, enum v3d_queue queue) global_stats->start_ns = now;write_seqcount_end (&global_stats->lock); -preempt_enable (); +if (IS_ENABLED (CONFIG_LOCKDEP )) +local_irq_restore (flags); +else +preempt_enable (); } static void
@@ -167,11 +193,21 @@ v3d_job_update_stats(struct v3d_job *job, enum v3d_queue queue)struct v3d_stats *global_stats = &v3d->queue[queue].stats;struct v3d_stats *local_stats = &file->stats[queue];u64 now =local_clock (); +unsigned long flags; + +/* See comment in v3d_job_start_stats() */ +if (IS_ENABLED (CONFIG_LOCKDEP )) +local_irq_save (flags); +else +preempt_disable (); -preempt_disable ();v3d_stats_update (local_stats, now);v3d_stats_update (global_stats, now); -preempt_enable (); + +if (IS_ENABLED (CONFIG_LOCKDEP )) +local_irq_restore (flags); +else +preempt_enable (); }static struct dma_fence *v3d_bin_job_run (struct drm_sched_job *sched_job)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 193/826 wifi: p54: Use IRQF_NO_AUTOEN flag in request_irq()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit bcd1371bd85e560ccc9159b7747f94bfe43b77a6 ]
disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
--- drivers/net/wireless/intersil/p54/p54spi.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/wireless/intersil/p54/p54spi.c +1 -3
@@ -624,7 +624,7 @@ static int p54spi_probe(struct spi_device *spi)gpio_direction_input (p54spi_gpio_irq); ret =request_irq (gpio_to_irq (p54spi_gpio_irq), - p54spi_interrupt,0 ,"p54spi" , + p54spi_interrupt,IRQF_NO_AUTOEN ,"p54spi" , priv->spi);if (ret <0 ) {dev_err (&priv->spi->dev,"request_irq() failed" );
@@ -633,8 +633,6 @@ static int p54spi_probe(struct spi_device *spi)irq_set_irq_type (gpio_to_irq (p54spi_gpio_irq),IRQ_TYPE_EDGE_RISING ); -disable_irq (gpio_to_irq (p54spi_gpio_irq)); -INIT_WORK (&priv->work, p54spi_work);init_completion (&priv->fw_comp);INIT_LIST_HEAD (&priv->tx_pending);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 194/826 wifi: mwifiex: Use IRQF_NO_AUTOEN flag in request_irq()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 9a98dd48b6d834d7a3fe5e8e7b8c3a1d006f9685 ]
disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
--- drivers/net/wireless/marvell/mwifiex/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/marvell/mwifiex/main.c +2 -2
@@ -1679,7 +1679,8 @@ static void mwifiex_probe_of(struct mwifiex_adapter *adapter) } ret =devm_request_irq (dev, adapter->irq_wakeup, - mwifiex_irq_wakeup_handler,IRQF_TRIGGER_LOW , + mwifiex_irq_wakeup_handler, +IRQF_TRIGGER_LOW |IRQF_NO_AUTOEN ,"wifi_wake" , adapter);if (ret) { dev_err(dev, "Failed to request irq_wakeup %d (%d)\n",
@@ -1687,7 +1688,6 @@ static void mwifiex_probe_of(struct mwifiex_adapter *adapter) goto err_exit; } -disable_irq (adapter->irq_wakeup);if (device_init_wakeup (dev, true)) {dev_err (dev,"fail to init wakeup for mwifiex\n" ); goto err_exit;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 195/826 udmabuf: change folios array from kmalloc to kvmalloc
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huan Yang <[email protected]>
[ Upstream commit 1c0844c6184e658064e14c4335885785ad3bf84b ]
When PAGE_SIZE 4096, MAX_PAGE_ORDER 10, 64bit machine, page_alloc only support 4MB.
If above this, trigger this warn and return NULL.
udmabuf can change size limit, if change it to 3072(3GB), and then alloc 3GB udmabuf, will fail create.
[ 4080.876581] ------------[ cut here ]------------ [ 4080.876843] WARNING: CPU: 3 PID: 2015 at mm/page_alloc.c:4556 __alloc_pages+0x2c8/0x350 [ 4080.878839] RIP: 0010:__alloc_pages+0x2c8/0x350 [ 4080.879470] Call Trace: [ 4080.879473] <TASK> [ 4080.879473] ? __alloc_pages+0x2c8/0x350 [ 4080.879475] ? __warn.cold+0x8e/0xe8 [ 4080.880647] ? __alloc_pages+0x2c8/0x350 [ 4080.880909] ? report_bug+0xff/0x140 [ 4080.881175] ? handle_bug+0x3c/0x80 [ 4080.881556] ? exc_invalid_op+0x17/0x70 [ 4080.881559] ? asm_exc_invalid_op+0x1a/0x20 [ 4080.882077] ? udmabuf_create+0x131/0x400
Because MAX_PAGE_ORDER, kmalloc can max alloc 4096 * (1 << 10), 4MB memory, each array entry is pointer(8byte), so can save 524288 pages(2GB).
Further more, costly order(order 3) may not be guaranteed that it can be applied for, due to fragmentation.
This patch change udmabuf array use kvmalloc_array, this can fallback alloc into vmalloc, which can guarantee allocation for any size and does not affect the performance of kmalloc allocations.
Stable-dep-of: 18d7de823b71 ("udmabuf: fix vmap_udmabuf error page set")
--- drivers/dma-buf/udmabuf.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
drivers/dma-buf/udmabuf.c +13 -13
@@ -80,7 +80,7 @@ static int vmap_udmabuf(struct dma_buf *buf, struct iosys_map *map)dma_resv_assert_held (buf->resv); - pages =kmalloc_array (ubuf->pagecount,sizeof (*pages),GFP_KERNEL ); + pages =kvmalloc_array (ubuf->pagecount,sizeof (*pages),GFP_KERNEL );if (!pages)return -ENOMEM ;
@@ -88,7 +88,7 @@ static int vmap_udmabuf(struct dma_buf *buf, struct iosys_map *map) pages[pg] = &ubuf->folios[pg]->page; vaddr =vm_map_ram (pages, ubuf->pagecount,-1 ); -kfree (pages); +kvfree (pages);if (!vaddr)return -EINVAL ;
@@ -196,8 +196,8 @@ static void release_udmabuf(struct dma_buf *buf)put_sg_table (dev, ubuf->sg,DMA_BIDIRECTIONAL );unpin_all_folios (&ubuf->unpin_list); -kfree (ubuf->offsets); -kfree (ubuf->folios); +kvfree (ubuf->offsets); +kvfree (ubuf->folios);kfree (ubuf); }
@@ -322,14 +322,14 @@ static long udmabuf_create(struct miscdevice *device,if (!ubuf->pagecount) goto err; - ubuf->folios =kmalloc_array (ubuf->pagecount,sizeof (*ubuf->folios), -GFP_KERNEL ); + ubuf->folios =kvmalloc_array (ubuf->pagecount,sizeof (*ubuf->folios), +GFP_KERNEL );if (!ubuf->folios) { ret = -ENOMEM ; goto err; } - ubuf->offsets =kcalloc (ubuf->pagecount,sizeof (*ubuf->offsets), -GFP_KERNEL ); + ubuf->offsets =kvcalloc (ubuf->pagecount,sizeof (*ubuf->offsets), +GFP_KERNEL );if (!ubuf->offsets) { ret = -ENOMEM ; goto err;
@@ -343,7 +343,7 @@ static long udmabuf_create(struct miscdevice *device, goto err; pgcnt = list[i].size >>PAGE_SHIFT ; - folios =kmalloc_array (pgcnt,sizeof (*folios),GFP_KERNEL ); + folios =kvmalloc_array (pgcnt,sizeof (*folios),GFP_KERNEL );if (!folios) { ret = -ENOMEM ; goto err;
@@ -353,7 +353,7 @@ static long udmabuf_create(struct miscdevice *device, ret =memfd_pin_folios (memfd, list[i].offset, end, folios, pgcnt, &pgoff);if (ret <=0 ) { -kfree (folios); +kvfree (folios);if (!ret) ret = -EINVAL ; goto err;
@@ -382,7 +382,7 @@ static long udmabuf_create(struct miscdevice *device, } } -kfree (folios); +kvfree (folios);fput (memfd); memfd =NULL ; }
@@ -398,8 +398,8 @@ static long udmabuf_create(struct miscdevice *device,if (memfd)fput (memfd);unpin_all_folios (&ubuf->unpin_list); -kfree (ubuf->offsets); -kfree (ubuf->folios); +kvfree (ubuf->offsets); +kvfree (ubuf->folios);kfree (ubuf);return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 196/826 udmabuf: fix vmap_udmabuf error page set
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huan Yang <[email protected]>
[ Upstream commit 18d7de823b7150344d242c3677e65d68c5271b04 ]
Currently vmap_udmabuf set page's array by each folio. But, ubuf->folios is only contain's the folio's head page.
That mean we repeatedly mapped the folio head page to the vmalloc area.
Due to udmabuf can use hugetlb, if HVO enabled, tail page may not exist, so, we can't use page array to map, instead, use pfn array.
By this, we removed page usage in udmabuf totally.
--- drivers/dma-buf/Kconfig | 1 + drivers/dma-buf/udmabuf.c | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-)
drivers/dma-buf/Kconfig +1 -0
@@ -36,6 +36,7 @@ config UDMABUF depends on DMA_SHARED_BUFFER depends on MEMFD_CREATE || COMPILE_TEST depends on MMU + select VMAP_PFN help A driver to let userspace turn memfd regions into dma-bufs. Qemu can use this to create host dmabufs for guest framebuffers.
drivers/dma-buf/udmabuf.c +15 -7
@@ -74,21 +74,29 @@ static int mmap_udmabuf(struct dma_buf *buf, struct vm_area_struct *vma)static int vmap_udmabuf (struct dma_buf *buf,struct iosys_map *map) {struct udmabuf *ubuf = buf->priv; -struct page **pages; +unsigned long *pfns;void *vaddr;pgoff_t pg;dma_resv_assert_held (buf->resv); - pages =kvmalloc_array (ubuf->pagecount,sizeof (*pages),GFP_KERNEL ); -if (!pages) +/** +* HVO may free tail pages, so just use pfn to map each folio +* into vmalloc area. +*/ + pfns =kvmalloc_array (ubuf->pagecount,sizeof (*pfns),GFP_KERNEL ); +if (!pfns)return -ENOMEM ; -for (pg =0 ; pg < ubuf->pagecount; pg++) - pages[pg] = &ubuf->folios[pg]->page; +for (pg =0 ; pg < ubuf->pagecount; pg++) { +unsigned long pfn =folio_pfn (ubuf->folios[pg]); - vaddr =vm_map_ram (pages, ubuf->pagecount,-1 ); -kvfree (pages); + pfn += ubuf->offsets[pg] >>PAGE_SHIFT ; + pfns[pg] = pfn; + } + + vaddr =vmap_pfn (pfns, ubuf->pagecount,PAGE_KERNEL ); +kvfree (pfns);if (!vaddr)return -EINVAL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 197/826 drm/imx/dcss: Use IRQF_NO_AUTOEN flag in request_irq()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 1af01e14db7e0b45ae502d822776a58c86688763 ]
disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
--- drivers/gpu/drm/imx/dcss/dcss-crtc.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/gpu/drm/imx/dcss/dcss-crtc.c +2 -4
@@ -206,15 +206,13 @@ int dcss_crtc_init(struct dcss_crtc *crtc, struct drm_device *drm)if (crtc->irq <0 )return crtc->irq; - ret =request_irq (crtc->irq, dcss_crtc_irq_handler, -0 ,"dcss_drm" , crtc); + ret =request_irq (crtc->irq, dcss_crtc_irq_handler,IRQF_NO_AUTOEN , +"dcss_drm" , crtc);if (ret) {dev_err (dcss->dev,"irq request failed with %d.\n" , ret);return ret; } -disable_irq (crtc->irq); -return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 198/826 drm/imx/ipuv3: Use IRQF_NO_AUTOEN flag in request_irq()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 40004709a3d3b07041a473a163ca911ef04ab8bd ]
disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
--- drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c +2 -4
@@ -410,14 +410,12 @@ static int ipu_drm_bind(struct device *dev, struct device *master, void *data) } ipu_crtc->irq =ipu_plane_irq (ipu_crtc->plane[0 ]); - ret =devm_request_irq (ipu_crtc->dev, ipu_crtc->irq, ipu_irq_handler,0 , -"imx_drm" , ipu_crtc); + ret =devm_request_irq (ipu_crtc->dev, ipu_crtc->irq, ipu_irq_handler, +IRQF_NO_AUTOEN ,"imx_drm" , ipu_crtc);if (ret <0 ) {dev_err (ipu_crtc->dev,"irq request failed with %d.\n" , ret);return ret; } -/* Only enable IRQ when we actually need it to trigger work. */ -disable_irq (ipu_crtc->irq);return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 199/826 drm/imx: parallel-display: drop edid override support
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit fe30fabf229f7542a10dd249079fdb83844a7dba ]
None of the in-kernel DT files ever used edid override with the fsl-imx-drm driver. In case the EDID needs to be specified manually, DRM core allows one to either override it via the debugfs or to load it via request_firmware by using DRM_LOAD_EDID_FIRMWARE. In all other cases EDID and/or modes are to be provided as a part of the panel driver.
Drop support for the edid property.
Stable-dep-of: f673055a4678 ("drm/imx: Add missing DRM_BRIDGE_CONNECTOR dependency")
--- drivers/gpu/drm/imx/ipuv3/parallel-display.c | 17 ----------------- 1 file changed, 17 deletions(-)
drivers/gpu/drm/imx/ipuv3/parallel-display.c +0 -17
@@ -16,7 +16,6 @@#include <drm/drm_atomic_helper.h> #include <drm/drm_bridge.h> -#include <drm/drm_edid.h> #include <drm/drm_managed.h> #include <drm/drm_of.h> #include <drm/drm_panel.h>
@@ -34,7 +33,6 @@ struct imx_parallel_display_encoder {struct imx_parallel_display {struct device *dev; -const struct drm_edid *drm_edid;u32 bus_format;u32 bus_flags;struct drm_display_mode mode;
@@ -62,11 +60,6 @@ static int imx_pd_connector_get_modes(struct drm_connector *connector)if (num_modes >0 )return num_modes; -if (imxpd->drm_edid) { -drm_edid_connector_update (connector, imxpd->drm_edid); - num_modes =drm_edid_connector_add_modes (connector); - } -if (np) {struct drm_display_mode *mode =drm_mode_create (connector->dev);int ret;
@@ -312,9 +305,7 @@ static int imx_pd_probe(struct platform_device *pdev) {struct device *dev = &pdev->dev;struct device_node *np = dev->of_node; -const u8 *edidp;struct imx_parallel_display *imxpd; -int edid_len;int ret;u32 bus_format =0 ;const char *fmt;
@@ -329,10 +320,6 @@ static int imx_pd_probe(struct platform_device *pdev)if (ret && ret != -ENODEV )return ret; - edidp =of_get_property (np,"edid" , &edid_len); -if (edidp) - imxpd->drm_edid =drm_edid_alloc (edidp, edid_len); - ret =of_property_read_string (np,"interface-pix-fmt" , &fmt);if (!ret) {if (!strcmp (fmt,"rgb24" ))
@@ -355,11 +342,7 @@ static int imx_pd_probe(struct platform_device *pdev)static void imx_pd_remove (struct platform_device *pdev) { -struct imx_parallel_display *imxpd =platform_get_drvdata (pdev); -component_del (&pdev->dev, &imx_pd_ops); - -drm_edid_free (imxpd->drm_edid); }static const struct of_device_id imx_pd_dt_ids[] = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 200/826 drm/imx: ldb: drop custom EDID support
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit aed7b500315004a917463d571fa9cd12e0e94370 ]
Bindings for the imx-ldb never allowed specifying the EDID in DT. None of the existing DT files use it. Drop it now in favour of using debugfs overrides or the drm.edid_firmware support.
Stable-dep-of: f673055a4678 ("drm/imx: Add missing DRM_BRIDGE_CONNECTOR dependency")
--- drivers/gpu/drm/imx/ipuv3/imx-ldb.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-)
drivers/gpu/drm/imx/ipuv3/imx-ldb.c +11 -18
@@ -72,7 +72,6 @@ struct imx_ldb_channel {struct device_node *child;struct i2c_adapter *ddc;int chno; -const struct drm_edid *drm_edid;struct drm_display_mode mode;int mode_valid;u32 bus_format;
@@ -142,14 +141,17 @@ static int imx_ldb_connector_get_modes(struct drm_connector *connector)if (num_modes >0 )return num_modes; -if (!imx_ldb_ch->drm_edid && imx_ldb_ch->ddc) { - imx_ldb_ch->drm_edid =drm_edid_read_ddc (connector, - imx_ldb_ch->ddc); -drm_edid_connector_update (connector, imx_ldb_ch->drm_edid); - } +if (imx_ldb_ch->ddc) { +const struct drm_edid *edid =drm_edid_read_ddc (connector, + imx_ldb_ch->ddc); -if (imx_ldb_ch->drm_edid) - num_modes =drm_edid_connector_add_modes (connector); +if (edid) { +drm_edid_connector_update (connector, edid); +drm_edid_free (edid); + +return drm_edid_connector_add_modes (connector); + } + }if (imx_ldb_ch->mode_valid) {struct drm_display_mode *mode;
@@ -566,18 +568,10 @@ static int imx_ldb_panel_ddc(struct device *dev, }if (!channel->ddc) { -const void *edidp; -int edid_len; -/* if no DDC available, fallback to hardcoded EDID */ dev_dbg (dev,"no ddc available\n" ); - edidp =of_get_property (child,"edid" , &edid_len); -if (edidp) { - channel->drm_edid =drm_edid_alloc (edidp, edid_len); -if (!channel->drm_edid) -return -ENOMEM ; - }else if (!channel->panel) { +if (!channel->panel) {/* fallback to display-timings node */ ret = of_get_drm_display_mode(child, &channel->mode,
@@ -744,7 +738,6 @@ static void imx_ldb_remove(struct platform_device *pdev)for (i =0 ; i <2 ; i++) {struct imx_ldb_channel *channel = &imx_ldb->channel[i]; -drm_edid_free (channel->drm_edid);i2c_put_adapter (channel->ddc); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 201/826 drm/imx: ldb: drop custom DDC bus support
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit b2f3418b516e3485a14f10bfc09f20211dedc156 ]
None of the boards ever supported by the upstream kernel used the custom DDC bus support with the LDB connector. If a need arises to do so, one should use panel-simple and its DDC bus code. Drop ddc-i2c-bus support from the imx-ldb driver.
Stable-dep-of: f673055a4678 ("drm/imx: Add missing DRM_BRIDGE_CONNECTOR dependency")
--- drivers/gpu/drm/imx/ipuv3/imx-ldb.c | 73 ++++------------------------- 1 file changed, 10 insertions(+), 63 deletions(-)
drivers/gpu/drm/imx/ipuv3/imx-ldb.c +10 -63
@@ -25,7 +25,6 @@#include <drm/drm_atomic.h> #include <drm/drm_atomic_helper.h> #include <drm/drm_bridge.h> -#include <drm/drm_edid.h> #include <drm/drm_managed.h> #include <drm/drm_of.h> #include <drm/drm_panel.h>
@@ -70,7 +69,6 @@ struct imx_ldb_channel {struct drm_bridge *bridge;struct device_node *child; -struct i2c_adapter *ddc;int chno;struct drm_display_mode mode;int mode_valid;
@@ -141,18 +139,6 @@ static int imx_ldb_connector_get_modes(struct drm_connector *connector)if (num_modes >0 )return num_modes; -if (imx_ldb_ch->ddc) { -const struct drm_edid *edid =drm_edid_read_ddc (connector, - imx_ldb_ch->ddc); - -if (edid) { -drm_edid_connector_update (connector, edid); -drm_edid_free (edid); - -return drm_edid_connector_add_modes (connector); - } - } -if (imx_ldb_ch->mode_valid) {struct drm_display_mode *mode;
@@ -481,10 +467,9 @@ static int imx_ldb_register(struct drm_device *drm,*/ drm_connector_helper_add (connector, &imx_ldb_connector_helper_funcs); -drm_connector_init_with_ddc (drm, connector, - &imx_ldb_connector_funcs, -DRM_MODE_CONNECTOR_LVDS , - imx_ldb_ch->ddc); +drm_connector_init (drm, connector, + &imx_ldb_connector_funcs, +DRM_MODE_CONNECTOR_LVDS );drm_connector_attach_encoder (connector, encoder); }
@@ -551,39 +536,6 @@ static const struct of_device_id imx_ldb_dt_ids[] = { };MODULE_DEVICE_TABLE (of, imx_ldb_dt_ids); -static int imx_ldb_panel_ddc (struct device *dev, -struct imx_ldb_channel *channel,struct device_node *child) -{ -struct device_node *ddc_node; -int ret; - - ddc_node =of_parse_phandle (child,"ddc-i2c-bus" ,0 ); -if (ddc_node) { - channel->ddc =of_find_i2c_adapter_by_node (ddc_node); -of_node_put (ddc_node); -if (!channel->ddc) { -dev_warn (dev,"failed to get ddc i2c adapter\n" ); -return -EPROBE_DEFER ; - } - } - -if (!channel->ddc) { -/* if no DDC available, fallback to hardcoded EDID */ -dev_dbg (dev,"no ddc available\n" ); - -if (!channel->panel) { -/* fallback to display-timings node */ - ret =of_get_drm_display_mode (child, - &channel->mode, - &channel->bus_flags, -OF_USE_NATIVE_MODE ); -if (!ret) - channel->mode_valid =1 ; - } - } -return 0 ; -} -static int imx_ldb_bind (struct device *dev,struct device *master,void *data) {struct drm_device *drm = data;
@@ -694,11 +646,15 @@ static int imx_ldb_probe(struct platform_device *pdev)if (ret && ret != -ENODEV ) goto free_child; -/* panel ddc only if there is no bridge */ -if (!channel->bridge) { - ret =imx_ldb_panel_ddc (dev, channel, child); +if (!channel->bridge && !channel->panel) { + ret =of_get_drm_display_mode (child, + &channel->mode, + &channel->bus_flags, +OF_USE_NATIVE_MODE );if (ret) goto free_child; + + channel->mode_valid =1 ; } bus_format =of_get_bus_format (dev, child);
@@ -732,15 +688,6 @@ static int imx_ldb_probe(struct platform_device *pdev)static void imx_ldb_remove (struct platform_device *pdev) { -struct imx_ldb *imx_ldb =platform_get_drvdata (pdev); -int i; - -for (i =0 ; i <2 ; i++) { -struct imx_ldb_channel *channel = &imx_ldb->channel[i]; - -i2c_put_adapter (channel->ddc); - } -component_del (&pdev->dev, &imx_ldb_ops); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 202/826 drm/imx: ldb: switch to drm_panel_bridge
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 5c5843b20bbb1e4b4de2359573c20e416b41cb48 ]
Defer panel handling to drm_panel_bridge, unifying codepaths for the panel and bridge cases. The MFD_SYSCON symbol is moved to select to prevent Kconfig symbol loops.
Stable-dep-of: f673055a4678 ("drm/imx: Add missing DRM_BRIDGE_CONNECTOR dependency")
--- drivers/gpu/drm/imx/ipuv3/Kconfig | 6 ++-- drivers/gpu/drm/imx/ipuv3/imx-ldb.c | 44 +++++++++-------------------- 2 files changed, 18 insertions(+), 32 deletions(-)
drivers/gpu/drm/imx/ipuv3/Kconfig +4 -2
@@ -26,9 +26,11 @@ config DRM_IMX_TVE config DRM_IMX_LDB tristate "Support for LVDS displays" - depends on DRM_IMX && MFD_SYSCON + depends on DRM_IMX depends on COMMON_CLK - select DRM_PANEL + select MFD_SYSCON + select DRM_BRIDGE + select DRM_PANEL_BRIDGE help Choose this to enable the internal LVDS Display Bridge (LDB) found on i.MX53 and i.MX6 processors.
drivers/gpu/drm/imx/ipuv3/imx-ldb.c +14 -30
99 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 203/826 drm/imx: parallel-display: switch to drm_panel_bridge
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 5f6e56d3319d2fd20d4c81b4f0212f4d09d7c1f1 ]
Defer panel handling to drm_panel_bridge, unifying codepaths for the panel and bridge cases.
Stable-dep-of: f673055a4678 ("drm/imx: Add missing DRM_BRIDGE_CONNECTOR dependency")
--- drivers/gpu/drm/imx/ipuv3/Kconfig | 3 +- drivers/gpu/drm/imx/ipuv3/parallel-display.c | 36 +++++--------------- 2 files changed, 10 insertions(+), 29 deletions(-)
drivers/gpu/drm/imx/ipuv3/Kconfig +2 -1
@@ -11,8 +11,9 @@ config DRM_IMX config DRM_IMX_PARALLEL_DISPLAY tristate "Support for parallel displays" - select DRM_PANEL depends on DRM_IMX + select DRM_BRIDGE + select DRM_PANEL_BRIDGE select VIDEOMODE_HELPERS config DRM_IMX_TVE
drivers/gpu/drm/imx/ipuv3/parallel-display.c +8 -28
@@ -18,7 +18,6 @@#include <drm/drm_bridge.h> #include <drm/drm_managed.h> #include <drm/drm_of.h> -#include <drm/drm_panel.h> #include <drm/drm_probe_helper.h> #include <drm/drm_simple_kms_helper.h>
@@ -36,7 +35,6 @@ struct imx_parallel_display {u32 bus_format;u32 bus_flags;struct drm_display_mode mode; -struct drm_panel *panel;struct drm_bridge *next_bridge; };
@@ -56,10 +54,6 @@ static int imx_pd_connector_get_modes(struct drm_connector *connector)struct device_node *np = imxpd->dev->of_node;int num_modes; - num_modes =drm_panel_get_modes (imxpd->panel, connector); -if (num_modes >0 ) -return num_modes; -if (np) {struct drm_display_mode *mode =drm_mode_create (connector->dev);int ret;
@@ -84,22 +78,6 @@ static int imx_pd_connector_get_modes(struct drm_connector *connector)return num_modes; } -static void imx_pd_bridge_enable (struct drm_bridge *bridge) -{ -struct imx_parallel_display *imxpd =bridge_to_imxpd (bridge); - -drm_panel_prepare (imxpd->panel); -drm_panel_enable (imxpd->panel); -} - -static void imx_pd_bridge_disable (struct drm_bridge *bridge) -{ -struct imx_parallel_display *imxpd =bridge_to_imxpd (bridge); - -drm_panel_disable (imxpd->panel); -drm_panel_unprepare (imxpd->panel); -} -static const u32 imx_pd_bus_fmts[] = {MEDIA_BUS_FMT_RGB888_1X24 ,MEDIA_BUS_FMT_BGR888_1X24 ,
@@ -237,8 +215,6 @@ static const struct drm_connector_helper_funcs imx_pd_connector_helper_funcs = { };static const struct drm_bridge_funcs imx_pd_bridge_funcs = { - .enable = imx_pd_bridge_enable, - .disable = imx_pd_bridge_disable, .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
@@ -315,10 +291,14 @@ static int imx_pd_probe(struct platform_device *pdev)return -ENOMEM ;/* port@1 is the output port */ - ret =drm_of_find_panel_or_bridge (np,1 ,0 , &imxpd->panel, - &imxpd->next_bridge); -if (ret && ret != -ENODEV ) -return ret; + imxpd->next_bridge =devm_drm_of_get_bridge (dev, np,1 ,0 ); +if (IS_ERR (imxpd->next_bridge)) { + ret =PTR_ERR (imxpd->next_bridge); +if (ret != -ENODEV ) +return ret; + + imxpd->next_bridge =NULL ; + } ret =of_property_read_string (np,"interface-pix-fmt" , &fmt);if (!ret) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 204/826 drm/imx: Add missing DRM_BRIDGE_CONNECTOR dependency
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Stein <[email protected]>
[ Upstream commit f673055a46784ccea04465b9213e999f7bc5187e ]
When drm/bridge-connector was moved to DRM_DISPLAY_HELPER not all users were updated. Add missing Kconfig selections.
--- drivers/gpu/drm/imx/ipuv3/Kconfig | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/imx/ipuv3/Kconfig +2 -0
@@ -13,6 +13,7 @@ config DRM_IMX_PARALLEL_DISPLAY tristate "Support for parallel displays" depends on DRM_IMX select DRM_BRIDGE + select DRM_BRIDGE_CONNECTOR select DRM_PANEL_BRIDGE select VIDEOMODE_HELPERS
@@ -31,6 +32,7 @@ config DRM_IMX_LDB depends on COMMON_CLK select MFD_SYSCON select DRM_BRIDGE + select DRM_BRIDGE_CONNECTOR select DRM_PANEL_BRIDGE help Choose this to enable the internal LVDS Display Bridge (LDB)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 205/826 drm/panel: nt35510: Make new commands optional
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
[ Upstream commit 2418aa8516b26c5e332a1a8c216d4d620f965a56 ]
The commit introducing the Frida display started to write the SETVCMOFF registers unconditionally, and some (not all!) Hydis display seem to be affected by ghosting after the commit.
Make SETVCMOFF optional and only send these commands on the Frida display for now.
--- drivers/gpu/drm/panel/panel-novatek-nt35510.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/gpu/drm/panel/panel-novatek-nt35510.c +9 -6
@@ -38,6 +38,7 @@#define NT35510_CMD_CORRECT_GAMMA BIT(0)#define NT35510_CMD_CONTROL_DISPLAY BIT(1) +#define NT35510_CMD_SETVCMOFF BIT(2)#define MCS_CMD_MAUCCTR 0xF0/* Manufacturer command enable */ #define MCS_CMD_READ_ID1 0xDA
@@ -721,11 +722,13 @@ static int nt35510_setup_power(struct nt35510 *nt)if (ret)return ret; - ret =nt35510_send_long (nt, dsi,NT35510_P1_SETVCMOFF , -NT35510_P1_VCMOFF_LEN , - nt->conf->vcmoff); -if (ret) -return ret; +if (nt->conf->cmds &NT35510_CMD_SETVCMOFF ) { + ret =nt35510_send_long (nt, dsi,NT35510_P1_SETVCMOFF , +NT35510_P1_VCMOFF_LEN , + nt->conf->vcmoff); +if (ret) +return ret; + }/* Typically 10 ms */ usleep_range (10000 ,20000 );
@@ -1319,7 +1322,7 @@ static const struct nt35510_config nt35510_frida_frd400b25025 = { }, .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM, - .cmds = NT35510_CMD_CONTROL_DISPLAY, + .cmds = NT35510_CMD_CONTROL_DISPLAY | NT35510_CMD_SETVCMOFF, /* 0x03: AVDD = 6.2V */ .avdd = { 0x03, 0x03, 0x03 },/* 0x46: PCK = 2 x Hsync, BTP = 2.5 x VDDB */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 206/826 drm/v3d: Address race-condition in MMU flush
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maíra Canal <[email protected]>
[ Upstream commit cf1becb7f996a0a23ea2c270cf6bb0911ec3ca1a ]
We must first flush the MMU cache and then, flush the TLB, not the other way around. Currently, we can see a race condition between the MMU cache and the TLB when running multiple rendering processes at the same time. This is evidenced by MMU errors triggered by the IRQ.
Fix the MMU flush order by flushing the MMU cache and then the TLB. Also, in order to address the race condition, wait for the MMU cache flush to finish before starting the TLB flush.
--- drivers/gpu/drm/v3d/v3d_mmu.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-)
drivers/gpu/drm/v3d/v3d_mmu.c +10 -19
@@ -32,32 +32,23 @@ static int v3d_mmu_flush_all(struct v3d_dev *v3d) {int ret; -/* Make sure that another flush isn't already running when we -* start this one. -*/ - ret =wait_for (!(V3D_READ (V3D_MMU_CTL ) & -V3D_MMU_CTL_TLB_CLEARING ),100 ); -if (ret) -dev_err (v3d->drm.dev,"TLB clear wait idle pre-wait failed\n" ); - -V3D_WRITE (V3D_MMU_CTL ,V3D_READ (V3D_MMU_CTL ) | -V3D_MMU_CTL_TLB_CLEAR ); - -V3D_WRITE (V3D_MMUC_CONTROL , -V3D_MMUC_CONTROL_FLUSH | +V3D_WRITE (V3D_MMUC_CONTROL ,V3D_MMUC_CONTROL_FLUSH |V3D_MMUC_CONTROL_ENABLE ); - ret =wait_for (!(V3D_READ (V3D_MMU_CTL ) & -V3D_MMU_CTL_TLB_CLEARING ),100 ); + ret =wait_for (!(V3D_READ (V3D_MMUC_CONTROL ) & +V3D_MMUC_CONTROL_FLUSHING ),100 );if (ret) { -dev_err (v3d->drm.dev,"TLB clear wait idle failed\n" ); +dev_err (v3d->drm.dev,"MMUC flush wait idle failed\n" );return ret; } - ret =wait_for (!(V3D_READ (V3D_MMUC_CONTROL ) & -V3D_MMUC_CONTROL_FLUSHING ),100 ); +V3D_WRITE (V3D_MMU_CTL ,V3D_READ (V3D_MMU_CTL ) | +V3D_MMU_CTL_TLB_CLEAR ); + + ret =wait_for (!(V3D_READ (V3D_MMU_CTL ) & +V3D_MMU_CTL_TLB_CLEARING ),100 );if (ret) -dev_err (v3d->drm.dev,"MMUC flush wait idle failed\n" ); +dev_err (v3d->drm.dev,"MMU TLB clear wait idle failed\n" );return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 207/826 drm/v3d: Flush the MMU before we supply more memory to the binner
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maíra Canal <[email protected]>
[ Upstream commit d2fb8811108b2c1285c56f4fba4fff8fe3525593 ]
We must ensure that the MMU is flushed before we supply more memory to the binner, otherwise we might end up with invalid MMU accesses by the GPU.
--- drivers/gpu/drm/v3d/v3d_drv.h | 1 + drivers/gpu/drm/v3d/v3d_irq.c | 2 ++ drivers/gpu/drm/v3d/v3d_mmu.c | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/v3d/v3d_drv.h +1 -0
@@ -553,6 +553,7 @@ void v3d_irq_disable(struct v3d_dev *v3d);void v3d_irq_reset (struct v3d_dev *v3d);/* v3d_mmu.c */ +int v3d_mmu_flush_all (struct v3d_dev *v3d);int v3d_mmu_set_page_table (struct v3d_dev *v3d);void v3d_mmu_insert_ptes (struct v3d_bo *bo);void v3d_mmu_remove_ptes (struct v3d_bo *bo);
drivers/gpu/drm/v3d/v3d_irq.c +2 -0
@@ -70,6 +70,8 @@ v3d_overflow_mem_work(struct work_struct *work)list_add_tail (&bo->unref_head, &v3d->bin_job->render->unref_list);spin_unlock_irqrestore (&v3d->job_lock, irqflags); +v3d_mmu_flush_all (v3d); +V3D_CORE_WRITE (0 ,V3D_PTB_BPOA , bo->node.start <<V3D_MMU_PAGE_SHIFT );V3D_CORE_WRITE (0 ,V3D_PTB_BPOS , obj->size);
drivers/gpu/drm/v3d/v3d_mmu.c +1 -1
@@ -28,7 +28,7 @@#define V3D_PTE_WRITEABLE BIT(29)#define V3D_PTE_VALID BIT(28) -static int v3d_mmu_flush_all (struct v3d_dev *v3d) +int v3d_mmu_flush_all (struct v3d_dev *v3d) {int ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 208/826 drm/amdgpu: Fix JPEG v4.0.3 register write
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lijo Lazar <[email protected]>
[ Upstream commit 8c50bf9beb889fd2bdcbf95b27a5d101eede51fc ]
EXTERNAL_REG_INTERNAL_OFFSET/EXTERNAL_REG_WRITE_ADDR should be used in pairs. If an external register shouldn't be written, both packets shouldn't be sent.
--- drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c +10 -8
@@ -674,11 +674,12 @@ void jpeg_v4_0_3_dec_ring_insert_start(struct amdgpu_ring *ring)amdgpu_ring_write (ring,PACKETJ (regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET,0 ,0 ,PACKETJ_TYPE0 ));amdgpu_ring_write (ring,0x62a04 );/* PCTL0_MMHUB_DEEPSLEEP_IB */ - } -amdgpu_ring_write (ring,PACKETJ (JRBC_DEC_EXTERNAL_REG_WRITE_ADDR , -0 ,0 ,PACKETJ_TYPE0 )); -amdgpu_ring_write (ring,0x80004000 ); +amdgpu_ring_write (ring, +PACKETJ (JRBC_DEC_EXTERNAL_REG_WRITE_ADDR ,0 , +0 ,PACKETJ_TYPE0 )); +amdgpu_ring_write (ring,0x80004000 ); + } }/**
@@ -694,11 +695,12 @@ void jpeg_v4_0_3_dec_ring_insert_end(struct amdgpu_ring *ring)amdgpu_ring_write (ring,PACKETJ (regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET,0 ,0 ,PACKETJ_TYPE0 ));amdgpu_ring_write (ring,0x62a04 ); - } -amdgpu_ring_write (ring,PACKETJ (JRBC_DEC_EXTERNAL_REG_WRITE_ADDR , -0 ,0 ,PACKETJ_TYPE0 )); -amdgpu_ring_write (ring,0x00004000 ); +amdgpu_ring_write (ring, +PACKETJ (JRBC_DEC_EXTERNAL_REG_WRITE_ADDR ,0 , +0 ,PACKETJ_TYPE0 )); +amdgpu_ring_write (ring,0x00004000 ); + } }/**
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 209/826 wifi: ath10k: fix invalid VHT parameters in supported_vht_mcs_rate_nss1
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baochen Qiang <[email protected]>
[ Upstream commit d50886b27850447d90c0cd40c725238097909d1e ]
In supported_vht_mcs_rate_nss1, the rate for MCS9 & VHT20 is defined as {780, 867}, this does not align with firmware's definition and therefore fails the verification in ath10k_mac_get_rate_flags_vht():
invalid vht params rate 960 100kbps nss 1 mcs 9
Change it to {865, 960} to align with firmware, so this issue could be fixed.
Since ath10k_hw_params::supports_peer_stats_info is enabled only for QCA6174, this change does not affect other chips.
Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00309-QCARMSWPZ-1
--- drivers/net/wireless/ath/ath10k/mac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath10k/mac.c +1 -1
@@ -9121,7 +9121,7 @@ static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss1[ {6, {2633, 2925}, {1215, 1350}, {585, 650} }, {7, {2925, 3250}, {1350, 1500}, {650, 722} }, {8, {3510, 3900}, {1620, 1800}, {780, 867} }, - {9, {3900, 4333}, {1800, 2000}, {780, 867} } + {9, {3900, 4333}, {1800, 2000}, {865, 960} } };/*MCS parameters with Nss = 2 */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 210/826 wifi: ath10k: fix invalid VHT parameters in supported_vht_mcs_rate_nss2
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baochen Qiang <[email protected]>
[ Upstream commit 52db16ec5bae7bd027804265b968259d1a6c3970 ]
In supported_vht_mcs_rate_nss2, the rate for MCS9 & VHT20 is defined as {1560, 1733}, this does not align with firmware's definition and therefore fails the verification in ath10k_mac_get_rate_flags_vht():
invalid vht params rate 1730 100kbps nss 2 mcs 9
and:
invalid vht params rate 1920 100kbps nss 2 mcs 9
Change it to {1730, 1920} to align with firmware to fix the issue.
Since ath10k_hw_params::supports_peer_stats_info is enabled only for QCA6174, this change does not affect other chips.
Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00309-QCARMSWPZ-1
--- drivers/net/wireless/ath/ath10k/mac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath10k/mac.c +1 -1
@@ -9136,7 +9136,7 @@ static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss2[ {6, {5265, 5850}, {2430, 2700}, {1170, 1300} }, {7, {5850, 6500}, {2700, 3000}, {1300, 1444} }, {8, {7020, 7800}, {3240, 3600}, {1560, 1733} }, - {9, {7800, 8667}, {3600, 4000}, {1560, 1733} } + {9, {7800, 8667}, {3600, 4000}, {1730, 1920} } }; static void ath10k_mac_get_rate_flags_ht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 211/826 wifi: ath12k: Skip Rx TID cleanup for self peer
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ramya Gnanasekar <[email protected]>
[ Upstream commit 1a0c640ce1cdcde3eb131a0c1e70ca1ed7cf27cb ]
During peer create, dp setup for the peer is done where Rx TID is updated for all the TIDs. Peer object for self peer will not go through dp setup.
When core halts, dp cleanup is done for all the peers. While cleanup, rx_tid::ab is accessed which causes below stack trace for self peer.
WARNING: CPU: 6 PID: 12297 at drivers/net/wireless/ath/ath12k/dp_rx.c:851 Call Trace: __warn+0x7b/0x1a0 ath12k_dp_rx_frags_cleanup+0xd2/0xe0 [ath12k] report_bug+0x10b/0x200 handle_bug+0x3f/0x70 exc_invalid_op+0x13/0x60 asm_exc_invalid_op+0x16/0x20 ath12k_dp_rx_frags_cleanup+0xd2/0xe0 [ath12k] ath12k_dp_rx_frags_cleanup+0xca/0xe0 [ath12k] ath12k_dp_rx_peer_tid_cleanup+0x39/0xa0 [ath12k] ath12k_mac_peer_cleanup_all+0x61/0x100 [ath12k] ath12k_core_halt+0x3b/0x100 [ath12k] ath12k_core_reset+0x494/0x4c0 [ath12k]
sta object in peer will be updated when remote peer is created. Hence use peer::sta to detect the self peer and skip the cleanup.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/mac.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath12k/mac.c +4 -1
@@ -917,7 +917,10 @@ void ath12k_mac_peer_cleanup_all(struct ath12k *ar)spin_lock_bh (&ab->base_lock);list_for_each_entry_safe (peer, tmp, &ab->peers, list) { -ath12k_dp_rx_peer_tid_cleanup (ar, peer); +/* Skip Rx TID cleanup for self peer */ +if (peer->sta) +ath12k_dp_rx_peer_tid_cleanup (ar, peer); +list_del (&peer->list);kfree (peer); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 212/826 dt-bindings: vendor-prefixes: Add NeoFidelity, Inc
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Igor Prusov <[email protected]>
[ Upstream commit 5d9e6d6fc1b98c8c22d110ee931b3b233d43cd13 ]
Add vendor prefix for NeoFidelity, Inc
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -1013,6 +1013,8 @@ patternProperties: description: Shanghai Neardi Technology Co., Ltd. "^nec,.*": description: NEC LCD Technologies, Ltd. + "^neofidelity,.*": + description: Neofidelity Inc. "^neonode,.*": description: Neonode Inc. "^netgear,.*":
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 213/826 ASoC: fsl_micfil: fix regmap_write_bits usage
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 06df673d20230afb0e383e39235a4fa8b9a62464 ]
The last parameter 1 means BIT(0), which should be the correct BIT(X).
--- sound/soc/fsl/fsl_micfil.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/fsl/fsl_micfil.c +2 -2
@@ -1061,7 +1061,7 @@ static irqreturn_t micfil_isr(int irq, void *devid)regmap_write_bits (micfil->regmap,REG_MICFIL_STAT ,MICFIL_STAT_CHXF (i), -1 ); +MICFIL_STAT_CHXF (i)); }for (i =0 ; i <MICFIL_FIFO_NUM ; i++) {
@@ -1096,7 +1096,7 @@ static irqreturn_t micfil_err_isr(int irq, void *devid)if (stat_reg &MICFIL_STAT_LOWFREQF ) {dev_dbg (&pdev->dev,"isr: ipg_clk_app is too low\n" );regmap_write_bits (micfil->regmap,REG_MICFIL_STAT , -MICFIL_STAT_LOWFREQF ,1 ); +MICFIL_STAT_LOWFREQF ,MICFIL_STAT_LOWFREQF ); }return IRQ_HANDLED ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 214/826 ASoC: dt-bindings: mt6359: Update generic node name and dmic-mode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Macpaul Lin <[email protected]>
[ Upstream commit 4649cbd97fdae5069e9a71cd7669b62b90e03669 ]
Some fix and updates in the following items:
1. examples:
Update generic node name to 'audio-codec' to comply with the coming change in 'mt6359.dtsi'. This change is necessary to fix the dtbs_check error:
pmic: 'mt6359codec' does not match any of the regexes: 'pinctrl-[0-9]+'
2. mediatek,dmic-mode:
After inspecting the .dts and .dtsi files using 'mt6359-codec', it was discovered that the definitions of 'two wires' and 'one wire' are inverted compared to the DT schema.
For example, the following boards using MT6359 PMIC:
- mt8192-asurada.dtsi
- mt8195-cherry.dtsi
These boards use the same definitions of 'dmic-mode' as other boards using MT6358 PMIC. The meaning of '0' or '1' has been noted as comments in the device trees.
Upon examining the code in [1] and [2], it was confirmed that the definitions of 'dmic-mode' are consistent between "MT6359 PMIC" and "MT6358 PMIC". Therefore, the DT Schema should be correct as is.
References:
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6358.c#n1875
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6359.c#L1515
--- Documentation/devicetree/bindings/sound/mt6359.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
Documentation/devicetree/bindings/sound/mt6359.yaml +5 -5
@@ -23,8 +23,8 @@ properties: Indicates how many data pins are used to transmit two channels of PDM signal. 0 means two wires, 1 means one wire. Default value is 0. enum: - - 0 # one wire - - 1 # two wires + - 0 # two wires + - 1 # one wire mediatek,mic-type-0: $ref: /schemas/types.yaml#/definitions/uint32
@@ -53,9 +53,9 @@ additionalProperties: false examples: - | - mt6359codec: mt6359codec { - mediatek,dmic-mode = <0>; - mediatek,mic-type-0 = <2>; + mt6359codec: audio-codec { + mediatek,dmic-mode = <0>; + mediatek,mic-type-0 = <2>; }; ...
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 215/826 drm/amdgpu/gfx9: Add Cleaner Shader Deinitialization in gfx_v9_0 Module
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit e47cb9d2533200d49dd5364d4a148119492f8a3d ]
This commit addresses an omission in the previous patch related to the cleaner shader support for GFX9 hardware. Specifically, it adds the necessary deinitialization code for the cleaner shader in the gfx_v9_0_sw_fini function.
The added line amdgpu_gfx_cleaner_shader_sw_fini(adev); ensures that any allocated resources for the cleaner shader are freed correctly, avoiding potential memory leaks and ensuring that the GPU state is clean for the next initialization sequence.
--- drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +2 -0
@@ -2418,6 +2418,8 @@ static int gfx_v9_0_sw_fini(void *handle)amdgpu_gfx_kiq_free_ring (&adev->gfx.kiq[0 ].ring);amdgpu_gfx_kiq_fini (adev,0 ); +amdgpu_gfx_cleaner_shader_sw_fini (adev); +gfx_v9_0_mec_fini (adev); amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, &adev->gfx.rlc.clear_state_gpu_addr,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 216/826 ASoC: fsl-asoc-card: Add missing handling of {hp,mic}-dt-gpios
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit cfd1054c65eefec30972416a83eb62920bc1ff8d ]
The DT bindings deprecated the "hp-det-gpio" and "mic-det-gpio" properties in favor of "hp-det-gpios" and "mic-det-gpios", but the driver was never updated to support the latter.
Even before, there existed users of "hp-det-gpios" and "mic-det-gpios". While this may have been handled fine by the ASoC core, this was missed by the Freescale-specific part.
--- sound/soc/fsl/fsl-asoc-card.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
sound/soc/fsl/fsl-asoc-card.c +5 -3
@@ -1033,14 +1033,15 @@ static int fsl_asoc_card_probe(struct platform_device *pdev) }/* -* Properties "hp-det-gpio" and "mic-det-gpio" are optional, and +* Properties "hp-det-gpios" and "mic-det-gpios" are optional, and * simple_util_init_jack() uses these properties for creating * Headphone Jack and Microphone Jack. * * The notifier is initialized in snd_soc_card_jack_new(), then * snd_soc_jack_notifier_register can be called. */ -if (of_property_read_bool (np,"hp-det-gpio" )) { +if (of_property_read_bool (np,"hp-det-gpios" ) || +of_property_read_bool (np,"hp-det-gpio" )/* deprecated */ ) { ret =simple_util_init_jack (&priv->card, &priv->hp_jack,1 ,NULL ,"Headphone Jack" );if (ret)
@@ -1049,7 +1050,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)snd_soc_jack_notifier_register (&priv->hp_jack.jack, &hp_jack_nb); } -if (of_property_read_bool (np,"mic-det-gpio" )) { +if (of_property_read_bool (np,"mic-det-gpios" ) || +of_property_read_bool (np,"mic-det-gpio" )/* deprecated */ ) { ret =simple_util_init_jack (&priv->card, &priv->mic_jack,0 ,NULL ,"Mic Jack" );if (ret)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 217/826 drm/bridge: anx7625: Drop EDID cache on bridge power off
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pin-yen Lin <[email protected]>
[ Upstream commit 00ae002116a14c2e6a342c4c9ae080cdbb9b4b21 ]
The bridge might miss the display change events when it's powered off. This happens when a user changes the external monitor when the system is suspended and the embedded controller doesn't not wake AP up.
It's also observed that one DP-to-HDMI bridge doesn't work correctly when there is no EDID read after it is powered on.
Drop the cache to force an EDID read after system resume to fix this.
--- drivers/gpu/drm/bridge/analogix/anx7625.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/bridge/analogix/anx7625.c +2 -0
@@ -2551,6 +2551,8 @@ static int __maybe_unused anx7625_runtime_pm_suspend(struct device *dev)mutex_lock (&ctx->lock);anx7625_stop_dp_work (ctx); +if (!ctx->pdata.panel_bridge) +anx7625_remove_edid (ctx);anx7625_power_standby (ctx);mutex_unlock (&ctx->lock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 218/826 drm/bridge: it6505: Drop EDID cache on bridge power off
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pin-yen Lin <[email protected]>
[ Upstream commit 574c558ddb68591c9a4b7a95e45e935ab22c0fc6 ]
The bridge might miss the display change events when it's powered off. This happens when a user changes the external monitor when the system is suspended and the embedded controller doesn't not wake AP up.
It's also observed that one DP-to-HDMI bridge doesn't work correctly when there is no EDID read after it is powered on.
Drop the cache to force an EDID read after system resume to fix this.
--- drivers/gpu/drm/bridge/ite-it6505.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/bridge/ite-it6505.c +2 -0
@@ -3107,6 +3107,8 @@ static __maybe_unused int it6505_bridge_suspend(struct device *dev) {struct it6505 *it6505 =dev_get_drvdata (dev); +it6505_remove_edid (it6505); +return it6505_poweroff (it6505); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 219/826 libbpf: Fix expected_attach_type set handling in program load callback
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tao Chen <[email protected]>
[ Upstream commit a400d08b3014a4f4e939366bb6fd769b9caff4c9 ]
Referenced commit broke the logic of resetting expected_attach_type to zero for allowed program types if kernel doesn't yet support such field. We do need to overwrite and preserve expected_attach_type for multi-uprobe though, but that can be done explicitly in libbpf_prepare_prog_load().
--- tools/lib/bpf/libbpf.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
tools/lib/bpf/libbpf.c +8 -4
@@ -7352,8 +7352,14 @@ static int libbpf_prepare_prog_load(struct bpf_program *prog, opts->prog_flags |=BPF_F_XDP_HAS_FRAGS ;/* special check for usdt to use uprobe_multi link */ -if ((def &SEC_USDT ) &&kernel_supports (prog->obj,FEAT_UPROBE_MULTI_LINK )) +if ((def &SEC_USDT ) &&kernel_supports (prog->obj,FEAT_UPROBE_MULTI_LINK )) { +/* for BPF_TRACE_UPROBE_MULTI, user might want to query expected_attach_type +* in prog, and expected_attach_type we set in kernel is from opts, so we +* update both. +*/ prog->expected_attach_type =BPF_TRACE_UPROBE_MULTI ; + opts->expected_attach_type =BPF_TRACE_UPROBE_MULTI ; + }if ((def &SEC_ATTACH_BTF ) && !prog->attach_btf_id) {int btf_obj_fd =0 , btf_type_id =0 , err;
@@ -7443,6 +7449,7 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog load_attr.attach_btf_id = prog->attach_btf_id; load_attr.kern_version = kern_version; load_attr.prog_ifindex = prog->prog_ifindex; + load_attr.expected_attach_type = prog->expected_attach_type;/* specify func_info/line_info only if kernel supports them */ if (obj->btf &&btf__fd (obj->btf) >=0 &&kernel_supports (obj,FEAT_BTF_FUNC )) {
@@ -7474,9 +7481,6 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog insns_cnt = prog->insns_cnt; } -/* allow prog_prepare_load_fn to change expected_attach_type */ - load_attr.expected_attach_type = prog->expected_attach_type; -if (obj->gen_loader) { bpf_gen__prog_load(obj->gen_loader, prog->type, prog->name, license, insns, insns_cnt, &load_attr,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 220/826 libbpf: Fix output .symtab byte-order during linking
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit f896b4a5399e97af0b451fcf04754ed316935674 ]
Object linking output data uses the default ELF_T_BYTE type for '.symtab' section data, which disables any libelf-based translation. Explicitly set the ELF_T_SYM type for output to restore libelf's byte-order conversion, noting that input '.symtab' data is already correctly translated.
--- tools/lib/bpf/linker.c | 2 ++ 1 file changed, 2 insertions(+)
tools/lib/bpf/linker.c +2 -0
@@ -396,6 +396,8 @@ static int init_output_elf(struct bpf_linker *linker, const char *file)pr_warn_elf ("failed to create SYMTAB data" );return -EINVAL ; } +/* Ensure libelf translates byte-order of symbol records */ + sec->data->d_type =ELF_T_SYM ; str_off =strset__add_str (linker->strtab_strs, sec->sec_name);if (str_off <0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 221/826 selftests/bpf: Fix uprobe_multi compilation error
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Maguire <[email protected]>
[ Upstream commit c27d8235ba97139d7a085367ff57773902eb3fc5 ]
When building selftests, the following was seen:
uprobe_multi.c: In function ‘trigger_uprobe’:
uprobe_multi.c:108:40: error: ‘MADV_PAGEOUT’ undeclared (first use in this function)
108 | madvise(addr, page_sz, MADV_PAGEOUT);
| ^~~~~~~~~~~~
uprobe_multi.c:108:40: note: each undeclared identifier is reported only once for each function it appears in
make: *** [Makefile:850: bpf-next/tools/testing/selftests/bpf/uprobe_multi] Error 1
...even with updated UAPI headers. It seems the above value is defined in UAPI <linux/mman.h> but including that file triggers other redefinition errors. Simplest solution is to add a guarded definition, as was done for MADV_POPULATE_READ.
--- tools/testing/selftests/bpf/uprobe_multi.c | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/bpf/uprobe_multi.c +4 -0
@@ -12,6 +12,10 @@#define MADV_POPULATE_READ 22#endif +#ifndef MADV_PAGEOUT +#define MADV_PAGEOUT 21 +#endif +int __attribute__((weak))uprobe (void ) {return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 222/826 dlm: fix swapped args sb_flags vs sb_status
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Aring <[email protected]>
[ Upstream commit 6d59f2fbfb18965f76ebcff40ab38da717cde798 ]
The arguments got swapped by commit 986ae3c2a8df ("dlm: fix race between final callback and remove") fixing this now.
--- fs/dlm/ast.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/dlm/ast.c +1 -1
@@ -30,7 +30,7 @@ static void dlm_run_callback(uint32_t ls_id, uint32_t lkb_id, int8_t mode,trace_dlm_bast (ls_id, lkb_id, mode, res_name, res_length);bastfn (astparam, mode); }else if (flags &DLM_CB_CAST ) { -trace_dlm_ast (ls_id, lkb_id, sb_status, sb_flags, res_name, +trace_dlm_ast (ls_id, lkb_id, sb_flags, sb_status, res_name, res_length); lksb->sb_status = sb_status; lksb->sb_flags = sb_flags;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 223/826 wifi: rtl8xxxu: Perform update_beacon_work when beaconing is enabled
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Kaistra <[email protected]>
[ Upstream commit d7063ed6758c62e00a2f56467ded85a021fac67a ]
In STA+AP concurrent mode, performing a scan operation on one vif temporarily stops beacons on the other. When the scan is completed, beacons are enabled again with BSS_CHANGED_BEACON_ENABLED.
We can observe that no beacons are being sent when just rtl8xxxu_start_tx_beacon() is being called.
Thus, also perform update_beacon_work in order to restore beaconing.
--- drivers/net/wireless/realtek/rtl8xxxu/core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtl8xxxu/core.c +4 -2
@@ -5058,10 +5058,12 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, }if (changed &BSS_CHANGED_BEACON_ENABLED ) { -if (bss_conf->enable_beacon) +if (bss_conf->enable_beacon) {rtl8xxxu_start_tx_beacon (priv); -else +schedule_delayed_work (&priv->update_beacon_work,0 ); + }else {rtl8xxxu_stop_tx_beacon (priv); + } }if (changed &BSS_CHANGED_BEACON )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 224/826 ASoC: amd: acp: fix for inconsistent indenting
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vijendar Mukunda <[email protected]>
[ Upstream commit 914219d74931211e719907e0eed03d8133f8b1b7 ]
Fix below Smatch static checker warning:
sound/soc/amd/acp/acp-sdw-sof-mach.c:365 sof_card_dai_links_create()
warn: inconsistent indenting
--- sound/soc/amd/acp/acp-sdw-sof-mach.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/amd/acp/acp-sdw-sof-mach.c +1 -1
@@ -362,7 +362,7 @@ static int sof_card_dai_links_create(struct snd_soc_card *card) dai_links =devm_kcalloc (dev, num_links,sizeof (*dai_links),GFP_KERNEL );if (!dai_links) { ret = -ENOMEM ; - goto err_end; + goto err_end; } card->codec_conf = codec_conf;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 225/826 ASoC: amd: acp: fix for cpu dai index logic
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vijendar Mukunda <[email protected]>
[ Upstream commit 7ce8e4d380d68f34edc96c7efcf95b1476e7f033 ]
Multi link aggregation is not supported for acp6.3 platform. Below combinations are supported.
- one sdw BE DAI <---> one-cpu DAI <---> one-codec DAI
- one sdw BE DAI <---> one-cpu DAI <---> multi-codec DAIs
As Single cpu dai is going to be created, In create_sdw_dailink() function cpu dai index won't be incremented.
Refactor cpu dai index logic to fix below smatch static checker warning. sound/soc/amd/acp/acp-sdw-sof-mach.c:157 create_sdw_dailink()
warn: iterator 'i' not incremented.
--- sound/soc/amd/acp/acp-sdw-sof-mach.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
sound/soc/amd/acp/acp-sdw-sof-mach.c +7 -7
@@ -154,7 +154,7 @@ static int create_sdw_dailink(struct snd_soc_card *card,int num_cpus =hweight32 (sof_dai->link_mask[stream]);int num_codecs = sof_dai->num_devs[stream];int playback, capture; -int i =0 , j =0 ; +int j =0 ;char *name;if (!sof_dai->num_devs[stream])
@@ -213,14 +213,14 @@ static int create_sdw_dailink(struct snd_soc_card *card,int link_num =ffs (sof_end->link_mask) -1 ; - cpus[i].dai_name =devm_kasprintf (dev,GFP_KERNEL , -"SDW%d Pin%d" , - link_num, cpu_pin_id); -dev_dbg (dev,"cpu[%d].dai_name:%s\n" , i, cpus[i].dai_name); -if (!cpus[i].dai_name) + cpus->dai_name =devm_kasprintf (dev,GFP_KERNEL , +"SDW%d Pin%d" , + link_num, cpu_pin_id); +dev_dbg (dev,"cpu->dai_name:%s\n" , cpus->dai_name); +if (!cpus->dai_name)return -ENOMEM ; - codec_maps[j].cpu = i; + codec_maps[j].cpu =0 ; codec_maps[j].codec = j; codecs[j].name = sof_end->codec_name;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 226/826 drm/amd/display: fix a memleak issue when driver is removed
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aurabindo Pillai <[email protected]>
[ Upstream commit d4f36e5fd800de7db74c1c4e62baf24a091a5ff6 ]
Running "modprobe amdgpu" the second time (followed by a modprobe -r amdgpu) causes a call trace like:
[ 845.212163] Memory manager not clean during takedown. [ 845.212170] WARNING: CPU: 4 PID: 2481 at drivers/gpu/drm/drm_mm.c:999 drm_mm_takedown+0x2b/0x40 [ 845.212177] Modules linked in: amdgpu(OE-) amddrm_ttm_helper(OE) amddrm_buddy(OE) amdxcp(OE) amd_sched(OE) drm_exec drm_suballoc_helper drm_display_helper i2c_algo_bit amdttm(OE) amdkcl(OE) cec rc_core sunrpc qrtr intel_rapl_msr intel_rapl_common snd_hda_codec_hdmi edac_mce_amd snd_hda_intel snd_intel_dspcfg snd_intel_sdw_acpi snd_usb_audio snd_hda_codec snd_usbmidi_lib kvm_amd snd_hda_core snd_ump mc snd_hwdep kvm snd_pcm snd_seq_midi snd_seq_midi_event irqbypass crct10dif_pclmul snd_rawmidi polyval_clmulni polyval_generic ghash_clmulni_intel sha256_ssse3 sha1_ssse3 snd_seq aesni_intel crypto_simd snd_seq_device cryptd snd_timer mfd_aaeon asus_nb_wmi eeepc_wmi joydev asus_wmi snd ledtrig_audio sparse_keymap ccp wmi_bmof input_leds k10temp i2c_piix4 platform_profile rapl soundcore gpio_amdpt mac_hid binfmt_misc msr parport_pc ppdev lp parport efi_pstore nfnetlink dmi_sysfs ip_tables x_tables autofs4 hid_logitech_hidpp hid_logitech_dj hid_generic usbhid hid ahci xhci_pci igc crc32_pclmul libahci xhci_pci_renesas video [ 845.212284] wmi [last unloaded: amddrm_ttm_helper(OE)] [ 845.212290] CPU: 4 PID: 2481 Comm: modprobe Tainted: G W OE 6.8.0-31-generic #31-Ubuntu [ 845.212296] RIP: 0010:drm_mm_takedown+0x2b/0x40 [ 845.212300] Code: 1f 44 00 00 48 8b 47 38 48 83 c7 38 48 39 f8 75 09 31 c0 31 ff e9 90 2e 86 00 55 48 c7 c7 d0 f6 8e 8a 48 89 e5 e8 f5 db 45 ff <0f> 0b 5d 31 c0 31 ff e9 74 2e 86 00 66 0f 1f 84 00 00 00 00 00 90 [ 845.212302] RSP: 0018:ffffb11302127ae0 EFLAGS: 00010246 [ 845.212305] RAX: 0000000000000000 RBX: ffff92aa5020fc08 RCX: 0000000000000000 [ 845.212307] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 [ 845.212309] RBP: ffffb11302127ae0 R08: 0000000000000000 R09: 0000000000000000 [ 845.212310] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000004 [ 845.212312] R13: ffff92aa50200000 R14: ffff92aa5020fb10 R15: ffff92aa5020faa0 [ 845.212313] FS: 0000707dd7c7c080(0000) GS:ffff92b93de00000(0000) knlGS:0000000000000000 [ 845.212316] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 845.212318] CR2: 00007d48b0aee200 CR3: 0000000115a58000 CR4: 0000000000f50ef0 [ 845.212320] PKRU: 55555554 [ 845.212321] Call Trace: [ 845.212323] <TASK> [ 845.212328] ? show_regs+0x6d/0x80 [ 845.212333] ? __warn+0x89/0x160 [ 845.212339] ? drm_mm_takedown+0x2b/0x40 [ 845.212344] ? report_bug+0x17e/0x1b0 [ 845.212350] ? handle_bug+0x51/0xa0 [ 845.212355] ? exc_invalid_op+0x18/0x80 [ 845.212359] ? asm_exc_invalid_op+0x1b/0x20 [ 845.212366] ? drm_mm_takedown+0x2b/0x40 [ 845.212371] amdgpu_gtt_mgr_fini+0xa9/0x130 [amdgpu] [ 845.212645] amdgpu_ttm_fini+0x264/0x340 [amdgpu] [ 845.212770] amdgpu_bo_fini+0x2e/0xc0 [amdgpu] [ 845.212894] gmc_v12_0_sw_fini+0x2a/0x40 [amdgpu] [ 845.213036] amdgpu_device_fini_sw+0x11a/0x590 [amdgpu] [ 845.213159] amdgpu_driver_release_kms+0x16/0x40 [amdgpu] [ 845.213302] devm_drm_dev_init_release+0x5e/0x90 [ 845.213305] devm_action_release+0x12/0x30 [ 845.213308] release_nodes+0x42/0xd0 [ 845.213311] devres_release_all+0x97/0xe0 [ 845.213314] device_unbind_cleanup+0x12/0x80 [ 845.213317] device_release_driver_internal+0x230/0x270 [ 845.213319] ? srso_alias_return_thunk+0x5/0xfbef5
This is caused by lost memory during early init phase. First time driver is removed, memory is freed but when second time the driver is inserted, VBIOS dmub is not active, since the PSP policy is to retain the driver loaded version on subsequent warm boots. Hence, communication with VBIOS DMUB fails.
Fix this by aborting further communication with vbios dmub and release the memory immediately.
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 32 ++++++++++++++++--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 3 ++ .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 13 ++------ 3 files changed, 33 insertions(+), 15 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +28 -4
@@ -1696,6 +1696,26 @@ dm_allocate_gpu_mem(return da->cpu_ptr; } +void +dm_free_gpu_mem ( +struct amdgpu_device *adev, +enum dc_gpu_mem_alloc_type type, +void *pvMem) +{ +struct dal_allocation *da; + +/* walk the da list in DM */ +list_for_each_entry (da, &adev->dm.da_list, list) { +if (pvMem == da->cpu_ptr) { +amdgpu_bo_free_kernel (&da->bo, &da->gpu_addr, &da->cpu_ptr); +list_del (&da->list); +kfree (da); +break ; + } + } + +} + static enum dmub_status dm_dmub_send_vbios_gpint_command(struct amdgpu_device *adev, enum dmub_gpint_command command_code,
@@ -1762,16 +1782,20 @@ static struct dml2_soc_bb *dm_dmub_get_vbios_bounding_box(struct amdgpu_device */* Send the chunk */ ret =dm_dmub_send_vbios_gpint_command (adev, send_addrs[i], chunk,30000 );if (ret !=DMUB_STATUS_OK ) -/* No need to free bb here since it shall be done in dm_sw_fini() */ -return NULL ; + goto free_bb; }/* Now ask DMUB to copy the bb */ ret =dm_dmub_send_vbios_gpint_command (adev,DMUB_GPINT__BB_COPY ,1 ,200000 );if (ret !=DMUB_STATUS_OK ) -return NULL ; + goto free_bb;return bb; + +free_bb: +dm_free_gpu_mem (adev,DC_MEM_ALLOC_TYPE_GART , (void *) bb); +return NULL ; + } static enum dmub_ips_disable_type dm_get_default_ips_mode(
@@ -2541,11 +2565,11 @@ static int dm_sw_fini(void *handle)amdgpu_bo_free_kernel (&da->bo, &da->gpu_addr, &da->cpu_ptr);list_del (&da->list);kfree (da); + adev->dm.bb_from_dmub =NULL ;break ; } } - adev->dm.bb_from_dmub =NULL ;kfree (adev->dm.dmub_fb_info); adev->dm.dmub_fb_info =NULL ;
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +3 -0
@@ -1004,6 +1004,9 @@ void *dm_allocate_gpu_mem(struct amdgpu_device *adev,enum dc_gpu_mem_alloc_type type, size_t size, long long *addr); +void dm_free_gpu_mem (struct amdgpu_device *adev, +enum dc_gpu_mem_alloc_type type, +void *addr);bool amdgpu_dm_is_headless (struct amdgpu_device *adev);
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +2 -11
@@ -1055,17 +1055,8 @@ void dm_helpers_free_gpu_mem( void *pvMem) {struct amdgpu_device *adev = ctx->driver_context; -struct dal_allocation *da; - -/* walk the da list in DM */ -list_for_each_entry (da, &adev->dm.da_list, list) { -if (pvMem == da->cpu_ptr) { -amdgpu_bo_free_kernel (&da->bo, &da->gpu_addr, &da->cpu_ptr); -list_del (&da->list); -kfree (da); -break ; - } - } + +dm_free_gpu_mem (adev, type, pvMem); }bool dm_helpers_dmub_outbox_interrupt_control (struct dc_context *ctx,bool enable)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 227/826 wifi: ath12k: fix use-after-free in ath12k_dp_cc_cleanup()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rameshkumar Sundaram <[email protected]>
[ Upstream commit bdb281103373fd80eb5c91cede1e115ba270b4e9 ]
During ath12k module removal, in ath12k_core_deinit(), ath12k_mac_destroy() un-registers ah->hw from mac80211 and frees the ah->hw as well as all the ar's in it. After this ath12k_core_soc_destroy()-> ath12k_dp_free()-> ath12k_dp_cc_cleanup() tries to access one of the freed ar's from pending skb.
This is because during mac destroy, driver failed to flush few data packets, which were accessed later in ath12k_dp_cc_cleanup() and freed, but using ar from the packet led to this use-after-free.
BUG: KASAN: use-after-free in ath12k_dp_cc_cleanup.part.0+0x5e2/0xd40 [ath12k] Write of size 4 at addr ffff888150bd3514 by task modprobe/8926 CPU: 0 UID: 0 PID: 8926 Comm: modprobe Not tainted 6.11.0-rc2-wt-ath+ #1746 Hardware name: Intel(R) Client Systems NUC8i7HVK/NUC8i7HVB, BIOS
HNKBLi70.86A.0067.2021.0528.1339 05/28/2021
Call Trace: <TASK> dump_stack_lvl+0x7d/0xe0 print_address_description.constprop.0+0x33/0x3a0 print_report+0xb5/0x260 ? kasan_addr_to_slab+0x24/0x80 kasan_report+0xd8/0x110 ? ath12k_dp_cc_cleanup.part.0+0x5e2/0xd40 [ath12k] ? ath12k_dp_cc_cleanup.part.0+0x5e2/0xd40 [ath12k] kasan_check_range+0xf3/0x1a0 __kasan_check_write+0x14/0x20 ath12k_dp_cc_cleanup.part.0+0x5e2/0xd40 [ath12k] ath12k_dp_free+0x178/0x420 [ath12k] ath12k_core_stop+0x176/0x200 [ath12k] ath12k_core_deinit+0x13f/0x210 [ath12k] ath12k_pci_remove+0xad/0x1c0 [ath12k] pci_device_remove+0x9b/0x1b0 device_remove+0xbf/0x150 device_release_driver_internal+0x3c3/0x580 ? __kasan_check_read+0x11/0x20 driver_detach+0xc4/0x190 bus_remove_driver+0x130/0x2a0 driver_unregister+0x68/0x90 pci_unregister_driver+0x24/0x240 ? find_module_all+0x13e/0x1e0 ath12k_pci_exit+0x10/0x20 [ath12k] __do_sys_delete_module+0x32c/0x580 ? module_flags+0x2f0/0x2f0 ? kmem_cache_free+0xf0/0x410 ? __fput+0x56f/0xab0 ? __fput+0x56f/0xab0 ? debug_smp_processor_id+0x17/0x20 __x64_sys_delete_module+0x4f/0x70 x64_sys_call+0x522/0x9f0 do_syscall_64+0x64/0x130 entry_SYSCALL_64_after_hwframe+0x4b/0x53 RIP: 0033:0x7f8182c6ac8b
Commit 24de1b7b231c ("wifi: ath12k: fix flush failure in recovery scenarios") added the change to decrement the pending packets count in case of recovery which make sense as ah->hw as well all ar's in it are intact during recovery, but during core deinit there is no use in decrementing packets count or waking up the empty waitq as the module is going to be removed also ar's from pending skb's can't be used and the packets should just be released back.
To fix this, avoid accessing ar from skb->cb when driver is being unregistered.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.1.1-00214-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/dp.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/net/wireless/ath/ath12k/dp.c +10 -4
@@ -1202,10 +1202,16 @@ static void ath12k_dp_cc_cleanup(struct ath12k_base *ab)if (!skb)continue ; - skb_cb =ATH12K_SKB_CB (skb); - ar = skb_cb->ar; -if (atomic_dec_and_test (&ar->dp.num_tx_pending)) -wake_up (&ar->dp.tx_empty_waitq); +/* if we are unregistering, hw would've been destroyed and +* ar is no longer valid. +*/ +if (!(test_bit (ATH12K_FLAG_UNREGISTERING , &ab->dev_flags))) { + skb_cb =ATH12K_SKB_CB (skb); + ar = skb_cb->ar; + +if (atomic_dec_and_test (&ar->dp.num_tx_pending)) +wake_up (&ar->dp.tx_empty_waitq); + }dma_unmap_single (ab->dev,ATH12K_SKB_CB (skb)->paddr, skb->len,DMA_TO_DEVICE );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 228/826 wifi: ath12k: fix one more memcpy size error
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 19c23eb61fa4c802e6e0aaf74d6f7dcbe99f0ba3 ]
A previous patch addressed a fortified-memcpy warning on older compilers, but there is still a warning on gcc-14 in some configurations:
In file included from include/linux/string.h:390,
from drivers/net/wireless/ath/ath12k/wow.c:7:drivers/net/wireless/ath/ath12k/wow.c: In function 'ath12k_wow_convert_8023_to_80211.isra':include/linux/fortify-string.h:114:33: error: '__builtin_memcpy' accessing 18446744073709551610 or more bytes at offsets 0 and 0 overlaps 9223372036854775797 bytes at offset -9223372036854775803 [-Werror=restrict] include/linux/fortify-string.h:679:26: note: in expansion of macro '__fortify_memcpy_chk'
679 | #define memcpy(p, q, s) __fortify_memcpy_chk(p, q, s, \
| ^~~~~~~~~~~~~~~~~~~~
drivers/net/wireless/ath/ath12k/wow.c:199:25: note: in expansion of macro 'memcpy'
199 | memcpy(pat + a3_ofs - pkt_ofs,
| ^~~~~~Address this the same way as the other two, using size_add().
--- drivers/net/wireless/ath/ath12k/wow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath12k/wow.c +1 -1
@@ -191,7 +191,7 @@ ath12k_wow_convert_8023_to_80211(struct ath12k *ar,memcpy (bytemask, eth_bytemask, eth_pat_len); pat_len = eth_pat_len; - }else if (eth_pkt_ofs + eth_pat_len < prot_ofs) { + }else if (size_add (eth_pkt_ofs, eth_pat_len) < prot_ofs) {memcpy (pat, eth_pat,ETH_ALEN - eth_pkt_ofs);memcpy (bytemask, eth_bytemask,ETH_ALEN - eth_pkt_ofs);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 229/826 libbpf: Add missing per-arch include path
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Björn Töpel <[email protected]>
[ Upstream commit 710fbca820c721cdd60fa8c5bbe9deb4c0788aae ]
libbpf does not include the per-arch tools include path, e.g. tools/arch/riscv/include. Some architectures depend those files to build properly.
Include tools/arch/$(SUBARCH)/include in the libbpf build.
--- tools/lib/bpf/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/lib/bpf/Makefile +2 -1
@@ -61,7 +61,8 @@ ifndef VERBOSE endif INCLUDES = -I$(or $(OUTPUT),.) \ - -I$(srctree)/tools/include -I$(srctree)/tools/include/uapi + -I$(srctree)/tools/include -I$(srctree)/tools/include/uapi \ + -I$(srctree)/tools/arch/$(SRCARCH)/include export prefix libdir src obj
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 230/826 selftests: bpf: Add missing per-arch include path
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Björn Töpel <[email protected]>
[ Upstream commit 19090f0306f1748980596c6c71f1c4b128639cff ]
The prog_tests programs do not include the per-arch tools include path, e.g. tools/arch/riscv/include. Some architectures depend those files to build properly.
Include tools/arch/$(SUBARCH)/include in the selftests bpf build.
--- tools/testing/selftests/bpf/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/testing/selftests/bpf/Makefile +2 -1
@@ -10,6 +10,7 @@ TOOLSDIR := $(abspath ../../..) LIBDIR := $(TOOLSDIR)/lib BPFDIR := $(LIBDIR)/bpf TOOLSINCDIR := $(TOOLSDIR)/include +TOOLSARCHINCDIR := $(TOOLSDIR)/arch/$(SRCARCH)/include BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool APIDIR := $(TOOLSINCDIR)/uapi ifneq ($(O),)
@@ -44,7 +45,7 @@ CFLAGS += -g $(OPT_FLAGS) -rdynamic \ -Wall -Werror -fno-omit-frame-pointer \ $(GENFLAGS) $(SAN_CFLAGS) $(LIBELF_CFLAGS) \ -I$(CURDIR) -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) \ - -I$(TOOLSINCDIR) -I$(APIDIR) -I$(OUTPUT) + -I$(TOOLSINCDIR) -I$(TOOLSARCHINCDIR) -I$(APIDIR) -I$(OUTPUT) LDFLAGS += $(SAN_LDFLAGS) LDLIBS += $(LIBELF_LIBS) -lz -lrt -lpthread
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 231/826 bpf: Fix the xdp_adjust_tail sample prog issue
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Chen <[email protected]>
[ Upstream commit 4236f114a3ffbbfd217436c08852e94cae372f57 ]
During the xdp_adjust_tail test, probabilistic failure occurs and SKB package is discarded by the kernel. After checking the issues by tracking SKB package, it is identified that they were caused by checksum errors. Refer to checksum of the arch/arm64/include/asm/checksum.h for fixing.
v2: Based on Alexei Starovoitov's suggestions, it is necessary to keep the code
implementation consistent.
--- samples/bpf/xdp_adjust_tail_kern.c | 1 + 1 file changed, 1 insertion(+)
samples/bpf/xdp_adjust_tail_kern.c +1 -0
@@ -57,6 +57,7 @@ static __always_inline void swap_mac(void *data, struct ethhdr *orig_eth) static __always_inline __u16 csum_fold_helper(__u32 csum) { + csum = (csum &0xffff ) + (csum >>16 );return ~((csum &0xffff ) + (csum >>16 )); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 232/826 selftests/bpf: Fix backtrace printing for selftests crashes
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
[ Upstream commit 5bf1557e3d6a69113649d831276ea2f97585fc33 ]
test_progs uses glibc specific functions backtrace() and backtrace_symbols_fd() to print backtrace in case of SIGSEGV.
Recent commit (see fixes) updated test_progs.c to define stub versions of the same functions with attriubte "weak" in order to allow linking test_progs against musl libc. Unfortunately this broke the backtrace handling for glibc builds.
As it turns out, glibc defines backtrace() and backtrace_symbols_fd() as weak:
$ llvm-readelf --symbols /lib64/libc.so.6 \
| grep -P '( backtrace_symbols_fd| backtrace)$'
4910: 0000000000126b40 161 FUNC WEAK DEFAULT 16 backtrace
6843: 0000000000126f90 852 FUNC WEAK DEFAULT 16 backtrace_symbols_fdSo does test_progs:
$ llvm-readelf --symbols test_progs \
| grep -P '( backtrace_symbols_fd| backtrace)$'
2891: 00000000006ad190 15 FUNC WEAK DEFAULT 13 backtrace
11215: 00000000006ad1a0 41 FUNC WEAK DEFAULT 13 backtrace_symbols_fdIn such situation dynamic linker is not obliged to favour glibc implementation over the one defined in test_progs.
Compiling with the following simple modification to test_progs.c demonstrates the issue:
$ git diff
...
\--- a/tools/testing/selftests/bpf/test_progs.c
\+++ b/tools/testing/selftests/bpf/test_progs.c
\@@ -1817,6 +1817,7 @@ int main(int argc, char **argv)
if (err)
return err; + *(int *)0xdeadbeef = 42;
err = cd_flavor_subdir(argv[0]);
if (err)
return err;$ ./test_progs [0]: Caught signal #11! Stack trace: <backtrace not supported> Segmentation fault (core dumped)
Resolve this by hiding stub definitions behind __GLIBC__ macro check instead of using "weak" attribute.
--- tools/testing/selftests/bpf/test_progs.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
tools/testing/selftests/bpf/test_progs.c +6 -3
@@ -20,11 +20,13 @@#include "network_helpers.h" +/* backtrace() and backtrace_symbols_fd() are glibc specific, +* use header file when glibc is available and provide stub +* implementations when another libc implementation is used. +*/ #ifdef __GLIBC__#include <execinfo.h> /* backtrace */ -#endif - -/* Default backtrace funcs if missing at link */ +#else __weak int backtrace (void **buffer,int size) {return 0 ;
@@ -34,6 +36,7 @@ __weak void backtrace_symbols_fd(void *const *buffer, int size, int fd) {dprintf (fd,"<backtrace not supported>\n" ); } +#endif /*__GLIBC__ */ int env_verbosity =0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 233/826 wifi: ath11k: Fix CE offset address calculation for WCN6750 in SSR
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Balaji Pothunoori <[email protected]>
[ Upstream commit 4c57ec6c4bb9979b42ae7fa7273fc2d4a361d576 ]
Currently, mem_ce and mem iomem addresses are used to calculate the CE offset address. mem_ce is initialized with mem address, and for targets where ce_remap is needed, mem_ce is remapped to a new address space during AHB probe.
For targets such as WCN6750 in which CE address space is same as WCSS address space (i.e. "ce_remap" hw_param is set to false), mem_ce and mem iomem addresses are same. In the initial SRNG setup for such targets, the CE offset address and hence CE register base addresses are calculated correctly in ath11k_hal_srng_init() as both mem and mem_ce are initialized with same iomem address.
Later, after the firmware download, mem is initialized with BAR address received in qmi_wlanfw_device_info_resp_msg_v01 QMI message, while mem_ce is not updated.
After initial setup success, during Subsystem Restart (SSR), as part of reinitialization, ath11k_hal_srng_init() will be called again, and CE offset address will be calculated incorrectly this time as mem_ce address was not updated. Due to the incorrect CE offset address, APPS accesses an invalid CE register address which leads to improper behavior in firmware after SSR is triggered.
To fix the above issue, update mem_ce to mem iomem address in ath11k_qmi_request_device_info() for targets which do not support ce_remap feature.
--- drivers/net/wireless/ath/ath11k/qmi.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/ath/ath11k/qmi.c +3 -0
@@ -2180,6 +2180,9 @@ static int ath11k_qmi_request_device_info(struct ath11k_base *ab) ab->mem = bar_addr_va; ab->mem_len = resp.bar_size; +if (!ab->hw_params.ce_remap) + ab->mem_ce = ab->mem; +return 0 ; out:return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 234/826 selftests/bpf: add missing header include for htons
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexis Lothoré (eBPF Foundation) <[email protected]>
[ Upstream commit bc9b3fb827fceec4e05564d6e668280f4470ab5b ]
Including the network_helpers.h header in tests can lead to the following build error:
./network_helpers.h: In function ‘csum_tcpudp_magic’:
./network_helpers.h:116:14: error: implicit declaration of function \
‘htons’ [-Werror=implicit-function-declaration]
116 | s += htons(proto + len);
The error is avoided in many cases thanks to some other headers included earlier and bringing in arpa/inet.h (ie: test_progs.h).
Make sure that test_progs build success does not depend on header ordering by adding the missing header include in network_helpers.h
--- tools/testing/selftests/bpf/network_helpers.h | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/network_helpers.h +1 -0
@@ -1,6 +1,7 @@/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __NETWORK_HELPERS_H#define __NETWORK_HELPERS_H +#include <arpa/inet.h> #include <sys/socket.h> #include <sys/types.h> #include <linux/types.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 235/826 wifi: cfg80211: check radio iface combination for multi radio per wiphy
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karthikeyan Periyasamy <[email protected]>
[ Upstream commit bd9813d13be439851a7ff3e6372e53caa6e387a6 ]
Currently, wiphy_verify_combinations() fails for the multi-radio per wiphy due to the condition check on new global interface combination that DFS only works on one channel. In a multi-radio scenario, new global interface combination encompasses the capabilities of all radio combinations, so it supports more than one channel with DFS. For multi-radio per wiphy, interface combination verification needs to be performed for radio specific interface combinations. This is necessary as the new global interface combination combines the capabilities of all radio combinations.
--- net/wireless/core.c | 64 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 10 deletions(-)
net/wireless/core.c +54 -10
@@ -603,16 +603,20 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv, }EXPORT_SYMBOL (wiphy_new_nm); -static int wiphy_verify_combinations (struct wiphy *wiphy) +static +int wiphy_verify_iface_combinations (struct wiphy *wiphy, +const struct ieee80211_iface_combination *iface_comb, +int n_iface_comb, +bool combined_radio) {const struct ieee80211_iface_combination *c;int i, j; -for (i =0 ; i < wiphy->n_iface_combinations; i++) { +for (i =0 ; i < n_iface_comb; i++) {u32 cnt =0 ;u16 all_iftypes =0 ; - c = &wiphy->iface_combinations[i]; + c = &iface_comb[i];/* * Combinations with just one interface aren't real,
@@ -625,9 +629,13 @@ static int wiphy_verify_combinations(struct wiphy *wiphy)if (WARN_ON (!c->num_different_channels))return -EINVAL ; -/* DFS only works on one channel. */ -if (WARN_ON (c->radar_detect_widths && - (c->num_different_channels >1 ))) +/* DFS only works on one channel. Avoid this check +* for multi-radio global combination, since it hold +* the capabilities of all radio combinations. +*/ +if (!combined_radio && +WARN_ON (c->radar_detect_widths && + c->num_different_channels >1 ))return -EINVAL ;if (WARN_ON (!c->n_limits))
@@ -648,13 +656,21 @@ static int wiphy_verify_combinations(struct wiphy *wiphy)if (WARN_ON (wiphy->software_iftypes & types))return -EINVAL ; -/* Only a single P2P_DEVICE can be allowed */ -if (WARN_ON (types &BIT (NL80211_IFTYPE_P2P_DEVICE ) && +/* Only a single P2P_DEVICE can be allowed, avoid this +* check for multi-radio global combination, since it +* hold the capabilities of all radio combinations. +*/ +if (!combined_radio && +WARN_ON (types &BIT (NL80211_IFTYPE_P2P_DEVICE ) && c->limits[j].max >1 ))return -EINVAL ; -/* Only a single NAN can be allowed */ -if (WARN_ON (types &BIT (NL80211_IFTYPE_NAN ) && +/* Only a single NAN can be allowed, avoid this +* check for multi-radio global combination, since it +* hold the capabilities of all radio combinations. +*/ +if (!combined_radio && +WARN_ON (types &BIT (NL80211_IFTYPE_NAN ) && c->limits[j].max >1 ))return -EINVAL ;
@@ -693,6 +709,34 @@ static int wiphy_verify_combinations(struct wiphy *wiphy)return 0 ; } +static int wiphy_verify_combinations (struct wiphy *wiphy) +{ +int i, ret; +bool combined_radio = false; + +if (wiphy->n_radio) { +for (i =0 ; i < wiphy->n_radio; i++) { +const struct wiphy_radio *radio = &wiphy->radio[i]; + + ret =wiphy_verify_iface_combinations (wiphy, + radio->iface_combinations, + radio->n_iface_combinations, + false); +if (ret) +return ret; + } + + combined_radio = true; + } + + ret =wiphy_verify_iface_combinations (wiphy, + wiphy->iface_combinations, + wiphy->n_iface_combinations, + combined_radio); + +return ret; +} +int wiphy_register (struct wiphy *wiphy) {struct cfg80211_registered_device *rdev =wiphy_to_rdev (wiphy);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 236/826 ice: consistently use q_idx in ice_vc_cfg_qs_msg()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Keller <[email protected]>
[ Upstream commit a884c304e18a40e1c7a6525a9274e64c2c061c3f ]
The ice_vc_cfg_qs_msg() function is used to configure VF queues in response to a VIRTCHNL_OP_CONFIG_VSI_QUEUES command.
The virtchnl command contains an array of queue pair data for configuring Tx and Rx queues. This data includes a queue ID. When configuring the queues, the driver generally uses this queue ID to determine which Tx and Rx ring to program. However, a handful of places use the index into the queue pair data from the VF. While most VF implementations appear to send this data in order, it is not mandated by the virtchnl and it is not verified that the queue pair data comes in order.
Fix the driver to consistently use the q_idx field instead of the 'i' iterator value when accessing the rings. For the Rx case, introduce a local ring variable to keep lines short.
--- drivers/net/ethernet/intel/ice/ice_virtchnl.c | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-)
drivers/net/ethernet/intel/ice/ice_virtchnl.c +10 -11
@@ -1715,8 +1715,8 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)/* copy Tx queue info from VF into VSI */ if (qpi->txq.ring_len >0 ) { - vsi->tx_rings[i]->dma = qpi->txq.dma_ring_addr; - vsi->tx_rings[i]->count = qpi->txq.ring_len; + vsi->tx_rings[q_idx]->dma = qpi->txq.dma_ring_addr; + vsi->tx_rings[q_idx]->count = qpi->txq.ring_len;/* Disable any existing queue first */ if (ice_vf_vsi_dis_single_txq (vf, vsi, q_idx))
@@ -1725,7 +1725,7 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)/* Configure a queue with the requested settings */ if (ice_vsi_cfg_single_txq (vsi, vsi->tx_rings, q_idx)) {dev_warn (ice_pf_to_dev (pf),"VF-%d failed to configure TX queue %d\n" , - vf->vf_id, i); + vf->vf_id, q_idx); goto error_param; } }
@@ -1733,24 +1733,23 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)/* copy Rx queue info from VF into VSI */ if (qpi->rxq.ring_len >0 ) {u16 max_frame_size =ice_vc_get_max_frame_size (vf); +struct ice_rx_ring *ring = vsi->rx_rings[q_idx];u32 rxdid; - vsi->rx_rings[i]->dma = qpi->rxq.dma_ring_addr; - vsi->rx_rings[i]->count = qpi->rxq.ring_len; + ring->dma = qpi->rxq.dma_ring_addr; + ring->count = qpi->rxq.ring_len;if (qpi->rxq.crc_disable) - vsi->rx_rings[q_idx]->flags |= -ICE_RX_FLAGS_CRC_STRIP_DIS ; + ring->flags |=ICE_RX_FLAGS_CRC_STRIP_DIS ;else - vsi->rx_rings[q_idx]->flags &= - ~ICE_RX_FLAGS_CRC_STRIP_DIS ; + ring->flags &= ~ICE_RX_FLAGS_CRC_STRIP_DIS ;if (qpi->rxq.databuffer_size !=0 && (qpi->rxq.databuffer_size > ((16 *1024 ) -128 ) || qpi->rxq.databuffer_size <1024 )) goto error_param; vsi->rx_buf_len = qpi->rxq.databuffer_size; - vsi->rx_rings[i]->rx_buf_len = vsi->rx_buf_len; + ring->rx_buf_len = vsi->rx_buf_len;if (qpi->rxq.max_pkt_size > max_frame_size || qpi->rxq.max_pkt_size <64 ) goto error_param;
@@ -1765,7 +1764,7 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)if (ice_vsi_cfg_single_rxq (vsi, q_idx)) {dev_warn (ice_pf_to_dev (pf),"VF-%d failed to configure RX queue %d\n" , - vf->vf_id, i); + vf->vf_id, q_idx); goto error_param; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 237/826 drm/vc4: hdmi: Increase audio MAI fifo dreq threshold
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dom Cobley <[email protected]>
[ Upstream commit 59f8b2b7fb8e460881d21c7d5b32604993973879 ]
Now we wait for write responses and have a burst size of 4, we can set the fifo threshold much higher.
Set it to 28 (of the 32 entry size) to keep fifo
fuller and reduce chance of underflow.
Stable-dep-of: cf1c87d978d4 ("drm/vc4: Match drm_dev_enter and exit calls in vc4_hvs_lut_load")
--- drivers/gpu/drm/vc4/vc4_hdmi.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/gpu/drm/vc4/vc4_hdmi.c +13 -5
@@ -2051,6 +2051,7 @@ static int vc4_hdmi_audio_prepare(struct device *dev, void *data,struct vc4_hdmi *vc4_hdmi =dev_get_drvdata (dev);struct drm_device *drm = vc4_hdmi->connector.dev;struct drm_connector *connector = &vc4_hdmi->connector; +struct vc4_dev *vc4 =to_vc4_dev (drm);unsigned int sample_rate = params->sample_rate;unsigned int channels = params->channels;unsigned long flags;
@@ -2108,11 +2109,18 @@ static int vc4_hdmi_audio_prepare(struct device *dev, void *data, VC4_HDMI_AUDIO_PACKET_CEA_MASK);/* Set the MAI threshold */ -HDMI_WRITE (HDMI_MAI_THR , -VC4_SET_FIELD (0x08 ,VC4_HD_MAI_THR_PANICHIGH ) | -VC4_SET_FIELD (0x08 ,VC4_HD_MAI_THR_PANICLOW ) | -VC4_SET_FIELD (0x06 ,VC4_HD_MAI_THR_DREQHIGH ) | -VC4_SET_FIELD (0x08 ,VC4_HD_MAI_THR_DREQLOW )); +if (vc4->is_vc5) +HDMI_WRITE (HDMI_MAI_THR , +VC4_SET_FIELD (0x10 ,VC4_HD_MAI_THR_PANICHIGH ) | +VC4_SET_FIELD (0x10 ,VC4_HD_MAI_THR_PANICLOW ) | +VC4_SET_FIELD (0x1c ,VC4_HD_MAI_THR_DREQHIGH ) | +VC4_SET_FIELD (0x1c ,VC4_HD_MAI_THR_DREQLOW )); +else +HDMI_WRITE (HDMI_MAI_THR , +VC4_SET_FIELD (0x8 ,VC4_HD_MAI_THR_PANICHIGH ) | +VC4_SET_FIELD (0x8 ,VC4_HD_MAI_THR_PANICLOW ) | +VC4_SET_FIELD (0x6 ,VC4_HD_MAI_THR_DREQHIGH ) | +VC4_SET_FIELD (0x8 ,VC4_HD_MAI_THR_DREQLOW )); HDMI_WRITE(HDMI_MAI_CONFIG, VC4_HDMI_MAI_CONFIG_BIT_REVERSE |
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 238/826 drm/vc4: Introduce generation number enum
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Ripard <[email protected]>
[ Upstream commit 24c5ed3ddf27313b248900455b0312bd7a9d3554 ]
With the introduction of the BCM2712 support, we will get yet another generation of display engine to support.
The binary check of whether it's VC5 or not thus doesn't work anymore, especially since some parts of the driver will have changed with BCM2711, and some others with BCM2712.
Let's introduce an enum to store the generation the driver is running on, which should provide more flexibility.
Stable-dep-of: cf1c87d978d4 ("drm/vc4: Match drm_dev_enter and exit calls in vc4_hvs_lut_load")
--- drivers/gpu/drm/vc4/tests/vc4_mock.c | 12 +++---- drivers/gpu/drm/vc4/vc4_bo.c | 28 +++++++-------- drivers/gpu/drm/vc4/vc4_crtc.c | 13 ++++--- drivers/gpu/drm/vc4/vc4_drv.c | 22 +++++++----- drivers/gpu/drm/vc4/vc4_drv.h | 7 +++- drivers/gpu/drm/vc4/vc4_gem.c | 24 ++++++------- drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +- drivers/gpu/drm/vc4/vc4_hvs.c | 42 ++++++++++++---------- drivers/gpu/drm/vc4/vc4_irq.c | 10 +++--- drivers/gpu/drm/vc4/vc4_kms.c | 14 ++++---- drivers/gpu/drm/vc4/vc4_perfmon.c | 20 +++++------ drivers/gpu/drm/vc4/vc4_plane.c | 12 +++---- drivers/gpu/drm/vc4/vc4_render_cl.c | 2 +- drivers/gpu/drm/vc4/vc4_v3d.c | 10 +++--- drivers/gpu/drm/vc4/vc4_validate.c | 8 ++--- drivers/gpu/drm/vc4/vc4_validate_shaders.c | 2 +- 16 files changed, 121 insertions(+), 107 deletions(-)
drivers/gpu/drm/vc4/tests/vc4_mock.c +6 -6
@@ -155,11 +155,11 @@ KUNIT_DEFINE_ACTION_WRAPPER(kunit_action_drm_dev_unregister, drm_dev_unregister, struct drm_device *); -static struct vc4_dev *__mock_device (struct kunit *test,bool is_vc5) +static struct vc4_dev *__mock_device (struct kunit *test,enum vc4_gen gen) {struct drm_device *drm; -const struct drm_driver *drv = is_vc5 ? &vc5_drm_driver : &vc4_drm_driver; -const struct vc4_mock_desc *desc = is_vc5 ? &vc5_mock : &vc4_mock; +const struct drm_driver *drv = (gen ==VC4_GEN_5 ) ? &vc5_drm_driver : &vc4_drm_driver; +const struct vc4_mock_desc *desc = (gen ==VC4_GEN_5 ) ? &vc5_mock : &vc4_mock;struct vc4_dev *vc4;struct device *dev;int ret;
@@ -173,7 +173,7 @@ static struct vc4_dev *__mock_device(struct kunit *test, bool is_vc5)KUNIT_ASSERT_NOT_ERR_OR_NULL (test, vc4); vc4->dev = dev; - vc4->is_vc5 = is_vc5; + vc4->gen = gen; vc4->hvs =__vc4_hvs_alloc (vc4,NULL );KUNIT_ASSERT_NOT_ERR_OR_NULL (test, vc4->hvs);
@@ -198,10 +198,10 @@ static struct vc4_dev *__mock_device(struct kunit *test, bool is_vc5)struct vc4_dev *vc4_mock_device (struct kunit *test) { -return __mock_device (test, false); +return __mock_device (test,VC4_GEN_4 ); }struct vc4_dev *vc5_mock_device (struct kunit *test) { -return __mock_device (test, true); +return __mock_device (test,VC4_GEN_5 ); }
drivers/gpu/drm/vc4/vc4_bo.c +14 -14
@@ -251,7 +251,7 @@ void vc4_bo_add_to_purgeable_pool(struct vc4_bo *bo) {struct vc4_dev *vc4 =to_vc4_dev (bo->base.base.dev); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;mutex_lock (&vc4->purgeable.lock);
@@ -265,7 +265,7 @@ static void vc4_bo_remove_from_purgeable_pool_locked(struct vc4_bo *bo) {struct vc4_dev *vc4 =to_vc4_dev (bo->base.base.dev); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;/* list_del_init() is used here because the caller might release
@@ -396,7 +396,7 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)struct vc4_dev *vc4 =to_vc4_dev (dev);struct vc4_bo *bo; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ERR_PTR (-ENODEV ); bo =kzalloc (sizeof (*bo),GFP_KERNEL );
@@ -427,7 +427,7 @@ struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t unaligned_size,struct drm_gem_dma_object *dma_obj;struct vc4_bo *bo; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ERR_PTR (-ENODEV );if (size ==0 )
@@ -496,7 +496,7 @@ int vc4_bo_dumb_create(struct drm_file *file_priv,struct vc4_bo *bo =NULL ;int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ; ret =vc4_dumb_fixup_args (args);
@@ -622,7 +622,7 @@ int vc4_bo_inc_usecnt(struct vc4_bo *bo)struct vc4_dev *vc4 =to_vc4_dev (bo->base.base.dev);int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;/* Fast path: if the BO is already retained by someone, no need to
@@ -661,7 +661,7 @@ void vc4_bo_dec_usecnt(struct vc4_bo *bo) {struct vc4_dev *vc4 =to_vc4_dev (bo->base.base.dev); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;/* Fast path: if the BO is still retained by someone, no need to test
@@ -783,7 +783,7 @@ int vc4_create_bo_ioctl(struct drm_device *dev, void *data,struct vc4_bo *bo =NULL ;int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ; ret =vc4_grab_bin_bo (vc4, vc4file);
@@ -813,7 +813,7 @@ int vc4_mmap_bo_ioctl(struct drm_device *dev, void *data,struct drm_vc4_mmap_bo *args = data;struct drm_gem_object *gem_obj; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ; gem_obj =drm_gem_object_lookup (file_priv, args->handle);
@@ -839,7 +839,7 @@ vc4_create_shader_bo_ioctl(struct drm_device *dev, void *data,struct vc4_bo *bo =NULL ;int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (args->size ==0 )
@@ -918,7 +918,7 @@ int vc4_set_tiling_ioctl(struct drm_device *dev, void *data,struct vc4_bo *bo;bool t_format; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (args->flags !=0 )
@@ -964,7 +964,7 @@ int vc4_get_tiling_ioctl(struct drm_device *dev, void *data,struct drm_gem_object *gem_obj;struct vc4_bo *bo; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (args->flags !=0 || args->modifier !=0 )
@@ -1007,7 +1007,7 @@ int vc4_bo_cache_init(struct drm_device *dev)int ret;int i; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;/* Create the initial set of BO labels that the kernel will
@@ -1071,7 +1071,7 @@ int vc4_label_bo_ioctl(struct drm_device *dev, void *data,struct drm_gem_object *gem_obj;int ret =0 , label; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (!args->len)
drivers/gpu/drm/vc4/vc4_crtc.c +6 -7
@@ -263,7 +263,7 @@ static u32 vc4_get_fifo_full_level(struct vc4_crtc *vc4_crtc, u32 format)* Removing 1 from the FIFO full level however * seems to completely remove that issue. */ -if (!vc4->is_vc5) +if (vc4->gen ==VC4_GEN_4 )return fifo_len_bytes -3 *HVS_FIFO_LATENCY_PIX -1 ;return fifo_len_bytes -3 *HVS_FIFO_LATENCY_PIX ;
@@ -428,7 +428,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc, struct drm_encoder *encodeif (is_dsi)CRTC_WRITE (PV_HACT_ACT , mode->hdisplay * pixel_rep); -if (vc4->is_vc5) +if (vc4->gen ==VC4_GEN_5 )CRTC_WRITE (PV_MUX_CFG ,VC4_SET_FIELD (PV_MUX_CFG_RGB_PIXEL_MUX_MODE_NO_SWAP ,PV_MUX_CFG_RGB_PIXEL_MUX_MODE ));
@@ -913,7 +913,7 @@ static int vc4_async_set_fence_cb(struct drm_device *dev,struct dma_fence *fence;int ret; -if (!vc4->is_vc5) { +if (vc4->gen ==VC4_GEN_4 ) {struct vc4_bo *bo =to_vc4_bo (&dma_bo->base); return vc4_queue_seqno_cb(dev, &flip_state->cb.seqno, bo->seqno,
@@ -1000,7 +1000,7 @@ static int vc4_async_page_flip(struct drm_crtc *crtc,struct vc4_bo *bo =to_vc4_bo (&dma_bo->base);int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;/*
@@ -1043,7 +1043,7 @@ int vc4_page_flip(struct drm_crtc *crtc,struct drm_device *dev = crtc->dev;struct vc4_dev *vc4 =to_vc4_dev (dev); -if (vc4->is_vc5) +if (vc4->gen ==VC4_GEN_5 )return vc5_async_page_flip (crtc, fb, event, flags);else return vc4_async_page_flip (crtc, fb, event, flags);
@@ -1338,9 +1338,8 @@ int __vc4_crtc_init(struct drm_device *drm,drm_crtc_helper_add (crtc, crtc_helper_funcs); -if (!vc4->is_vc5) { +if (vc4->gen ==VC4_GEN_4 ) {drm_mode_crtc_set_gamma_size (crtc,ARRAY_SIZE (vc4_crtc->lut_r)); -drm_crtc_enable_color_mgmt (crtc,0 , false, crtc->gamma_size);/* We support CTM, but only for one CRTC at a time. It's therefore
drivers/gpu/drm/vc4/vc4_drv.c +13 -9
@@ -98,7 +98,7 @@ static int vc4_get_param_ioctl(struct drm_device *dev, void *data,if (args->pad !=0 )return -EINVAL ; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (!vc4->v3d)
@@ -147,7 +147,7 @@ static int vc4_open(struct drm_device *dev, struct drm_file *file)struct vc4_dev *vc4 =to_vc4_dev (dev);struct vc4_file *vc4file; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ; vc4file =kzalloc (sizeof (*vc4file),GFP_KERNEL );
@@ -165,7 +165,7 @@ static void vc4_close(struct drm_device *dev, struct drm_file *file)struct vc4_dev *vc4 =to_vc4_dev (dev);struct vc4_file *vc4file = file->driver_priv; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;if (vc4file->bin_bo_used)
@@ -291,13 +291,17 @@ static int vc4_drm_bind(struct device *dev)struct vc4_dev *vc4;struct device_node *node;struct drm_crtc *crtc; -bool is_vc5; +enum vc4_gen gen;int ret =0 ; dev->coherent_dma_mask =DMA_BIT_MASK (32 ); - is_vc5 =of_device_is_compatible (dev->of_node,"brcm,bcm2711-vc5" ); -if (is_vc5) +if (of_device_is_compatible (dev->of_node,"brcm,bcm2711-vc5" )) + gen =VC4_GEN_5 ; +else + gen =VC4_GEN_4 ; + +if (gen ==VC4_GEN_5 ) driver = &vc5_drm_driver;else driver = &vc4_drm_driver;
@@ -315,13 +319,13 @@ static int vc4_drm_bind(struct device *dev) vc4 = devm_drm_dev_alloc(dev, driver, struct vc4_dev, base);if (IS_ERR (vc4))return PTR_ERR (vc4); - vc4->is_vc5 = is_vc5; + vc4->gen = gen; vc4->dev = dev; drm = &vc4->base;platform_set_drvdata (pdev, drm); -if (!is_vc5) { +if (gen ==VC4_GEN_4 ) { ret =drmm_mutex_init (drm, &vc4->bin_bo_lock);if (ret) goto err;
@@ -335,7 +339,7 @@ static int vc4_drm_bind(struct device *dev)if (ret) goto err; -if (!is_vc5) { +if (gen ==VC4_GEN_4 ) { ret =vc4_gem_init (drm);if (ret) goto err;
drivers/gpu/drm/vc4/vc4_drv.h +6 -1
@@ -80,11 +80,16 @@ struct vc4_perfmon { u64 counters[] __counted_by(ncounters); }; +enum vc4_gen { +VC4_GEN_4 , +VC4_GEN_5 , +}; +struct vc4_dev {struct drm_device base;struct device *dev; -bool is_vc5; +enum vc4_gen gen;unsigned int irq;
drivers/gpu/drm/vc4/vc4_gem.c +12 -12
@@ -76,7 +76,7 @@ vc4_get_hang_state_ioctl(struct drm_device *dev, void *data,u32 i;int ret =0 ; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (!vc4->v3d) {
@@ -389,7 +389,7 @@ vc4_wait_for_seqno(struct drm_device *dev, uint64_t seqno, uint64_t timeout_ns,unsigned long timeout_expire;DEFINE_WAIT (wait); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (vc4->finished_seqno >= seqno)
@@ -474,7 +474,7 @@ vc4_submit_next_bin_job(struct drm_device *dev)struct vc4_dev *vc4 =to_vc4_dev (dev);struct vc4_exec_info *exec; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ; again:
@@ -522,7 +522,7 @@ vc4_submit_next_render_job(struct drm_device *dev)if (!exec)return ; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;/* A previous RCL may have written to one of our textures, and
@@ -543,7 +543,7 @@ vc4_move_job_to_render(struct drm_device *dev, struct vc4_exec_info *exec)struct vc4_dev *vc4 =to_vc4_dev (dev);bool was_empty =list_empty (&vc4->render_job_list); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;list_move_tail (&exec->head, &vc4->render_job_list);
@@ -970,7 +970,7 @@ vc4_job_handle_completed(struct vc4_dev *vc4)unsigned long irqflags;struct vc4_seqno_cb *cb, *cb_temp; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;spin_lock_irqsave (&vc4->job_lock, irqflags);
@@ -1009,7 +1009,7 @@ int vc4_queue_seqno_cb(struct drm_device *dev,struct vc4_dev *vc4 =to_vc4_dev (dev);unsigned long irqflags; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ; cb->func = func;
@@ -1065,7 +1065,7 @@ vc4_wait_seqno_ioctl(struct drm_device *dev, void *data,struct vc4_dev *vc4 =to_vc4_dev (dev);struct drm_vc4_wait_seqno *args = data; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ; return vc4_wait_for_seqno_ioctl_helper(dev, args->seqno,
@@ -1082,7 +1082,7 @@ vc4_wait_bo_ioctl(struct drm_device *dev, void *data,struct drm_gem_object *gem_obj;struct vc4_bo *bo; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (args->pad !=0 )
@@ -1131,7 +1131,7 @@ vc4_submit_cl_ioctl(struct drm_device *dev, void *data, args->shader_rec_size, args->bo_handle_count); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (!vc4->v3d) {
@@ -1267,7 +1267,7 @@ int vc4_gem_init(struct drm_device *dev)struct vc4_dev *vc4 =to_vc4_dev (dev);int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ; vc4->dma_fence_context =dma_fence_context_alloc (1 );
@@ -1326,7 +1326,7 @@ int vc4_gem_madvise_ioctl(struct drm_device *dev, void *data,struct vc4_bo *bo;int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;switch (args->madv) {
drivers/gpu/drm/vc4/vc4_hdmi.c +1 -1
@@ -2109,7 +2109,7 @@ static int vc4_hdmi_audio_prepare(struct device *dev, void *data, VC4_HDMI_AUDIO_PACKET_CEA_MASK);/* Set the MAI threshold */ -if (vc4->is_vc5) +if (vc4->gen >=VC4_GEN_5 ) HDMI_WRITE(HDMI_MAI_THR, VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICHIGH) | VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICLOW) |
drivers/gpu/drm/vc4/vc4_hvs.c +24 -18
132 lines not on this page · raw message
drivers/gpu/drm/vc4/vc4_irq.c +5 -5
@@ -263,7 +263,7 @@ vc4_irq_enable(struct drm_device *dev) {struct vc4_dev *vc4 =to_vc4_dev (dev); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;if (!vc4->v3d)
@@ -280,7 +280,7 @@ vc4_irq_disable(struct drm_device *dev) {struct vc4_dev *vc4 =to_vc4_dev (dev); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;if (!vc4->v3d)
@@ -303,7 +303,7 @@ int vc4_irq_install(struct drm_device *dev, int irq)struct vc4_dev *vc4 =to_vc4_dev (dev);int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (irq ==IRQ_NOTCONNECTED )
@@ -324,7 +324,7 @@ void vc4_irq_uninstall(struct drm_device *dev) {struct vc4_dev *vc4 =to_vc4_dev (dev); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;vc4_irq_disable (dev);
@@ -337,7 +337,7 @@ void vc4_irq_reset(struct drm_device *dev)struct vc4_dev *vc4 =to_vc4_dev (dev);unsigned long irqflags; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;/* Acknowledge any stale IRQs. */
drivers/gpu/drm/vc4/vc4_kms.c +7 -7
@@ -369,7 +369,7 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state) old_hvs_state->fifo_state[channel].pending_commit =NULL ; } -if (vc4->is_vc5) { +if (vc4->gen ==VC4_GEN_5 ) {unsigned long state_rate =max (old_hvs_state->core_clock_rate, new_hvs_state->core_clock_rate); unsigned long core_rate = clamp_t(unsigned long, state_rate,
@@ -388,7 +388,7 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)vc4_ctm_commit (vc4, state); -if (vc4->is_vc5) +if (vc4->gen ==VC4_GEN_5 )vc5_hvs_pv_muxing_commit (vc4, state);else vc4_hvs_pv_muxing_commit (vc4, state);
@@ -406,7 +406,7 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)drm_atomic_helper_cleanup_planes (dev, state); -if (vc4->is_vc5) { +if (vc4->gen ==VC4_GEN_5 ) { unsigned long core_rate = min_t(unsigned long, hvs->max_core_rate, new_hvs_state->core_clock_rate);
@@ -461,7 +461,7 @@ static struct drm_framebuffer *vc4_fb_create(struct drm_device *dev,struct vc4_dev *vc4 =to_vc4_dev (dev);struct drm_mode_fb_cmd2 mode_cmd_local; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ERR_PTR (-ENODEV );/* If the user didn't specify a modifier, use the
@@ -1040,7 +1040,7 @@ int vc4_kms_load(struct drm_device *dev)* the BCM2711, but the load tracker computations are used for * the core clock rate calculation. */ -if (!vc4->is_vc5) { +if (vc4->gen ==VC4_GEN_4 ) {/* Start with the load tracker enabled. Can be * disabled through the debugfs load_tracker file. */
@@ -1056,7 +1056,7 @@ int vc4_kms_load(struct drm_device *dev)return ret; } -if (vc4->is_vc5) { +if (vc4->gen ==VC4_GEN_5 ) { dev->mode_config.max_width =7680 ; dev->mode_config.max_height =7680 ; }else {
@@ -1064,7 +1064,7 @@ int vc4_kms_load(struct drm_device *dev) dev->mode_config.max_height =2048 ; } - dev->mode_config.funcs = vc4->is_vc5 ? &vc5_mode_funcs : &vc4_mode_funcs; + dev->mode_config.funcs = (vc4->gen >VC4_GEN_4 ) ? &vc5_mode_funcs : &vc4_mode_funcs; dev->mode_config.helper_private = &vc4_mode_config_helpers; dev->mode_config.preferred_depth =24 ; dev->mode_config.async_page_flip = true;
drivers/gpu/drm/vc4/vc4_perfmon.c +10 -10
@@ -23,7 +23,7 @@ void vc4_perfmon_get(struct vc4_perfmon *perfmon)return ; vc4 = perfmon->dev; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;refcount_inc (&perfmon->refcnt);
@@ -37,7 +37,7 @@ void vc4_perfmon_put(struct vc4_perfmon *perfmon)return ; vc4 = perfmon->dev; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;if (refcount_dec_and_test (&perfmon->refcnt))
@@ -49,7 +49,7 @@ void vc4_perfmon_start(struct vc4_dev *vc4, struct vc4_perfmon *perfmon)unsigned int i;u32 mask; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;if (WARN_ON_ONCE (!perfmon || vc4->active_perfmon))
@@ -69,7 +69,7 @@ void vc4_perfmon_stop(struct vc4_dev *vc4, struct vc4_perfmon *perfmon, {unsigned int i; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ; if (WARN_ON_ONCE(!vc4->active_perfmon ||
@@ -90,7 +90,7 @@ struct vc4_perfmon *vc4_perfmon_find(struct vc4_file *vc4file, int id)struct vc4_dev *vc4 = vc4file->dev;struct vc4_perfmon *perfmon; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return NULL ;mutex_lock (&vc4file->perfmon.lock);
@@ -105,7 +105,7 @@ void vc4_perfmon_open_file(struct vc4_file *vc4file) {struct vc4_dev *vc4 = vc4file->dev; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;mutex_init (&vc4file->perfmon.lock);
@@ -131,7 +131,7 @@ void vc4_perfmon_close_file(struct vc4_file *vc4file) {struct vc4_dev *vc4 = vc4file->dev; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;mutex_lock (&vc4file->perfmon.lock);
@@ -151,7 +151,7 @@ int vc4_perfmon_create_ioctl(struct drm_device *dev, void *data,unsigned int i;int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (!vc4->v3d) {
@@ -205,7 +205,7 @@ int vc4_perfmon_destroy_ioctl(struct drm_device *dev, void *data,struct drm_vc4_perfmon_destroy *req = data;struct vc4_perfmon *perfmon; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (!vc4->v3d) {
@@ -233,7 +233,7 @@ int vc4_perfmon_get_values_ioctl(struct drm_device *dev, void *data,struct vc4_perfmon *perfmon;int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;if (!vc4->v3d) {
drivers/gpu/drm/vc4/vc4_plane.c +6 -6
@@ -587,10 +587,10 @@ static u32 vc4_lbm_size(struct drm_plane_state *state) }/* Align it to 64 or 128 (hvs5) bytes */ - lbm =roundup (lbm, vc4->is_vc5 ?128 :64 ); + lbm =roundup (lbm, vc4->gen ==VC4_GEN_5 ?128 :64 );/* Each "word" of the LBM memory contains 2 or 4 (hvs5) pixels */ - lbm /= vc4->is_vc5 ?4 :2 ; + lbm /= vc4->gen ==VC4_GEN_5 ?4 :2 ;return lbm; }
@@ -706,7 +706,7 @@ static int vc4_plane_allocate_lbm(struct drm_plane_state *state) ret =drm_mm_insert_node_generic (&vc4->hvs->lbm_mm, &vc4_state->lbm, lbm_size, - vc4->is_vc5 ?64 :32 , + vc4->gen ==VC4_GEN_5 ?64 :32 ,0 ,0 );spin_unlock_irqrestore (&vc4->hvs->mm_lock, irqflags);
@@ -1057,7 +1057,7 @@ static int vc4_plane_mode_set(struct drm_plane *plane, mix_plane_alpha = state->alpha !=DRM_BLEND_ALPHA_OPAQUE && fb->format->has_alpha; -if (!vc4->is_vc5) { +if (vc4->gen ==VC4_GEN_4 ) {/* Control word */ vc4_dlist_write(vc4_state, SCALER_CTL0_VALID |
@@ -1632,7 +1632,7 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev, };for (i =0 ; i <ARRAY_SIZE (hvs_formats); i++) { -if (!hvs_formats[i].hvs5_only || vc4->is_vc5) { +if (!hvs_formats[i].hvs5_only || vc4->gen ==VC4_GEN_5 ) { formats[num_formats] = hvs_formats[i].drm; num_formats++; }
@@ -1647,7 +1647,7 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,return ERR_CAST (vc4_plane); plane = &vc4_plane->base; -if (vc4->is_vc5) +if (vc4->gen ==VC4_GEN_5 )drm_plane_helper_add (plane, &vc5_plane_helper_funcs);else drm_plane_helper_add (plane, &vc4_plane_helper_funcs);
drivers/gpu/drm/vc4/vc4_render_cl.c +1 -1
@@ -599,7 +599,7 @@ int vc4_get_rcl(struct drm_device *dev, struct vc4_exec_info *exec)bool has_bin = args->bin_cl_size !=0 ;int ret; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ; if (args->min_x_tile > args->max_x_tile ||
drivers/gpu/drm/vc4/vc4_v3d.c +5 -5
@@ -127,7 +127,7 @@ static int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused)int vc4_v3d_pm_get (struct vc4_dev *vc4) { -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;mutex_lock (&vc4->power_lock);
@@ -148,7 +148,7 @@ vc4_v3d_pm_get(struct vc4_dev *vc4)void vc4_v3d_pm_put (struct vc4_dev *vc4) { -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;mutex_lock (&vc4->power_lock);
@@ -178,7 +178,7 @@ int vc4_v3d_get_bin_slot(struct vc4_dev *vc4)uint64_t seqno =0 ;struct vc4_exec_info *exec; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ; try_again:
@@ -325,7 +325,7 @@ int vc4_v3d_bin_bo_get(struct vc4_dev *vc4, bool *used) {int ret =0 ; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;mutex_lock (&vc4->bin_bo_lock);
@@ -360,7 +360,7 @@ static void bin_bo_release(struct kref *ref)void vc4_v3d_bin_bo_put (struct vc4_dev *vc4) { -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return ;mutex_lock (&vc4->bin_bo_lock);
drivers/gpu/drm/vc4/vc4_validate.c +4 -4
@@ -109,7 +109,7 @@ vc4_use_bo(struct vc4_exec_info *exec, uint32_t hindex)struct drm_gem_dma_object *obj;struct vc4_bo *bo; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return NULL ;if (hindex >= exec->bo_count) {
@@ -169,7 +169,7 @@ vc4_check_tex_size(struct vc4_exec_info *exec, struct drm_gem_dma_object *fbo,uint32_t utile_w =utile_width (cpp);uint32_t utile_h =utile_height (cpp); -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return false;/* The shaded vertex format stores signed 12.4 fixed point
@@ -495,7 +495,7 @@ vc4_validate_bin_cl(struct drm_device *dev,uint32_t dst_offset =0 ;uint32_t src_offset =0 ; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;while (src_offset < len) {
@@ -942,7 +942,7 @@ vc4_validate_shader_recs(struct drm_device *dev,uint32_t i;int ret =0 ; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return -ENODEV ;for (i =0 ; i < exec->shader_state_count; i++) {
drivers/gpu/drm/vc4/vc4_validate_shaders.c +1 -1
@@ -786,7 +786,7 @@ vc4_validate_shader(struct drm_gem_dma_object *shader_obj)struct vc4_validated_shader_info *validated_shader =NULL ;struct vc4_shader_validation_state validation_state; -if (WARN_ON_ONCE (vc4->is_vc5)) +if (WARN_ON_ONCE (vc4->gen ==VC4_GEN_5 ))return NULL ;memset (&validation_state,0 ,sizeof (validation_state));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 239/826 drm/vc4: Match drm_dev_enter and exit calls in vc4_hvs_lut_load
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit cf1c87d978d47339a39bfa7a6133ecd3f8f87525 ]
Commit 52efe364d196 ("drm/vc4: hvs: Don't write gamma luts on 2711") added a return path to vc4_hvs_lut_load that had called drm_dev_enter, but not drm_dev_exit.
Ensure we call drm_dev_exit.
--- drivers/gpu/drm/vc4/vc4_hvs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/vc4/vc4_hvs.c +2 -1
@@ -225,7 +225,7 @@ static void vc4_hvs_lut_load(struct vc4_hvs *hvs,return ;if (hvs->vc4->gen ==VC4_GEN_4 ) -return ; + goto exit;/* The LUT memory is laid out with each HVS channel in order, * each of which takes 256 writes for R, 256 for G, then 256
@@ -242,6 +242,7 @@ static void vc4_hvs_lut_load(struct vc4_hvs *hvs,for (i =0 ; i < crtc->gamma_size; i++)HVS_WRITE (SCALER_GAMDATA , vc4_crtc->lut_b[i]); +exit:drm_dev_exit (idx); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 240/826 drm/vc4: Match drm_dev_enter and exit calls in vc4_hvs_atomic_flush
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 6b0bd1b02ea24b10522c92b2503981970b26d1a2 ]
Commit 92c17d16476c ("drm/vc4: hvs: Ignore atomic_flush if we're disabled") added a path which returned early without having called drm_dev_exit.
Ensure all paths call drm_dev_exit.
--- drivers/gpu/drm/vc4/vc4_hvs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/vc4/vc4_hvs.c +2 -1
@@ -584,7 +584,7 @@ void vc4_hvs_atomic_flush(struct drm_crtc *crtc, }if (vc4_state->assigned_channel ==VC4_HVS_CHANNEL_DISABLED ) -return ; + goto exit;if (debug_dump_regs) {DRM_INFO ("CRTC %d HVS before:\n" ,drm_crtc_index (crtc));
@@ -667,6 +667,7 @@ void vc4_hvs_atomic_flush(struct drm_crtc *crtc,vc4_hvs_dump_state (hvs); } +exit:drm_dev_exit (idx); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 241/826 drm/vc4: Correct generation check in vc4_hvs_lut_load
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 42aa18d1c3e7762bcebd89a5857ed7774e669d92 ]
Commit 24c5ed3ddf27 ("drm/vc4: Introduce generation number enum") incorrectly swapped a check of hvs->vc4->is_vc5 to hvs->vc4->gen == VC4_GEN_4 in vc4_hvs_lut_load, hence breaking loading the gamma look up table on Pi0-3.
Correct that conditional.
--- drivers/gpu/drm/vc4/vc4_hvs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/vc4/vc4_hvs.c +1 -1
@@ -224,7 +224,7 @@ static void vc4_hvs_lut_load(struct vc4_hvs *hvs,if (!drm_dev_enter (drm, &idx))return ; -if (hvs->vc4->gen ==VC4_GEN_4 ) +if (hvs->vc4->gen !=VC4_GEN_4 ) goto exit;/* The LUT memory is laid out with each HVS channel in order,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 242/826 libbpf: fix sym_is_subprog() logic for weak global subprogs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrii Nakryiko <[email protected]>
[ Upstream commit 4073213488be542f563eb4b2457ab4cbcfc2b738 ]
sym_is_subprog() is incorrectly rejecting relocations against *weak* global subprogs. Fix that by realizing that STB_WEAK is also a global function.
While it seems like verifier doesn't support taking an address of non-static subprog right now, it's still best to fix support for it on libbpf side, otherwise users will get a very confusing error during BPF skeleton generation or static linking due to misinterpreted relocation:
libbpf: prog 'handle_tp': bad map relo against 'foo' in section '.text'
Error: failed to open BPF object file: Relocation failed
It's clearly not a map relocation, but is treated and reported as such without this fix.
--- tools/lib/bpf/libbpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/lib/bpf/libbpf.c +1 -1
@@ -3985,7 +3985,7 @@ static bool sym_is_subprog(const Elf64_Sym *sym, int text_shndx)return true;/* global function */ -return bind ==STB_GLOBAL && type ==STT_FUNC ; +return (bind ==STB_GLOBAL || bind ==STB_WEAK ) && type ==STT_FUNC ; }static int find_extern_btf_id (const struct btf *btf,const char *ext_name)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 243/826 accel/ivpu: Prevent recovery invocation during probe and resume
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karol Wachowski <[email protected]>
[ Upstream commit 5eaa497411197c41b0813d61ba3fbd6267049082 ]
Refactor IPC send and receive functions to allow correct handling of operations that should not trigger a recovery process.
Expose ivpu_send_receive_internal(), which is now utilized by the D0i3 entry, DCT initialization, and HWS initialization functions. These functions have been modified to return error codes gracefully, rather than initiating recovery.
The updated functions are invoked within ivpu_probe() and ivpu_resume(), ensuring that any errors encountered during these stages result in a proper teardown or shutdown sequence. The previous approach of triggering recovery within these functions could lead to a race condition, potentially causing undefined behavior and kernel crashes due to null pointer dereferences.
--- drivers/accel/ivpu/ivpu_ipc.c | 35 +++++++++++-------------------- drivers/accel/ivpu/ivpu_ipc.h | 7 +++---- drivers/accel/ivpu/ivpu_jsm_msg.c | 19 +++++++---------- 3 files changed, 23 insertions(+), 38 deletions(-)
drivers/accel/ivpu/ivpu_ipc.c +12 -23
@@ -291,15 +291,16 @@ int ivpu_ipc_receive(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,return ret; } -static int +int ivpu_ipc_send_receive_internal (struct ivpu_device *vdev,struct vpu_jsm_msg *req,enum vpu_ipc_msg_type expected_resp_type, -struct vpu_jsm_msg *resp,u32 channel, -unsigned long timeout_ms) +struct vpu_jsm_msg *resp,u32 channel,unsigned long timeout_ms) {struct ivpu_ipc_consumer cons;int ret; +drm_WARN_ON (&vdev->drm,pm_runtime_status_suspended (vdev->drm.dev)); +ivpu_ipc_consumer_add (vdev, &cons, channel,NULL ); ret =ivpu_ipc_send (vdev, &cons, req);
@@ -325,19 +326,21 @@ ivpu_ipc_send_receive_internal(struct ivpu_device *vdev, struct vpu_jsm_msg *reqreturn ret; } -int ivpu_ipc_send_receive_active (struct ivpu_device *vdev,struct vpu_jsm_msg *req, -enum vpu_ipc_msg_type expected_resp,struct vpu_jsm_msg *resp, -u32 channel,unsigned long timeout_ms) +int ivpu_ipc_send_receive (struct ivpu_device *vdev,struct vpu_jsm_msg *req, +enum vpu_ipc_msg_type expected_resp,struct vpu_jsm_msg *resp, +u32 channel,unsigned long timeout_ms) {struct vpu_jsm_msg hb_req = { .type =VPU_JSM_MSG_QUERY_ENGINE_HB };struct vpu_jsm_msg hb_resp;int ret, hb_ret; -drm_WARN_ON (&vdev->drm,pm_runtime_status_suspended (vdev->drm.dev)); + ret =ivpu_rpm_get (vdev); +if (ret <0 ) +return ret; ret =ivpu_ipc_send_receive_internal (vdev, req, expected_resp, resp, channel, timeout_ms);if (ret != -ETIMEDOUT ) -return ret; + goto rpm_put; hb_ret = ivpu_ipc_send_receive_internal(vdev, &hb_req, VPU_JSM_MSG_QUERY_ENGINE_HB_DONE, &hb_resp, VPU_IPC_CHAN_ASYNC_CMD,
@@ -345,21 +348,7 @@ int ivpu_ipc_send_receive_active(struct ivpu_device *vdev, struct vpu_jsm_msg *rif (hb_ret == -ETIMEDOUT )ivpu_pm_trigger_recovery (vdev,"IPC timeout" ); -return ret; -} - -int ivpu_ipc_send_receive (struct ivpu_device *vdev,struct vpu_jsm_msg *req, -enum vpu_ipc_msg_type expected_resp,struct vpu_jsm_msg *resp, -u32 channel,unsigned long timeout_ms) -{ -int ret; - - ret =ivpu_rpm_get (vdev); -if (ret <0 ) -return ret; - - ret =ivpu_ipc_send_receive_active (vdev, req, expected_resp, resp, channel, timeout_ms); - +rpm_put:ivpu_rpm_put (vdev);return ret; }
drivers/accel/ivpu/ivpu_ipc.h +3 -4
@@ -101,10 +101,9 @@ int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,int ivpu_ipc_receive (struct ivpu_device *vdev,struct ivpu_ipc_consumer *cons,struct ivpu_ipc_hdr *ipc_buf,struct vpu_jsm_msg *jsm_msg,unsigned long timeout_ms); - -int ivpu_ipc_send_receive_active (struct ivpu_device *vdev,struct vpu_jsm_msg *req, -enum vpu_ipc_msg_type expected_resp,struct vpu_jsm_msg *resp, -u32 channel,unsigned long timeout_ms); +int ivpu_ipc_send_receive_internal (struct ivpu_device *vdev,struct vpu_jsm_msg *req, +enum vpu_ipc_msg_type expected_resp_type, +struct vpu_jsm_msg *resp,u32 channel,unsigned long timeout_ms);int ivpu_ipc_send_receive (struct ivpu_device *vdev,struct vpu_jsm_msg *req,enum vpu_ipc_msg_type expected_resp,struct vpu_jsm_msg *resp,u32 channel,unsigned long timeout_ms);
drivers/accel/ivpu/ivpu_jsm_msg.c +8 -11
@@ -270,9 +270,8 @@ int ivpu_jsm_pwr_d0i3_enter(struct ivpu_device *vdev) req.payload.pwr_d0i3_enter.send_response =1 ; - ret =ivpu_ipc_send_receive_active (vdev, &req,VPU_JSM_MSG_PWR_D0I3_ENTER_DONE , - &resp,VPU_IPC_CHAN_GEN_CMD , - vdev->timeout.d0i3_entry_msg); + ret =ivpu_ipc_send_receive_internal (vdev, &req,VPU_JSM_MSG_PWR_D0I3_ENTER_DONE , &resp, +VPU_IPC_CHAN_GEN_CMD , vdev->timeout.d0i3_entry_msg);if (ret)return ret;
@@ -430,8 +429,8 @@ int ivpu_jsm_hws_setup_priority_bands(struct ivpu_device *vdev) req.payload.hws_priority_band_setup.normal_band_percentage =10 ; - ret =ivpu_ipc_send_receive_active (vdev, &req,VPU_JSM_MSG_SET_PRIORITY_BAND_SETUP_RSP , - &resp,VPU_IPC_CHAN_ASYNC_CMD , vdev->timeout.jsm); + ret =ivpu_ipc_send_receive_internal (vdev, &req,VPU_JSM_MSG_SET_PRIORITY_BAND_SETUP_RSP , + &resp,VPU_IPC_CHAN_ASYNC_CMD , vdev->timeout.jsm);if (ret)ivpu_warn_ratelimited (vdev,"Failed to set priority bands: %d\n" , ret);
@@ -544,9 +543,8 @@ int ivpu_jsm_dct_enable(struct ivpu_device *vdev, u32 active_us, u32 inactive_us req.payload.pwr_dct_control.dct_active_us = active_us; req.payload.pwr_dct_control.dct_inactive_us = inactive_us; -return ivpu_ipc_send_receive_active (vdev, &req,VPU_JSM_MSG_DCT_ENABLE_DONE , - &resp,VPU_IPC_CHAN_ASYNC_CMD , - vdev->timeout.jsm); +return ivpu_ipc_send_receive_internal (vdev, &req,VPU_JSM_MSG_DCT_ENABLE_DONE , &resp, +VPU_IPC_CHAN_ASYNC_CMD , vdev->timeout.jsm); }int ivpu_jsm_dct_disable (struct ivpu_device *vdev)
@@ -554,7 +552,6 @@ int ivpu_jsm_dct_disable(struct ivpu_device *vdev)struct vpu_jsm_msg req = { .type =VPU_JSM_MSG_DCT_DISABLE };struct vpu_jsm_msg resp; -return ivpu_ipc_send_receive_active (vdev, &req,VPU_JSM_MSG_DCT_DISABLE_DONE , - &resp,VPU_IPC_CHAN_ASYNC_CMD , - vdev->timeout.jsm); +return ivpu_ipc_send_receive_internal (vdev, &req,VPU_JSM_MSG_DCT_DISABLE_DONE , &resp, +VPU_IPC_CHAN_ASYNC_CMD , vdev->timeout.jsm); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 244/826 ASoC: rt722-sdca: Remove logically deadcode in rt722-sdca.c
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Everest K.C <[email protected]>
[ Upstream commit 22206e569fb54bf9c95db9a0138a7485ba9e13bc ]
As the same condition was checked in inner and outer if statements. The code never reaches the inner else statement.
Fix this by removing the logically dead inner else statement.
--- sound/soc/codecs/rt722-sdca.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
sound/soc/codecs/rt722-sdca.c +2 -6
@@ -607,12 +607,8 @@ static int rt722_sdca_dmic_set_gain_get(struct snd_kcontrol *kcontrol,if (!adc_vol_flag)/* boost gain */ ctl = regvalue / boost_step; -else {/* ADC gain */ -if (adc_vol_flag) - ctl = p->max - (((vol_max - regvalue) &0xffff ) / interval_offset); -else - ctl = p->max - (((0 - regvalue) &0xffff ) / interval_offset); - } +else /* ADC gain */ + ctl = p->max - (((vol_max - regvalue) &0xffff ) / interval_offset); ucontrol->value.integer.value[i] = ctl; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 245/826 libbpf: never interpret subprogs in .text as entry programs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrii Nakryiko <[email protected]>
[ Upstream commit db089c9158c1d535a36dfc010e5db37fccea2561 ]
Libbpf pre-1.0 had a legacy logic of allowing singular non-annotated (i.e., not having explicit SEC() annotation) function to be treated as sole entry BPF program (unless there were other explicit entry programs).
This behavior was dropped during libbpf 1.0 transition period (unless LIBBPF_STRICT_SEC_NAME flag was unset in libbpf_mode). When 1.0 was released and all the legacy behavior was removed, the bug slipped through leaving this legacy behavior around.
Fix this for good, as it actually causes very confusing behavior if BPF object file only has subprograms, but no entry programs.
--- tools/lib/bpf/libbpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/lib/bpf/libbpf.c +1 -1
@@ -4389,7 +4389,7 @@ static int bpf_object__collect_externs(struct bpf_object *obj)static bool prog_is_subprog (const struct bpf_object *obj,const struct bpf_program *prog) { -return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs >1 ; +return prog->sec_idx == obj->efile.text_shndx; } struct bpf_program *
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 246/826 netdevsim: copy addresses for both in and out paths
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hangbin Liu <[email protected]>
[ Upstream commit 2cf567f421dbfe7e53b7e5ddee9400da10efb75d ]
The current code only copies the address for the in path, leaving the out path address set to 0. This patch corrects the issue by copying the addresses for both the in and out paths. Before this patch:
# cat /sys/kernel/debug/netdevsim/netdevsim0/ports/0/ipsec SA count=2 tx=20 sa[0] tx ipaddr=0.0.0.0 sa[0] spi=0x00000100 proto=0x32 salt=0x0adecc3a crypt=1 sa[0] key=0x3167608a ca4f1397 43565909 941fa627 sa[1] rx ipaddr=192.168.0.1 sa[1] spi=0x00000101 proto=0x32 salt=0x0adecc3a crypt=1 sa[1] key=0x3167608a ca4f1397 43565909 941fa627
After this patch:
= cat /sys/kernel/debug/netdevsim/netdevsim0/ports/0/ipsec SA count=2 tx=20
sa[0] tx ipaddr=192.168.0.2
sa[0] spi=0x00000100 proto=0x32 salt=0x0adecc3a crypt=1
sa[0] key=0x3167608a ca4f1397 43565909 941fa627
sa[1] rx ipaddr=192.168.0.1
sa[1] spi=0x00000101 proto=0x32 salt=0x0adecc3a crypt=1
sa[1] key=0x3167608a ca4f1397 43565909 941fa627
--- drivers/net/netdevsim/ipsec.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/net/netdevsim/ipsec.c +5 -6
@@ -176,14 +176,13 @@ static int nsim_ipsec_add_sa(struct xfrm_state *xs,return ret; } -if (xs->xso.dir ==XFRM_DEV_OFFLOAD_IN ) { +if (xs->xso.dir ==XFRM_DEV_OFFLOAD_IN ) sa.rx = true; -if (xs->props.family ==AF_INET6 ) -memcpy (sa.ipaddr, &xs->id.daddr.a6,16 ); -else -memcpy (&sa.ipaddr[3 ], &xs->id.daddr.a4,4 ); - } +if (xs->props.family ==AF_INET6 ) +memcpy (sa.ipaddr, &xs->id.daddr.a6,16 ); +else +memcpy (&sa.ipaddr[3 ], &xs->id.daddr.a4,4 );/* the preparations worked, so save the info */ memcpy (&ipsec->sa[sa_idx], &sa,sizeof (sa));
Signature · 1 line
2.43.0