Re: [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection

2023-08-01 Thread 林睿祥


Re: [PATCH v2] dma-contiguous: define proper name for global cma region

2023-08-01 Thread John Stultz
On Tue, Aug 1, 2023 at 10:18 AM Christoph Hellwig  wrote:
>
> On Tue, Aug 01, 2023 at 10:42:42PM +0530, Pintu Agarwal wrote:
> > > I agree that reserved is not a very useful name.  Unfortuately the
> > > name of the region leaks to userspace through cma_heap.
> > >
> > > So I think we need prep patches to hardcode "reserved" in
> > > add_default_cma_heap first, and then remove the cma_get_name
> > > first.
> >
> > Sorry, but I could not fully understand your comments.
> > Can you please elaborate a little more what changes are required in
> > cma_heap if we change "reserved" to "global-cma-region" ?
>
> Step 1:
>
> Instead of setting exp_info.name to cma_get_name(cma);
> in __add_cma_heap just set it to "reserved", probably by passing a name
> argument.  You can also remove the unused data argument to __add_cma_heap
> and/or just fold that function into the only caller while you're at it.

So, forgive me, I've not had a chance to look into this, but my
recollection was "reserved" is the name we see on x86, but other names
are possibly provided via the dts node?

I believe on the hikey board its "linux,cma" is the name, so forcing
it to reserved would break that.

Maybe instead add a compat config option to force the cma name (so x86
can set it to "default" if needed)?

thanks
-john


linux-next: build warning after merge of the drm-misc tree

2023-08-01 Thread Stephen Rothwell
Hi all,

After merging the drm-misc tree, today's linux-next build (htmldocs)
produced this warning:

include/drm/drm_panel.h:270: warning: Function parameter or member 
'follower_lock' not described in 'drm_panel'

Introduced by commit

  de0874165b83 ("drm/panel: Add a way for other devices to follow panel state")

-- 
Cheers,
Stephen Rothwell


pgpwtuPsyCjih.pgp
Description: OpenPGP digital signature


linux-next: build warning after merge of the drm-misc tree

2023-08-01 Thread Stephen Rothwell
Hi all,

After merging the drm-misc tree, today's linux-next build (htmldocs)
produced this warning:

Documentation/gpu/todo.rst:469: ERROR: Unexpected indentation.

Introduced by commit

  d2aacaf07395 ("drm/panel: Check for already prepared/enabled in drm_panel")

-- 
Cheers,
Stephen Rothwell


pgpBexBKHVrO4.pgp
Description: OpenPGP digital signature


Re: [PATCH v8 08/13] drm/mediatek: gamma: Support multi-bank gamma LUT

2023-08-01 Thread 胡俊光


Re: [PATCH 3/3] drm/scheduler: Clean up jobs when the scheduler is torn down.

2023-08-01 Thread Matthew Brost
On Mon, Jul 17, 2023 at 01:40:38PM -0400, Luben Tuikov wrote:
> On 2023-07-16 03:51, Asahi Lina wrote:
> > On 15/07/2023 16.14, Luben Tuikov wrote:
> >> On 2023-07-14 04:21, Asahi Lina wrote:
> >>> drm_sched_fini() currently leaves any pending jobs dangling, which
> >>> causes segfaults and other badness when job completion fences are
> >>> signaled after the scheduler is torn down.
> >>
> >> If there are pending jobs, ideally we want to call into the driver,
> >> so that it can release resources it may be holding for those.
> >> The idea behind "pending" is that they are pending in the hardware
> >> and we don't know their state until signalled/the callback called.
> >> (Or unless the device is reset and we get a notification of that fact.)
> > 
> > That's what the job->free_job() callback does, then the driver is free 
> > to do whatever it wants with those jobs. A driver could opt to 
> > synchronously kill those jobs (if it can) or account for them 
> > separately/asynchronously.
> > 
> > What this patch basically says is that if you destroy a scheduler with 
> > pending jobs, it immediately considers them terminated with an error, 
> > and returns ownership back to the driver for freeing. Then the driver 
> > can decide how to handle the rest and whatever the underlying hardware 
> > state is.
> > 
> >>> Explicitly detach all jobs from their completion callbacks and free
> >>> them. This makes it possible to write a sensible safe abstraction for
> >>> drm_sched, without having to externally duplicate the tracking of
> >>> in-flight jobs.
> >>>
> >>> This shouldn't regress any existing drivers, since calling
> >>> drm_sched_fini() with any pending jobs is broken and this change should
> >>> be a no-op if there are no pending jobs.
> >>
> >> While this statement is true on its own, it kind of contradicts
> >> the premise of the first paragraph.
> > 
> > I mean right *now* it's broken, before this patch. I'm trying to make it 
> > safe, but it shouldn't regress any exiting drivers since if they trigger 
> > this code path they are broken today.
> 
> Not sure about other drivers--they can speak for themselves and the CC list
> should include them--please use "dim add-missing-cc" and make sure
> that the Git commit description contains the Cc tags--then git send-email
> will populate the SMTP CC. Feel free to add more Cc tags on top of that.
> 

Xe doesn't need this as our reference counting scheme doesn't allow
drm_sched_fini to be called when jobs are pending. If we want to
teardown a drm_sched we set TDR timeout to zero and all pending jobs
gets cleaned up that way, the ref of sched will go to zero, and
drm_sched_fini is called. The caveat here being I think we need a worker
to call drm_sched_fini as the last ref to scheduler might be dropped
from within scheduler main thread.

That being said, I doubt this patch breaks anything in Xe so do not a
real strong opinion on this.

Matt

> > 
> >>
> >>> Signed-off-by: Asahi Lina 
> >>> ---
> >>>   drivers/gpu/drm/scheduler/sched_main.c | 32 
> >>> ++--
> >>>   1 file changed, 30 insertions(+), 2 deletions(-)
> >>>
> >>> diff --git a/drivers/gpu/drm/scheduler/sched_main.c 
> >>> b/drivers/gpu/drm/scheduler/sched_main.c
> >>> index 1f3bc3606239..a4da4aac0efd 100644
> >>> --- a/drivers/gpu/drm/scheduler/sched_main.c
> >>> +++ b/drivers/gpu/drm/scheduler/sched_main.c
> >>> @@ -1186,10 +1186,38 @@ EXPORT_SYMBOL(drm_sched_init);
> >>>   void drm_sched_fini(struct drm_gpu_scheduler *sched)
> >>>   {
> >>>   struct drm_sched_entity *s_entity;
> >>> + struct drm_sched_job *s_job, *tmp;
> >>>   int i;
> >>>   
> >>> - if (sched->thread)
> >>> - kthread_stop(sched->thread);
> >>> + if (!sched->thread)
> >>> + return;
> >>> +
> >>> + /*
> >>> +  * Stop the scheduler, detaching all jobs from their hardware callbacks
> >>> +  * and cleaning up complete jobs.
> >>> +  */
> >>> + drm_sched_stop(sched, NULL);
> >>> +
> >>> + /*
> >>> +  * Iterate through the pending job list and free all jobs.
> >>> +  * This assumes the driver has either guaranteed jobs are already 
> >>> stopped, or that
> >>> +  * otherwise it is responsible for keeping any necessary data 
> >>> structures for
> >>> +  * in-progress jobs alive even when the free_job() callback is called 
> >>> early (e.g. by
> >>> +  * putting them in its own queue or doing its own refcounting).
> >>> +  */
> >>> + list_for_each_entry_safe(s_job, tmp, >pending_list, list) {
> >>> + spin_lock(>job_list_lock);
> >>> + list_del_init(_job->list);
> >>> + spin_unlock(>job_list_lock);
> >>> +
> >>> + dma_fence_set_error(_job->s_fence->finished, -ESRCH);
> >>> + drm_sched_fence_finished(s_job->s_fence);
> >>
> >> I'd imagine it's better to rebase this on top of drm-misc-next where
> >> drm_sched_fence_finished() takes one more parameter--the error.
> > 
> > Ah, sure! I can do that.
> 
> It's worth posting it as a stand-alone 

Re: [PATCH v8 07/13] drm/mediatek: gamma: Support specifying number of bits per LUT component

2023-08-01 Thread 胡俊光


Re: [PATCH] PCI/VGA: Fixup the firmware fb address om demanding time

2023-08-01 Thread kernel test robot
Hi Sui,

kernel test robot noticed the following build errors:

[auto build test ERROR on pci/next]
[also build test ERROR on pci/for-linus linus/master v6.5-rc4 next-20230801]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:
https://github.com/intel-lab-lkp/linux/commits/Sui-Jingfeng/PCI-VGA-Fixup-the-firmware-fb-address-om-demanding-time/20230802-023743
base:   https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link:
https://lore.kernel.org/r/20230801183706.702567-1-suijingfeng%40loongson.cn
patch subject: [PATCH] PCI/VGA: Fixup the firmware fb address om demanding time
config: parisc64-defconfig 
(https://download.01.org/0day-ci/archive/20230802/202308021153.w0leladx-...@intel.com/config)
compiler: hppa64-linux-gcc (GCC) 12.3.0
reproduce: 
(https://download.01.org/0day-ci/archive/20230802/202308021153.w0leladx-...@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot 
| Closes: 
https://lore.kernel.org/oe-kbuild-all/202308021153.w0leladx-...@intel.com/

All errors (new ones prefixed by >>):

   hppa64-linux-ld: drivers/pci/vgaarb.o: in function 
`vga_arb_firmware_fb_addr_tracker':
>> (.text+0x1d0): undefined reference to `screen_info'
>> hppa64-linux-ld: (.text+0x1d4): undefined reference to `screen_info'

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


[PATCH] drm/amd/display: Clean up errors in bios_parser2.c

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: switch and case should be at the same indent
ERROR: code indent should use tabs where possible

Signed-off-by: Ran Sun 
---
 .../drm/amd/display/dc/bios/bios_parser2.c| 32 +--
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c 
b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
index 540d19efad8f..033ce2638eb2 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
@@ -772,20 +772,20 @@ static enum bp_result bios_parser_get_device_tag(
return BP_RESULT_BADINPUT;
 
switch (bp->object_info_tbl.revision.minor) {
-   case 4:
-   default:
+   case 4:
+   default:
/* getBiosObject will return MXM object */
-   object = get_bios_object(bp, connector_object_id);
+   object = get_bios_object(bp, connector_object_id);
 
if (!object) {
BREAK_TO_DEBUGGER(); /* Invalid object id */
return BP_RESULT_BADINPUT;
}
 
-   info->acpi_device = 0; /* BIOS no longer provides this */
-   info->dev_id = device_type_from_device_id(object->device_tag);
-   break;
-   case 5:
+   info->acpi_device = 0; /* BIOS no longer provides this */
+   info->dev_id = device_type_from_device_id(object->device_tag);
+   break;
+   case 5:
object_path_v3 = get_bios_object_from_path_v3(bp, 
connector_object_id);
 
if (!object_path_v3) {
@@ -1580,13 +1580,13 @@ static bool bios_parser_is_device_id_supported(
uint32_t mask = get_support_mask_for_device_id(id);
 
switch (bp->object_info_tbl.revision.minor) {
-   case 4:
-   default:
-   return (le16_to_cpu(bp->object_info_tbl.v1_4->supporteddevices) 
& mask) != 0;
-   break;
-   case 5:
-   return 
(le16_to_cpu(bp->object_info_tbl.v1_5->supporteddevices) & mask) != 0;
-   break;
+   case 4:
+   default:
+   return (le16_to_cpu(bp->object_info_tbl.v1_4->supporteddevices) 
& mask) != 0;
+   break;
+   case 5:
+   return (le16_to_cpu(bp->object_info_tbl.v1_5->supporteddevices) 
& mask) != 0;
+   break;
}
 
return false;
@@ -1755,7 +1755,7 @@ static enum bp_result bios_parser_get_firmware_info(
case 2:
case 3:
result = get_firmware_info_v3_2(bp, info);
-break;
+   break;
case 4:
result = get_firmware_info_v3_4(bp, info);
break;
@@ -2225,7 +2225,7 @@ static enum bp_result 
bios_parser_get_disp_connector_caps_info(
return BP_RESULT_BADINPUT;
 
switch (bp->object_info_tbl.revision.minor) {
-   case 4:
+   case 4:
default:
object = get_bios_object(bp, object_id);
 
-- 
2.17.1



[PATCH] drm/amd/display: Clean up errors in dcn316_smu.c

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: open brace '{' following struct go on the same line
ERROR: code indent should use tabs where possible

Signed-off-by: Ran Sun 
---
 .../amd/display/dc/clk_mgr/dcn316/dcn316_smu.c | 18 --
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_smu.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_smu.c
index 457a9254ae1c..3ed19197a755 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_smu.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_smu.c
@@ -34,23 +34,21 @@
 #define MAX_INSTANCE7
 #define MAX_SEGMENT 6
 
-struct IP_BASE_INSTANCE
-{
+struct IP_BASE_INSTANCE {
 unsigned int segment[MAX_SEGMENT];
 };
 
-struct IP_BASE
-{
+struct IP_BASE {
 struct IP_BASE_INSTANCE instance[MAX_INSTANCE];
 };
 
 static const struct IP_BASE MP0_BASE = { { { { 0x00016000, 0x00DC, 
0x00E0, 0x00E4, 0x0243FC00, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } } } };
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } } } };
 
 #define REG(reg_name) \
(MP0_BASE.instance[0].segment[reg ## reg_name ## _BASE_IDX] + reg ## 
reg_name)
-- 
2.17.1



[PATCH] drm/amd/display: Clean up errors in dcn315_smu.c

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: open brace '{' following struct go on the same line
ERROR: code indent should use tabs where possible

Signed-off-by: Ran Sun 
---
 .../display/dc/clk_mgr/dcn315/dcn315_smu.c| 26 +--
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c
index 925d6e13620e..3e0da873cf4c 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c
@@ -33,28 +33,26 @@
 #define MAX_INSTANCE6
 #define MAX_SEGMENT 6
 
-struct IP_BASE_INSTANCE
-{
+struct IP_BASE_INSTANCE {
 unsigned int segment[MAX_SEGMENT];
 };
 
-struct IP_BASE
-{
+struct IP_BASE {
 struct IP_BASE_INSTANCE instance[MAX_INSTANCE];
 };
 
 static const struct IP_BASE MP0_BASE = { { { { 0x00016000, 0x00DC, 
0x00E0, 0x00E4, 0x0243FC00, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } } } };
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } } } };
 static const struct IP_BASE NBIO_BASE = { { { { 0x, 0x0014, 
0x0D20, 0x00010400, 0x0241B000, 0x0404 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } },
-{ { 0, 0, 0, 0, 0, 0 } } } };
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } },
+   { { 0, 0, 0, 0, 0, 0 } } } };
 
 #define regBIF_BX_PF2_RSMU_INDEX   
 0x
 #define regBIF_BX_PF2_RSMU_INDEX_BASE_IDX  
 1
-- 
2.17.1



[PATCH] drm/amd/display: Clean up errors in dce112_hw_sequencer.c

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: space required before the open brace '{'

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c
index 690caaaff019..0ef9ebb3c1e2 100644
--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c
@@ -127,7 +127,7 @@ static bool dce112_enable_display_power_gating(
else
cntl = ASIC_PIPE_DISABLE;
 
-   if (power_gating != PIPE_GATING_CONTROL_INIT || controller_id == 0){
+   if (power_gating != PIPE_GATING_CONTROL_INIT || controller_id == 0) {
 
bp_result = dcb->funcs->enable_disp_power_gating(
dcb, controller_id + 1, cntl);
-- 
2.17.1



[PATCH] drm/amd/display: Clean up errors in dce110_hw_sequencer.c

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: space required before the open brace '{'

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
index 20d4d08a6a2f..7f306d979c63 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
@@ -219,7 +219,7 @@ static bool dce110_enable_display_power_gating(
if (controller_id == underlay_idx)
controller_id = CONTROLLER_ID_UNDERLAY0 - 1;
 
-   if (power_gating != PIPE_GATING_CONTROL_INIT || controller_id == 0){
+   if (power_gating != PIPE_GATING_CONTROL_INIT || controller_id == 0) {
 
bp_result = dcb->funcs->enable_disp_power_gating(
dcb, controller_id + 1, cntl);
-- 
2.17.1



[PATCH] drm/amd/display: Clean up errors in dce110_timing_generator.c

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: spaces required around that '=' (ctx:WxV)

Signed-off-by: Ran Sun 
---
 .../gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c 
b/drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c
index 27cbb5b42c7e..6424e7f279dc 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c
@@ -288,7 +288,7 @@ bool dce110_timing_generator_program_timing_generator(
 
uint32_t vsync_offset = dc_crtc_timing->v_border_bottom +
dc_crtc_timing->v_front_porch;
-   uint32_t v_sync_start =dc_crtc_timing->v_addressable + vsync_offset;
+   uint32_t v_sync_start = dc_crtc_timing->v_addressable + vsync_offset;
 
uint32_t hsync_offset = dc_crtc_timing->h_border_right +
dc_crtc_timing->h_front_porch;
@@ -603,7 +603,7 @@ void dce110_timing_generator_program_blanking(
 {
uint32_t vsync_offset = timing->v_border_bottom +
timing->v_front_porch;
-   uint32_t v_sync_start =timing->v_addressable + vsync_offset;
+   uint32_t v_sync_start = timing->v_addressable + vsync_offset;
 
uint32_t hsync_offset = timing->h_border_right +
timing->h_front_porch;
-- 
2.17.1



[PATCH] drm/amd/dc: Clean up errors in hpd_regs.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: space required after that ',' (ctx:VxV)

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/display/dc/gpio/hpd_regs.h | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/gpio/hpd_regs.h 
b/drivers/gpu/drm/amd/display/dc/gpio/hpd_regs.h
index dcfdd71b2304..debb363cfcf4 100644
--- a/drivers/gpu/drm/amd/display/dc/gpio/hpd_regs.h
+++ b/drivers/gpu/drm/amd/display/dc/gpio/hpd_regs.h
@@ -36,17 +36,17 @@
 #define ONE_MORE_5 6
 
 
-#define HPD_GPIO_REG_LIST_ENTRY(type,cd,id) \
+#define HPD_GPIO_REG_LIST_ENTRY(type, cd, id) \
.type ## _reg =  REG(DC_GPIO_HPD_## type),\
.type ## _mask =  DC_GPIO_HPD_ ## type ## __DC_GPIO_HPD ## id ## _ ## 
type ## _MASK,\
.type ## _shift = DC_GPIO_HPD_ ## type ## __DC_GPIO_HPD ## id ## _ ## 
type ## __SHIFT
 
 #define HPD_GPIO_REG_LIST(id) \
{\
-   HPD_GPIO_REG_LIST_ENTRY(MASK,cd,id),\
-   HPD_GPIO_REG_LIST_ENTRY(A,cd,id),\
-   HPD_GPIO_REG_LIST_ENTRY(EN,cd,id),\
-   HPD_GPIO_REG_LIST_ENTRY(Y,cd,id)\
+   HPD_GPIO_REG_LIST_ENTRY(MASK, cd, id),\
+   HPD_GPIO_REG_LIST_ENTRY(A, cd, id),\
+   HPD_GPIO_REG_LIST_ENTRY(EN, cd, id),\
+   HPD_GPIO_REG_LIST_ENTRY(Y, cd, id)\
}
 
 #define HPD_REG_LIST(id) \
-- 
2.17.1



[PATCH] drm/amd/display: Clean up errors in ddc_regs.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: space required after that ',' (ctx:VxV)

Signed-off-by: Ran Sun 
---
 .../gpu/drm/amd/display/dc/gpio/ddc_regs.h| 40 +--
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/gpio/ddc_regs.h 
b/drivers/gpu/drm/amd/display/dc/gpio/ddc_regs.h
index 59884ef651b3..4a2bf81286d8 100644
--- a/drivers/gpu/drm/amd/display/dc/gpio/ddc_regs.h
+++ b/drivers/gpu/drm/amd/display/dc/gpio/ddc_regs.h
@@ -31,21 +31,21 @@
 /** new register headers */
 /*** following in header */
 
-#define DDC_GPIO_REG_LIST_ENTRY(type,cd,id) \
+#define DDC_GPIO_REG_LIST_ENTRY(type, cd, id) \
.type ## _reg =   REG(DC_GPIO_DDC ## id ## _ ## type),\
.type ## _mask =  DC_GPIO_DDC ## id ## _ ## type ## __DC_GPIO_DDC ## id 
## cd ## _ ## type ## _MASK,\
.type ## _shift = DC_GPIO_DDC ## id ## _ ## type ## __DC_GPIO_DDC ## id 
## cd ## _ ## type ## __SHIFT
 
-#define DDC_GPIO_REG_LIST(cd,id) \
+#define DDC_GPIO_REG_LIST(cd, id) \
{\
-   DDC_GPIO_REG_LIST_ENTRY(MASK,cd,id),\
-   DDC_GPIO_REG_LIST_ENTRY(A,cd,id),\
-   DDC_GPIO_REG_LIST_ENTRY(EN,cd,id),\
-   DDC_GPIO_REG_LIST_ENTRY(Y,cd,id)\
+   DDC_GPIO_REG_LIST_ENTRY(MASK, cd, id),\
+   DDC_GPIO_REG_LIST_ENTRY(A, cd, id),\
+   DDC_GPIO_REG_LIST_ENTRY(EN, cd, id),\
+   DDC_GPIO_REG_LIST_ENTRY(Y, cd, id)\
}
 
-#define DDC_REG_LIST(cd,id) \
-   DDC_GPIO_REG_LIST(cd,id),\
+#define DDC_REG_LIST(cd, id) \
+   DDC_GPIO_REG_LIST(cd, id),\
.ddc_setup = REG(DC_I2C_DDC ## id ## _SETUP)
 
#define DDC_REG_LIST_DCN2(cd, id) \
@@ -54,34 +54,34 @@
.phy_aux_cntl = REG(PHY_AUX_CNTL), \
.dc_gpio_aux_ctrl_5 = REG(DC_GPIO_AUX_CTRL_5)
 
-#define DDC_GPIO_VGA_REG_LIST_ENTRY(type,cd)\
+#define DDC_GPIO_VGA_REG_LIST_ENTRY(type, cd)\
.type ## _reg =   REG(DC_GPIO_DDCVGA_ ## type),\
.type ## _mask =  DC_GPIO_DDCVGA_ ## type ## __DC_GPIO_DDCVGA ## cd ## 
_ ## type ## _MASK,\
.type ## _shift = DC_GPIO_DDCVGA_ ## type ## __DC_GPIO_DDCVGA ## cd ## 
_ ## type ## __SHIFT
 
 #define DDC_GPIO_VGA_REG_LIST(cd) \
{\
-   DDC_GPIO_VGA_REG_LIST_ENTRY(MASK,cd),\
-   DDC_GPIO_VGA_REG_LIST_ENTRY(A,cd),\
-   DDC_GPIO_VGA_REG_LIST_ENTRY(EN,cd),\
-   DDC_GPIO_VGA_REG_LIST_ENTRY(Y,cd)\
+   DDC_GPIO_VGA_REG_LIST_ENTRY(MASK, cd),\
+   DDC_GPIO_VGA_REG_LIST_ENTRY(A, cd),\
+   DDC_GPIO_VGA_REG_LIST_ENTRY(EN, cd),\
+   DDC_GPIO_VGA_REG_LIST_ENTRY(Y, cd)\
}
 
 #define DDC_VGA_REG_LIST(cd) \
DDC_GPIO_VGA_REG_LIST(cd),\
.ddc_setup = mmDC_I2C_DDCVGA_SETUP
 
-#define DDC_GPIO_I2C_REG_LIST_ENTRY(type,cd) \
+#define DDC_GPIO_I2C_REG_LIST_ENTRY(type, cd) \
.type ## _reg =   REG(DC_GPIO_I2CPAD_ ## type),\
.type ## _mask =  DC_GPIO_I2CPAD_ ## type ## __DC_GPIO_ ## cd ## _ ## 
type ## _MASK,\
.type ## _shift = DC_GPIO_I2CPAD_ ## type ## __DC_GPIO_ ## cd ## _ ## 
type ## __SHIFT
 
 #define DDC_GPIO_I2C_REG_LIST(cd) \
{\
-   DDC_GPIO_I2C_REG_LIST_ENTRY(MASK,cd),\
-   DDC_GPIO_I2C_REG_LIST_ENTRY(A,cd),\
-   DDC_GPIO_I2C_REG_LIST_ENTRY(EN,cd),\
-   DDC_GPIO_I2C_REG_LIST_ENTRY(Y,cd)\
+   DDC_GPIO_I2C_REG_LIST_ENTRY(MASK, cd),\
+   DDC_GPIO_I2C_REG_LIST_ENTRY(A, cd),\
+   DDC_GPIO_I2C_REG_LIST_ENTRY(EN, cd),\
+   DDC_GPIO_I2C_REG_LIST_ENTRY(Y, cd)\
}
 
 #define DDC_I2C_REG_LIST(cd) \
@@ -150,12 +150,12 @@ struct ddc_sh_mask {
 
 #define ddc_data_regs(id) \
 {\
-   DDC_REG_LIST(DATA,id)\
+   DDC_REG_LIST(DATA, id)\
 }
 
 #define ddc_clk_regs(id) \
 {\
-   DDC_REG_LIST(CLK,id)\
+   DDC_REG_LIST(CLK, id)\
 }
 
 #define ddc_vga_data_regs \
-- 
2.17.1



[PATCH] drm/amd/display: Clean up errors in color_gamma.c

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: trailing whitespace
ERROR: else should follow close brace '}'

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/display/modules/color/color_gamma.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c 
b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
index 67a062af3ab0..ff8e5708735d 100644
--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
+++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
@@ -359,7 +359,7 @@ static struct fixed31_32 translate_from_linear_space(
scratch_1 = dc_fixpt_add(one, args->a3);
/* In the first region (first 16 points) and in the
 * region delimited by START/END we calculate with
-* full precision to avoid error accumulation. 
+* full precision to avoid error accumulation.
 */
if ((cal_buffer->buffer_index >= PRECISE_LUT_REGION_START &&
cal_buffer->buffer_index <= PRECISE_LUT_REGION_END) ||
@@ -379,8 +379,7 @@ static struct fixed31_32 translate_from_linear_space(
scratch_1 = dc_fixpt_sub(scratch_1, args->a2);
 
return scratch_1;
-   }
-   else
+   } else
return dc_fixpt_mul(args->arg, args->a1);
 }
 
-- 
2.17.1



Re: [PATCH v14 02/12] drm/shmem-helper: Add pages_pin_count field

2023-08-01 Thread Danilo Krummrich

On 7/31/23 15:35, Boris Brezillon wrote:

+Danilo, to confirm my understanding of the gpuva remap operation is
correct.


Your understanding is correct.

Unfortunately, re-mapping things has such implications.

I'm currently working on tracking external GEM objects in the GPUVA 
manager, where, ideally, you'd want to add the extobj to the VM when the 
first mapping being backed by this GEM is created and removed when the 
last mapping being backed by this GEM is removed. Hence, extobjs need to 
be ref-counted based on how many mappings they back.


However, when re-mapping such a mapping, the reference counter might 
drop to 0 temporarily and the slot of the data structure tracking the 
extobj is cleaned up and needs to be re-allocated. Surely, we could just 
increase the reference count while re-mapping or for the whole 
transaction (job), but this would make the API kinda bulky.




On Mon, 31 Jul 2023 15:27:31 +0300
Dmitry Osipenko  wrote:


On 7/25/23 11:32, Boris Brezillon wrote:

Can we make it an atomic_t, so we can avoid taking the lock when the
GEM has already been pinned. That's something I need to be able to grab
a pin-ref in a path where the GEM resv lock is already held[1]. We could
of course expose the locked version,

My bad, that's actually not true. The problem is not that I call
drm_gem_shmem_pin() with the resv lock already held, but that I call
drm_gem_shmem_pin() in a dma-signaling path where I'm not allowed to
take a resv lock. I know for sure pin_count > 0, because all GEM objects
mapped to a VM have their memory pinned right now, and this should
stand until we decide to add support for live-GEM eviction, at which
point we'll probably have a way to detect when a GEM is evicted, and
avoid calling drm_gem_shmem_pin() on it.

TLDR; I can't trade the atomic_t for a drm_gem_shmem_pin_locked(),
because that wouldn't solve my problem. The other solution would be to
add an atomic_t at the driver-GEM level, and only call
drm_gem_shmem_[un]pin() on 0 <-> 1 transitions, but I thought using an
atomic at the GEM-shmem level, to avoid locking when we can, would be
beneficial to the rest of the eco-system. Let me know if that's not an
option, and I'll go back to the driver-specific atomic_t.


Could you please explain why do you need to pin GEM in a signal handler?
This is not something drivers usually do or need to do. You likely also
shouldn't need to detect that GEM is evicted in yours driver. I'd expect
that Panthor shouldn't differ from Panfrost in regards to how GEM memory
management is done and Panfrost doesn't need to do anything special.


Panthor VM management is completely different, and the case I'm
referring to is 'asynchronous VM_BIND': mapping a GEM object to a GPU VM
asynchronously, so we can make it depend on other operations, encoded as
syncobjs passed to the VM_BIND operation.

Here is the workflow we have for this use case:

1. Create + push a VM_BIND job to the VM_BIND queue (a drm_sched_entity
that's taking care of asynchronous VM map/unmap operations). Because
this operation is asynchronous, and the execution itself happens in a
dma-signaling path (drm_sched::run_job()), we need to pre-allocate the
MMU page tables for the worst case scenario, and make sure the GEM pages
are pinned at job creation time.

2. The VM operation itself is executed when all dependencies are met
(drm_sched calls run_job()). In case of a map operation, we call
drm_gpuva_sm_map(), which might split the map operation into
remap+unamp+map ones if the region being mapped is covering a region
that was previously mapped to a different GEM object or a different
portion of the same GEM object (see the gpuva_mgr doc [1]). A
remap operation is just a way to split an existing mapping in 2 mappings
covering the left/right side of the previous mapping, plus a hole in
the middle. This means that our VM mapping object (drm_gpuva), which
was pointing to a GEM object that had its pages pinned, is now turned
into 2 mapping objects, and we need to make sure those 2 mappings own a
reference to the pages, otherwise we'll have an unbalanced refcount
when we release those 2 mappings further down the road.

3. Release resources attached to mappings that were removed (that
includes releasing the ref we had on GEM pages) and free the mapping
objects. We do that asynchronously, outside of the dma-signaling path.



Note that patch #14 makes locked pin/unpin functions public and turns
the unlocked variants into helpers, you'll be able to experiment with
these funcs in the Panthor driver.


Unfortunately, those won't help. I really need a way to increment the
refcount without holding the lock, because we're in a dma-signaling
path when we call drm_gpuva_sm_map(). Note that I could live with a
drm_shmem_gem_pin_if_already_pinned() variant that would return NULL if
pin_count == 0 instead of trying to acquire the lock, but I'd still
need this refcount to be an atomic_t.

As I said, an alternative to this approach would be to have 

[PATCH] drm/amd/pm: Clean up errors in amdgpu_pm.c

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: that open brace { should be on the previous line
ERROR: space required before the open parenthesis '('

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/amdgpu_pm.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index 3922dd274f30..acaab3441030 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
@@ -743,7 +743,7 @@ static ssize_t amdgpu_set_pp_od_clk_voltage(struct device 
*dev,
type = PP_OD_EDIT_CCLK_VDDC_TABLE;
else if (*buf == 'm')
type = PP_OD_EDIT_MCLK_VDDC_TABLE;
-   else if(*buf == 'r')
+   else if (*buf == 'r')
type = PP_OD_RESTORE_DEFAULT_TABLE;
else if (*buf == 'c')
type = PP_OD_COMMIT_DPM_TABLE;
@@ -3532,7 +3532,8 @@ void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev)
 #if defined(CONFIG_DEBUG_FS)
 
 static void amdgpu_debugfs_prints_cpu_info(struct seq_file *m,
-  struct amdgpu_device *adev) {
+  struct amdgpu_device *adev)
+{
uint16_t *p_val;
uint32_t size;
int i;
-- 
2.17.1



Re: [PATCH] PCI/VGA: Fixup the firmware fb address om demanding time

2023-08-01 Thread kernel test robot
Hi Sui,

kernel test robot noticed the following build warnings:

[auto build test WARNING on pci/next]
[also build test WARNING on pci/for-linus linus/master v6.5-rc4 next-20230801]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:
https://github.com/intel-lab-lkp/linux/commits/Sui-Jingfeng/PCI-VGA-Fixup-the-firmware-fb-address-om-demanding-time/20230802-023743
base:   https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link:
https://lore.kernel.org/r/20230801183706.702567-1-suijingfeng%40loongson.cn
patch subject: [PATCH] PCI/VGA: Fixup the firmware fb address om demanding time
config: arm-randconfig-r004-20230731 
(https://download.01.org/0day-ci/archive/20230802/202308021027.rcgalj5d-...@intel.com/config)
compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project.git 
8dfdcc7b7bf66834a761bd8de445840ef68e4d1a)
reproduce: 
(https://download.01.org/0day-ci/archive/20230802/202308021027.rcgalj5d-...@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot 
| Closes: 
https://lore.kernel.org/oe-kbuild-all/202308021027.rcgalj5d-...@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/pci/vgaarb.c:133:7: warning: format specifies type 'unsigned long 
>> long' but the argument has type 'resource_size_t' (aka 'unsigned int') 
>> [-Wformat]
  old_fb_start, old_fb_end,
  ^~~~
   drivers/pci/vgaarb.c:13:69: note: expanded from macro 'vgaarb_dbg'
   #define vgaarb_dbg(dev, fmt, arg...)dev_dbg(dev, "vgaarb: " fmt, ##arg)
   ~~~^~~
   include/linux/dev_printk.h:163:47: note: expanded from macro 'dev_dbg'
   dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \
   ~~~ ^~~
   include/linux/dev_printk.h:129:34: note: expanded from macro 'dev_printk'
   _dev_printk(level, dev, fmt, ##__VA_ARGS__);\
   ~~~^~~
   drivers/pci/vgaarb.c:133:21: warning: format specifies type 'unsigned long 
long' but the argument has type 'resource_size_t' (aka 'unsigned int') 
[-Wformat]
  old_fb_start, old_fb_end,
^~
   drivers/pci/vgaarb.c:13:69: note: expanded from macro 'vgaarb_dbg'
   #define vgaarb_dbg(dev, fmt, arg...)dev_dbg(dev, "vgaarb: " fmt, ##arg)
   ~~~^~~
   include/linux/dev_printk.h:163:47: note: expanded from macro 'dev_dbg'
   dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \
   ~~~ ^~~
   include/linux/dev_printk.h:129:34: note: expanded from macro 'dev_printk'
   _dev_printk(level, dev, fmt, ##__VA_ARGS__);\
   ~~~^~~
   drivers/pci/vgaarb.c:134:7: warning: format specifies type 'unsigned long 
long' but the argument has type 'resource_size_t' (aka 'unsigned int') 
[-Wformat]
  firmware_fb.start, firmware_fb.end);
  ^
   drivers/pci/vgaarb.c:13:69: note: expanded from macro 'vgaarb_dbg'
   #define vgaarb_dbg(dev, fmt, arg...)dev_dbg(dev, "vgaarb: " fmt, ##arg)
   ~~~^~~
   include/linux/dev_printk.h:163:47: note: expanded from macro 'dev_dbg'
   dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \
   ~~~ ^~~
   include/linux/dev_printk.h:129:34: note: expanded from macro 'dev_printk'
   _dev_printk(level, dev, fmt, ##__VA_ARGS__);\
   ~~~^~~
   drivers/pci/vgaarb.c:134:26: warning: format specifies type 'unsigned long 
long' but the argument has type 'resource_size_t' (aka 'unsigned int') 
[-Wformat]
  firmware_fb.start, firmware_fb.end);
 ^~~
   drivers/pci/vgaarb.c:13:69: note: expanded from macro 'vgaarb_dbg'
   #define vgaarb_dbg(dev, fmt, arg...)dev_dbg(dev, "vgaarb: " fmt, ##arg)
   ~~~^~~
   include/linux/dev_printk.h:163:47: note: expanded from macro 'dev_dbg'
  

[PATCH] drm/amd/pm: Clean up errors in sislands_smc.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: that open brace { should be on the previous line

Signed-off-by: Ran Sun 
---
 .../gpu/drm/amd/pm/legacy-dpm/sislands_smc.h  | 63 +++
 1 file changed, 21 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/sislands_smc.h 
b/drivers/gpu/drm/amd/pm/legacy-dpm/sislands_smc.h
index c7dc117a688c..90ec411c5029 100644
--- a/drivers/gpu/drm/amd/pm/legacy-dpm/sislands_smc.h
+++ b/drivers/gpu/drm/amd/pm/legacy-dpm/sislands_smc.h
@@ -29,8 +29,7 @@
 
 #define SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16
 
-struct PP_SIslands_Dpm2PerfLevel
-{
+struct PP_SIslands_Dpm2PerfLevel {
 uint8_t MaxPS;
 uint8_t TgtAct;
 uint8_t MaxPS_StepInc;
@@ -47,8 +46,7 @@ struct PP_SIslands_Dpm2PerfLevel
 
 typedef struct PP_SIslands_Dpm2PerfLevel PP_SIslands_Dpm2PerfLevel;
 
-struct PP_SIslands_DPM2Status
-{
+struct PP_SIslands_DPM2Status {
 uint32_tdpm2Flags;
 uint8_t CurrPSkip;
 uint8_t CurrPSkipPowerShift;
@@ -68,8 +66,7 @@ struct PP_SIslands_DPM2Status
 
 typedef struct PP_SIslands_DPM2Status PP_SIslands_DPM2Status;
 
-struct PP_SIslands_DPM2Parameters
-{
+struct PP_SIslands_DPM2Parameters {
 uint32_tTDPLimit;
 uint32_tNearTDPLimit;
 uint32_tSafePowerLimit;
@@ -78,8 +75,7 @@ struct PP_SIslands_DPM2Parameters
 };
 typedef struct PP_SIslands_DPM2Parameters PP_SIslands_DPM2Parameters;
 
-struct PP_SIslands_PAPMStatus
-{
+struct PP_SIslands_PAPMStatus {
 uint32_tEstimatedDGPU_T;
 uint32_tEstimatedDGPU_P;
 uint32_tEstimatedAPU_T;
@@ -89,8 +85,7 @@ struct PP_SIslands_PAPMStatus
 };
 typedef struct PP_SIslands_PAPMStatus PP_SIslands_PAPMStatus;
 
-struct PP_SIslands_PAPMParameters
-{
+struct PP_SIslands_PAPMParameters {
 uint32_tNearTDPLimitTherm;
 uint32_tNearTDPLimitPAPM;
 uint32_tPlatformPowerLimit;
@@ -100,8 +95,7 @@ struct PP_SIslands_PAPMParameters
 };
 typedef struct PP_SIslands_PAPMParameters PP_SIslands_PAPMParameters;
 
-struct SISLANDS_SMC_SCLK_VALUE
-{
+struct SISLANDS_SMC_SCLK_VALUE {
 uint32_tvCG_SPLL_FUNC_CNTL;
 uint32_tvCG_SPLL_FUNC_CNTL_2;
 uint32_tvCG_SPLL_FUNC_CNTL_3;
@@ -113,8 +107,7 @@ struct SISLANDS_SMC_SCLK_VALUE
 
 typedef struct SISLANDS_SMC_SCLK_VALUE SISLANDS_SMC_SCLK_VALUE;
 
-struct SISLANDS_SMC_MCLK_VALUE
-{
+struct SISLANDS_SMC_MCLK_VALUE {
 uint32_tvMPLL_FUNC_CNTL;
 uint32_tvMPLL_FUNC_CNTL_1;
 uint32_tvMPLL_FUNC_CNTL_2;
@@ -129,8 +122,7 @@ struct SISLANDS_SMC_MCLK_VALUE
 
 typedef struct SISLANDS_SMC_MCLK_VALUE SISLANDS_SMC_MCLK_VALUE;
 
-struct SISLANDS_SMC_VOLTAGE_VALUE
-{
+struct SISLANDS_SMC_VOLTAGE_VALUE {
 uint16_tvalue;
 uint8_t index;
 uint8_t phase_settings;
@@ -138,8 +130,7 @@ struct SISLANDS_SMC_VOLTAGE_VALUE
 
 typedef struct SISLANDS_SMC_VOLTAGE_VALUE SISLANDS_SMC_VOLTAGE_VALUE;
 
-struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL
-{
+struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL {
 uint8_t ACIndex;
 uint8_t displayWatermark;
 uint8_t gen2PCIE;
@@ -180,8 +171,7 @@ struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL
 
 typedef struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL 
SISLANDS_SMC_HW_PERFORMANCE_LEVEL;
 
-struct SISLANDS_SMC_SWSTATE
-{
+struct SISLANDS_SMC_SWSTATE {
uint8_t flags;
uint8_t levelCount;
uint8_t padding2;
@@ -205,8 +195,7 @@ struct SISLANDS_SMC_SWSTATE_SINGLE {
 #define SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING 3
 #define SISLANDS_SMC_VOLTAGEMASK_MAX   4
 
-struct SISLANDS_SMC_VOLTAGEMASKTABLE
-{
+struct SISLANDS_SMC_VOLTAGEMASKTABLE {
 uint32_t lowMask[SISLANDS_SMC_VOLTAGEMASK_MAX];
 };
 
@@ -214,8 +203,7 @@ typedef struct SISLANDS_SMC_VOLTAGEMASKTABLE 
SISLANDS_SMC_VOLTAGEMASKTABLE;
 
 #define SISLANDS_MAX_NO_VREG_STEPS 32
 
-struct SISLANDS_SMC_STATETABLE
-{
+struct SISLANDS_SMC_STATETABLE {
uint8_t thermalProtectType;
uint8_t systemFlags;
uint8_t maxVDDCIndexInPPTable;
@@ -254,8 +242,7 @@ typedef struct SISLANDS_SMC_STATETABLE 
SISLANDS_SMC_STATETABLE;
 #define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd   0x11c
 #define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc   0x120
 
-struct PP_SIslands_FanTable
-{
+struct PP_SIslands_FanTable {
uint8_t  fdo_mode;
uint8_t  padding;
int16_t  temp_min;
@@ -285,8 +272,7 @@ typedef struct PP_SIslands_FanTable PP_SIslands_FanTable;
 #define SMC_SISLANDS_SCALE_I  7
 #define SMC_SISLANDS_SCALE_R 12
 
-struct PP_SIslands_CacConfig
-{
+struct PP_SIslands_CacConfig {
 uint16_t   
cac_lkge_lut[SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES][SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES];
 uint32_t   lkge_lut_V0;
 uint32_t   lkge_lut_Vstep;
@@ -308,23 +294,20 @@ 

[PATCH] drm/amd/pm: Clean up errors in kv_dpm.c

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: that open brace { should be on the previous line
ERROR: space prohibited before that ',' (ctx:WxW)
ERROR: need consistent spacing around '-' (ctx:WxV)

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c | 48 --
 1 file changed, 17 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c 
b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c
index 36c831b280ed..5d28c951a319 100644
--- a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c
+++ b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c
@@ -191,8 +191,7 @@ static void sumo_construct_vid_mapping_table(struct 
amdgpu_device *adev,
 }
 
 #if 0
-static const struct kv_lcac_config_values sx_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values sx_local_cac_cfg_kv[] = {
{  0,   4,1},
{  1,   4,1},
{  2,   5,1},
@@ -204,32 +203,27 @@ static const struct kv_lcac_config_values 
sx_local_cac_cfg_kv[] =
{ 0x }
 };
 
-static const struct kv_lcac_config_values mc0_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values mc0_local_cac_cfg_kv[] = {
{  0,   4,1},
{ 0x }
 };
 
-static const struct kv_lcac_config_values mc1_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values mc1_local_cac_cfg_kv[] = {
{  0,   4,1},
{ 0x }
 };
 
-static const struct kv_lcac_config_values mc2_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values mc2_local_cac_cfg_kv[] = {
{  0,   4,1},
{ 0x }
 };
 
-static const struct kv_lcac_config_values mc3_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values mc3_local_cac_cfg_kv[] = {
{  0,   4,1},
{ 0x }
 };
 
-static const struct kv_lcac_config_values cpl_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values cpl_local_cac_cfg_kv[] = {
{  0,   4,1},
{  1,   4,1},
{  2,   5,1},
@@ -260,39 +254,32 @@ static const struct kv_lcac_config_values 
cpl_local_cac_cfg_kv[] =
{ 0x }
 };
 
-static const struct kv_lcac_config_reg sx0_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg sx0_cac_config_reg[] = {
{ 0xc0400d00, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg mc0_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg mc0_cac_config_reg[] = {
{ 0xc0400d30, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg mc1_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg mc1_cac_config_reg[] = {
{ 0xc0400d3c, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg mc2_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg mc2_cac_config_reg[] = {
{ 0xc0400d48, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg mc3_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg mc3_cac_config_reg[] = {
{ 0xc0400d54, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg cpl_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg cpl_cac_config_reg[] = {
{ 0xc0400d80, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 #endif
 
-static const struct kv_pt_config_reg didt_config_kv[] =
-{
+static const struct kv_pt_config_reg didt_config_kv[] = {
{ 0x10, 0x00ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
{ 0x10, 0xff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
{ 0x10, 0x00ff, 16, 0x0, KV_CONFIGREG_DIDT_IND },
@@ -1173,9 +1160,9 @@ static void kv_calculate_dfs_bypass_settings(struct 
amdgpu_device *adev)
pi->graphics_level[i].ClkBypassCntl = 2;
else if 
(kv_get_clock_difference(table->entries[i].clk, 26600) < 200)
pi->graphics_level[i].ClkBypassCntl = 7;
-   else if 
(kv_get_clock_difference(table->entries[i].clk , 2) < 200)
+   else if 
(kv_get_clock_difference(table->entries[i].clk, 2) < 200)
pi->graphics_level[i].ClkBypassCntl = 6;
-   else if 
(kv_get_clock_difference(table->entries[i].clk , 1) < 200)
+   else if 
(kv_get_clock_difference(table->entries[i].clk, 1) < 200)
pi->graphics_level[i].ClkBypassCntl = 8;
else
pi->graphics_level[i].ClkBypassCntl = 0;
@@ -1825,7 

[PATCH] drm/amd/pm: Clean up errors in r600_dpm.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: that open brace { should be on the previous line

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/legacy-dpm/r600_dpm.h | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/r600_dpm.h 
b/drivers/gpu/drm/amd/pm/legacy-dpm/r600_dpm.h
index 055321f61ca7..3e7caa715533 100644
--- a/drivers/gpu/drm/amd/pm/legacy-dpm/r600_dpm.h
+++ b/drivers/gpu/drm/amd/pm/legacy-dpm/r600_dpm.h
@@ -117,8 +117,7 @@ enum r600_display_watermark {
R600_DISPLAY_WATERMARK_HIGH = 1,
 };
 
-enum r600_display_gap
-{
+enum r600_display_gap {
 R600_PM_DISPLAY_GAP_VBLANK_OR_WM = 0,
 R600_PM_DISPLAY_GAP_VBLANK   = 1,
 R600_PM_DISPLAY_GAP_WATERMARK= 2,
-- 
2.17.1



[PATCH] drivers/amd/pm: Clean up errors in smu8_smumgr.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: that open brace { should be on the previous line
ERROR: space prohibited before that ',' (ctx:WxW)

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c | 48 --
 1 file changed, 17 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c 
b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c
index 36c831b280ed..5d28c951a319 100644
--- a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c
+++ b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c
@@ -191,8 +191,7 @@ static void sumo_construct_vid_mapping_table(struct 
amdgpu_device *adev,
 }
 
 #if 0
-static const struct kv_lcac_config_values sx_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values sx_local_cac_cfg_kv[] = {
{  0,   4,1},
{  1,   4,1},
{  2,   5,1},
@@ -204,32 +203,27 @@ static const struct kv_lcac_config_values 
sx_local_cac_cfg_kv[] =
{ 0x }
 };
 
-static const struct kv_lcac_config_values mc0_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values mc0_local_cac_cfg_kv[] = {
{  0,   4,1},
{ 0x }
 };
 
-static const struct kv_lcac_config_values mc1_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values mc1_local_cac_cfg_kv[] = {
{  0,   4,1},
{ 0x }
 };
 
-static const struct kv_lcac_config_values mc2_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values mc2_local_cac_cfg_kv[] = {
{  0,   4,1},
{ 0x }
 };
 
-static const struct kv_lcac_config_values mc3_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values mc3_local_cac_cfg_kv[] = {
{  0,   4,1},
{ 0x }
 };
 
-static const struct kv_lcac_config_values cpl_local_cac_cfg_kv[] =
-{
+static const struct kv_lcac_config_values cpl_local_cac_cfg_kv[] = {
{  0,   4,1},
{  1,   4,1},
{  2,   5,1},
@@ -260,39 +254,32 @@ static const struct kv_lcac_config_values 
cpl_local_cac_cfg_kv[] =
{ 0x }
 };
 
-static const struct kv_lcac_config_reg sx0_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg sx0_cac_config_reg[] = {
{ 0xc0400d00, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg mc0_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg mc0_cac_config_reg[] = {
{ 0xc0400d30, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg mc1_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg mc1_cac_config_reg[] = {
{ 0xc0400d3c, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg mc2_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg mc2_cac_config_reg[] = {
{ 0xc0400d48, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg mc3_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg mc3_cac_config_reg[] = {
{ 0xc0400d54, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 
-static const struct kv_lcac_config_reg cpl_cac_config_reg[] =
-{
+static const struct kv_lcac_config_reg cpl_cac_config_reg[] = {
{ 0xc0400d80, 0x003e, 17, 0x3fc0, 22, 0x0001fffe, 1, 
0x0001, 0 }
 };
 #endif
 
-static const struct kv_pt_config_reg didt_config_kv[] =
-{
+static const struct kv_pt_config_reg didt_config_kv[] = {
{ 0x10, 0x00ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
{ 0x10, 0xff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
{ 0x10, 0x00ff, 16, 0x0, KV_CONFIGREG_DIDT_IND },
@@ -1173,9 +1160,9 @@ static void kv_calculate_dfs_bypass_settings(struct 
amdgpu_device *adev)
pi->graphics_level[i].ClkBypassCntl = 2;
else if 
(kv_get_clock_difference(table->entries[i].clk, 26600) < 200)
pi->graphics_level[i].ClkBypassCntl = 7;
-   else if 
(kv_get_clock_difference(table->entries[i].clk , 2) < 200)
+   else if 
(kv_get_clock_difference(table->entries[i].clk, 2) < 200)
pi->graphics_level[i].ClkBypassCntl = 6;
-   else if 
(kv_get_clock_difference(table->entries[i].clk , 1) < 200)
+   else if 
(kv_get_clock_difference(table->entries[i].clk, 1) < 200)
pi->graphics_level[i].ClkBypassCntl = 8;
else
pi->graphics_level[i].ClkBypassCntl = 0;
@@ -1825,7 +1812,7 @@ static void 

[PATCH] drm/amd/pm: Clean up errors in smu8_smumgr.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: Use C99 flexible arrays

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/powerplay/smumgr/smu8_smumgr.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/smumgr/smu8_smumgr.h 
b/drivers/gpu/drm/amd/pm/powerplay/smumgr/smu8_smumgr.h
index c7b61222d258..475ffcf743d2 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/smumgr/smu8_smumgr.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/smumgr/smu8_smumgr.h
@@ -73,7 +73,7 @@ struct smu8_register_index_data_pair {
 
 struct smu8_ih_meta_data {
uint32_t command;
-   struct smu8_register_index_data_pair register_index_value_pair[1];
+   struct smu8_register_index_data_pair register_index_value_pair[0];
 };
 
 struct smu8_smumgr {
-- 
2.17.1



[PATCH] drm/amd/pm: Clean up errors in smu75.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: space prohibited before open square bracket '['
ERROR: "foo * bar" should be "foo *bar"

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/powerplay/inc/smu75.h | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/smu75.h 
b/drivers/gpu/drm/amd/pm/powerplay/inc/smu75.h
index 771523001533..7d5ed7751976 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/inc/smu75.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/inc/smu75.h
@@ -224,8 +224,8 @@ struct SMU7_LocalDpmScoreboard {
uint8_t  DteClampMode;
uint8_t  FpsClampMode;
 
-   uint16_t LevelResidencyCounters [SMU75_MAX_LEVELS_GRAPHICS];
-   uint16_t LevelSwitchCounters [SMU75_MAX_LEVELS_GRAPHICS];
+   uint16_t LevelResidencyCounters[SMU75_MAX_LEVELS_GRAPHICS];
+   uint16_t LevelSwitchCounters[SMU75_MAX_LEVELS_GRAPHICS];
 
void (*TargetStateCalculator)(uint8_t);
void (*SavedTargetStateCalculator)(uint8_t);
@@ -316,7 +316,7 @@ struct SMU7_VoltageScoreboard {
 
VoltageChangeHandler_t functionLinks[6];
 
-   uint16_t * VddcFollower1;
+   uint16_t *VddcFollower1;
int16_t  Driver_OD_RequestedVidOffset1;
int16_t  Driver_OD_RequestedVidOffset2;
 };
@@ -677,9 +677,9 @@ typedef struct SCS_CELL_t SCS_CELL_t;
 
 struct VFT_TABLE_t {
VFT_CELL_tCell[TEMP_RANGE_MAXSTEPS][NUM_VFT_COLUMNS];
-   uint16_t  AvfsGbv [NUM_VFT_COLUMNS];
-   uint16_t  BtcGbv  [NUM_VFT_COLUMNS];
-   int16_t   Temperature [TEMP_RANGE_MAXSTEPS];
+   uint16_t  AvfsGbv[NUM_VFT_COLUMNS];
+   uint16_t  BtcGbv[NUM_VFT_COLUMNS];
+   int16_t   Temperature[TEMP_RANGE_MAXSTEPS];
 
 #ifdef SMU__FIRMWARE_SCKS_PRESENT__1
SCS_CELL_tScksCell[TEMP_RANGE_MAXSTEPS][NUM_VFT_COLUMNS];
-- 
2.17.1



[PATCH] drm/amd/pm: Clean up errors in smu73.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: open brace '{' following struct go on the same line
ERROR: space prohibited before open square bracket '['
ERROR: "foo * bar" should be "foo *bar"

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/powerplay/inc/smu73.h | 45 
 1 file changed, 17 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/smu73.h 
b/drivers/gpu/drm/amd/pm/powerplay/inc/smu73.h
index c6b12a4c00db..cf4b2c3c65bc 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/inc/smu73.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/inc/smu73.h
@@ -37,8 +37,7 @@ enum Poly3rdOrderCoeff {
 POLY_3RD_ORDER_COUNT
 };
 
-struct SMU7_Poly3rdOrder_Data
-{
+struct SMU7_Poly3rdOrder_Data {
 int32_t a;
 int32_t b;
 int32_t c;
@@ -51,8 +50,7 @@ struct SMU7_Poly3rdOrder_Data
 
 typedef struct SMU7_Poly3rdOrder_Data SMU7_Poly3rdOrder_Data;
 
-struct Power_Calculator_Data
-{
+struct Power_Calculator_Data {
   uint16_t NoLoadVoltage;
   uint16_t LoadVoltage;
   uint16_t Resistance;
@@ -71,8 +69,7 @@ struct Power_Calculator_Data
 
 typedef struct Power_Calculator_Data PowerCalculatorData_t;
 
-struct Gc_Cac_Weight_Data
-{
+struct Gc_Cac_Weight_Data {
   uint8_t index;
   uint32_t value;
 };
@@ -187,8 +184,7 @@ typedef struct {
 #define SMU73_THERMAL_CLAMP_MODE_COUNT 8
 
 
-struct SMU7_HystController_Data
-{
+struct SMU7_HystController_Data {
 uint16_t waterfall_up;
 uint16_t waterfall_down;
 uint16_t waterfall_limit;
@@ -199,8 +195,7 @@ struct SMU7_HystController_Data
 
 typedef struct SMU7_HystController_Data SMU7_HystController_Data;
 
-struct SMU73_PIDController
-{
+struct SMU73_PIDController {
 uint32_t Ki;
 int32_t LFWindupUpperLim;
 int32_t LFWindupLowerLim;
@@ -215,8 +210,7 @@ struct SMU73_PIDController
 
 typedef struct SMU73_PIDController SMU73_PIDController;
 
-struct SMU7_LocalDpmScoreboard
-{
+struct SMU7_LocalDpmScoreboard {
 uint32_t PercentageBusy;
 
 int32_t  PIDError;
@@ -261,8 +255,8 @@ struct SMU7_LocalDpmScoreboard
 uint8_t  DteClampMode;
 uint8_t  FpsClampMode;
 
-uint16_t LevelResidencyCounters [SMU73_MAX_LEVELS_GRAPHICS];
-uint16_t LevelSwitchCounters [SMU73_MAX_LEVELS_GRAPHICS];
+uint16_t LevelResidencyCounters[SMU73_MAX_LEVELS_GRAPHICS];
+uint16_t LevelSwitchCounters[SMU73_MAX_LEVELS_GRAPHICS];
 
 void (*TargetStateCalculator)(uint8_t);
 void (*SavedTargetStateCalculator)(uint8_t);
@@ -315,8 +309,7 @@ typedef uint8_t (*VoltageChangeHandler_t)(uint16_t, 
uint8_t);
 
 typedef uint32_t SMU_VoltageLevel;
 
-struct SMU7_VoltageScoreboard
-{
+struct SMU7_VoltageScoreboard {
 SMU_VoltageLevel TargetVoltage;
 uint16_t MaxVid;
 uint8_t  HighestVidOffset;
@@ -354,7 +347,7 @@ struct SMU7_VoltageScoreboard
 
 VoltageChangeHandler_t functionLinks[6];
 
-uint16_t * VddcFollower1;
+uint16_t *VddcFollower1;
 
 int16_t  Driver_OD_RequestedVidOffset1;
 int16_t  Driver_OD_RequestedVidOffset2;
@@ -366,8 +359,7 @@ typedef struct SMU7_VoltageScoreboard 
SMU7_VoltageScoreboard;
 // 
-
 #define SMU7_MAX_PCIE_LINK_SPEEDS 3 /* 0:Gen1 1:Gen2 2:Gen3 */
 
-struct SMU7_PCIeLinkSpeedScoreboard
-{
+struct SMU7_PCIeLinkSpeedScoreboard {
 uint8_t DpmEnable;
 uint8_t DpmRunning;
 uint8_t DpmForce;
@@ -396,8 +388,7 @@ typedef struct SMU7_PCIeLinkSpeedScoreboard 
SMU7_PCIeLinkSpeedScoreboard;
 #define SMU7_SCALE_I  7
 #define SMU7_SCALE_R 12
 
-struct SMU7_PowerScoreboard
-{
+struct SMU7_PowerScoreboard {
 uint32_t GpuPower;
 
 uint32_t VddcPower;
@@ -436,8 +427,7 @@ typedef struct SMU7_PowerScoreboard SMU7_PowerScoreboard;
 #define SMU7_VCE_SCLK_HANDSHAKE_DISABLE  0x0002
 
 // All 'soft registers' should be uint32_t.
-struct SMU73_SoftRegisters
-{
+struct SMU73_SoftRegisters {
 uint32_tRefClockFrequency;
 uint32_tPmTimerPeriod;
 uint32_tFeatureEnables;
@@ -493,8 +483,7 @@ struct SMU73_SoftRegisters
 
 typedef struct SMU73_SoftRegisters SMU73_SoftRegisters;
 
-struct SMU73_Firmware_Header
-{
+struct SMU73_Firmware_Header {
 uint32_t Digest[5];
 uint32_t Version;
 uint32_t HeaderSize;
@@ -708,9 +697,9 @@ typedef struct VFT_CELL_t VFT_CELL_t;
 
 struct VFT_TABLE_t {
   VFT_CELL_tCell[TEMP_RANGE_MAXSTEPS][NUM_VFT_COLUMNS];
-  uint16_t  AvfsGbv [NUM_VFT_COLUMNS];
-  uint16_t  BtcGbv  [NUM_VFT_COLUMNS];
-  uint16_t  Temperature [TEMP_RANGE_MAXSTEPS];
+  uint16_t  AvfsGbv[NUM_VFT_COLUMNS];
+  uint16_t  BtcGbv[NUM_VFT_COLUMNS];
+  uint16_t  Temperature[TEMP_RANGE_MAXSTEPS];
 
   uint8_t   NumTemperatureSteps;
   uint8_t   padding[3];
-- 
2.17.1



[PATCH] drm/amd/pm: Clean up errors in hwmgr.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: open brace '{' following struct go on the same line
ERROR: Use C99 flexible arrays

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h | 8 +++-
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h 
b/drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h
index 612d66aeaab9..81650727a5de 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h
@@ -190,8 +190,7 @@ struct phm_vce_clock_voltage_dependency_table {
 };
 
 
-enum SMU_ASIC_RESET_MODE
-{
+enum SMU_ASIC_RESET_MODE {
 SMU_ASIC_RESET_MODE_0,
 SMU_ASIC_RESET_MODE_1,
 SMU_ASIC_RESET_MODE_2,
@@ -516,7 +515,7 @@ struct phm_vq_budgeting_record {
 
 struct phm_vq_budgeting_table {
uint8_t numEntries;
-   struct phm_vq_budgeting_record entries[1];
+   struct phm_vq_budgeting_record entries[0];
 };
 
 struct phm_clock_and_voltage_limits {
@@ -607,8 +606,7 @@ struct phm_ppt_v2_information {
uint8_t  uc_dcef_dpm_voltage_mode;
 };
 
-struct phm_ppt_v3_information
-{
+struct phm_ppt_v3_information {
uint8_t uc_thermal_controller_type;
 
uint16_t us_small_power_limit1;
-- 
2.17.1



Re: [PATCH -next] drm/tests: Fix one kernel-doc comment

2023-08-01 Thread Randy Dunlap



On 8/1/23 17:46, Yang Li wrote:
> Make @drm_kunit_helper_context_alloc to
> @drm_kunit_helper_acquire_ctx_alloc, to silence the warning:
> 
> drivers/gpu/drm/tests/drm_kunit_helpers.c:172: warning: expecting prototype 
> for drm_kunit_helper_context_alloc(). Prototype was for 
> drm_kunit_helper_acquire_ctx_alloc() instead
> 
> Reported-by: Abaci Robot 
> Closes: https://bugzilla.openanolis.cn/show_bug.cgi?id=6073
> Signed-off-by: Yang Li 

Reviewed-by: Randy Dunlap 

Thanks.

> ---
>  drivers/gpu/drm/tests/drm_kunit_helpers.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/tests/drm_kunit_helpers.c 
> b/drivers/gpu/drm/tests/drm_kunit_helpers.c
> index 3d624ff2f651..c1dfbfcaa000 100644
> --- a/drivers/gpu/drm/tests/drm_kunit_helpers.c
> +++ b/drivers/gpu/drm/tests/drm_kunit_helpers.c
> @@ -156,7 +156,7 @@ static void action_drm_release_context(void *ptr)
>  }
>  
>  /**
> - * drm_kunit_helper_context_alloc - Allocates an acquire context
> + * drm_kunit_helper_acquire_ctx_alloc - Allocates an acquire context
>   * @test: The test context object
>   *
>   * Allocates and initializes a modeset acquire context.

-- 
~Randy


[PATCH] drm/amd/pm: Clean up errors in hardwaremanager.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: open brace '{' following struct go on the same line

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/powerplay/inc/hardwaremanager.h | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/hardwaremanager.h 
b/drivers/gpu/drm/amd/pm/powerplay/inc/hardwaremanager.h
index 01a7d66864f2..f4f9a104d170 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/inc/hardwaremanager.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/inc/hardwaremanager.h
@@ -44,8 +44,7 @@ struct phm_fan_speed_info {
 };
 
 /* Automatic Power State Throttling */
-enum PHM_AutoThrottleSource
-{
+enum PHM_AutoThrottleSource {
 PHM_AutoThrottleSource_Thermal,
 PHM_AutoThrottleSource_External
 };
-- 
2.17.1



[PATCH] drm/amd/pm: Clean up errors in pp_thermal.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: open brace '{' following struct go on the same line

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/powerplay/inc/pp_thermal.h | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/pp_thermal.h 
b/drivers/gpu/drm/amd/pm/powerplay/inc/pp_thermal.h
index f7c41185097e..2003acc70ca0 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/inc/pp_thermal.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/inc/pp_thermal.h
@@ -25,14 +25,12 @@
 
 #include "power_state.h"
 
-static const struct PP_TemperatureRange __maybe_unused 
SMU7ThermalWithDelayPolicy[] =
-{
+static const struct PP_TemperatureRange __maybe_unused 
SMU7ThermalWithDelayPolicy[] = {
{-273150,  99000, 99000, -273150, 99000, 99000, -273150, 99000, 99000},
{ 12, 12, 12, 12, 12, 12, 12, 12, 
12},
 };
 
-static const struct PP_TemperatureRange __maybe_unused SMU7ThermalPolicy[] =
-{
+static const struct PP_TemperatureRange __maybe_unused SMU7ThermalPolicy[] = {
{-273150,  99000, 99000, -273150, 99000, 99000, -273150, 99000, 99000},
{ 12, 12, 12, 12, 12, 12, 12, 12, 
12},
 };
-- 
2.17.1



[PATCH] drm/amd/pm: Clean up errors in smu7.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: open brace '{' following struct go on the same line

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/powerplay/inc/smu7.h | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/smu7.h 
b/drivers/gpu/drm/amd/pm/powerplay/inc/smu7.h
index e14072d45918..bfce9087a47f 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/inc/smu7.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/inc/smu7.h
@@ -101,8 +101,7 @@
 #define VR_SMIO_PATTERN_24
 #define VR_STATIC_VOLTAGE5
 
-struct SMU7_PIDController
-{
+struct SMU7_PIDController {
 uint32_t Ki;
 int32_t LFWindupUL;
 int32_t LFWindupLL;
@@ -136,8 +135,7 @@ typedef struct SMU7_PIDController SMU7_PIDController;
 #define SMU7_VCE_MCLK_HANDSHAKE_DISABLE  0x0001
 #define SMU7_VCE_SCLK_HANDSHAKE_DISABLE  0x0002
 
-struct SMU7_Firmware_Header
-{
+struct SMU7_Firmware_Header {
 uint32_t Digest[5];
 uint32_t Version;
 uint32_t HeaderSize;
-- 
2.17.1



[PATCH] drm/amd/pm: Clean up errors in smu7_fusion.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: open brace '{' following struct go on the same line
ERROR: space prohibited before open square bracket '['

Signed-off-by: Ran Sun 
---
 .../drm/amd/pm/powerplay/inc/smu7_fusion.h| 42 +++
 1 file changed, 16 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/smu7_fusion.h 
b/drivers/gpu/drm/amd/pm/powerplay/inc/smu7_fusion.h
index 78ada9ffd508..e130f52fe8d6 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/inc/smu7_fusion.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/inc/smu7_fusion.h
@@ -36,8 +36,7 @@
 #define SMU7_NUM_NON_TES 2
 
 // All 'soft registers' should be uint32_t.
-struct SMU7_SoftRegisters
-{
+struct SMU7_SoftRegisters {
 uint32_tRefClockFrequency;
 uint32_tPmTimerP;
 uint32_tFeatureEnables;
@@ -80,8 +79,7 @@ struct SMU7_SoftRegisters
 
 typedef struct SMU7_SoftRegisters SMU7_SoftRegisters;
 
-struct SMU7_Fusion_GraphicsLevel
-{
+struct SMU7_Fusion_GraphicsLevel {
 uint32_tMinVddNb;
 
 uint32_tSclkFrequency;
@@ -111,8 +109,7 @@ struct SMU7_Fusion_GraphicsLevel
 
 typedef struct SMU7_Fusion_GraphicsLevel SMU7_Fusion_GraphicsLevel;
 
-struct SMU7_Fusion_GIOLevel
-{
+struct SMU7_Fusion_GIOLevel {
 uint8_t EnabledForActivity;
 uint8_t LclkDid;
 uint8_t Vid;
@@ -137,8 +134,7 @@ struct SMU7_Fusion_GIOLevel
 typedef struct SMU7_Fusion_GIOLevel SMU7_Fusion_GIOLevel;
 
 // UVD VCLK/DCLK state (level) definition.
-struct SMU7_Fusion_UvdLevel
-{
+struct SMU7_Fusion_UvdLevel {
 uint32_t VclkFrequency;
 uint32_t DclkFrequency;
 uint16_t MinVddNb;
@@ -155,8 +151,7 @@ struct SMU7_Fusion_UvdLevel
 typedef struct SMU7_Fusion_UvdLevel SMU7_Fusion_UvdLevel;
 
 // Clocks for other external blocks (VCE, ACP, SAMU).
-struct SMU7_Fusion_ExtClkLevel
-{
+struct SMU7_Fusion_ExtClkLevel {
 uint32_t Frequency;
 uint16_t MinVoltage;
 uint8_t  Divider;
@@ -166,8 +161,7 @@ struct SMU7_Fusion_ExtClkLevel
 };
 typedef struct SMU7_Fusion_ExtClkLevel SMU7_Fusion_ExtClkLevel;
 
-struct SMU7_Fusion_ACPILevel
-{
+struct SMU7_Fusion_ACPILevel {
 uint32_tFlags;
 uint32_tMinVddNb;
 uint32_tSclkFrequency;
@@ -181,8 +175,7 @@ struct SMU7_Fusion_ACPILevel
 
 typedef struct SMU7_Fusion_ACPILevel SMU7_Fusion_ACPILevel;
 
-struct SMU7_Fusion_NbDpm
-{
+struct SMU7_Fusion_NbDpm {
 uint8_t DpmXNbPsHi;
 uint8_t DpmXNbPsLo;
 uint8_t Dpm0PgNbPsHi;
@@ -197,8 +190,7 @@ struct SMU7_Fusion_NbDpm
 
 typedef struct SMU7_Fusion_NbDpm SMU7_Fusion_NbDpm;
 
-struct SMU7_Fusion_StateInfo
-{
+struct SMU7_Fusion_StateInfo {
 uint32_t SclkFrequency;
 uint32_t LclkFrequency;
 uint32_t VclkFrequency;
@@ -214,8 +206,7 @@ struct SMU7_Fusion_StateInfo
 
 typedef struct SMU7_Fusion_StateInfo SMU7_Fusion_StateInfo;
 
-struct SMU7_Fusion_DpmTable
-{
+struct SMU7_Fusion_DpmTable {
 uint32_tSystemFlags;
 
 SMU7_PIDController  GraphicsPIDController;
@@ -230,12 +221,12 @@ struct SMU7_Fusion_DpmTable
 uint8_tSamuLevelCount;
 uint16_t   FpsHighT;
 
-SMU7_Fusion_GraphicsLevel GraphicsLevel   
[SMU__NUM_SCLK_DPM_STATE];
+SMU7_Fusion_GraphicsLevel GraphicsLevel[SMU__NUM_SCLK_DPM_STATE];
 SMU7_Fusion_ACPILevel ACPILevel;
-SMU7_Fusion_UvdLevel  UvdLevel
[SMU7_MAX_LEVELS_UVD];
-SMU7_Fusion_ExtClkLevel   VceLevel
[SMU7_MAX_LEVELS_VCE];
-SMU7_Fusion_ExtClkLevel   AcpLevel
[SMU7_MAX_LEVELS_ACP];
-SMU7_Fusion_ExtClkLevel   SamuLevel   
[SMU7_MAX_LEVELS_SAMU];
+SMU7_Fusion_UvdLevel  UvdLevel[SMU7_MAX_LEVELS_UVD];
+SMU7_Fusion_ExtClkLevel   VceLevel[SMU7_MAX_LEVELS_VCE];
+SMU7_Fusion_ExtClkLevel   AcpLevel[SMU7_MAX_LEVELS_ACP];
+SMU7_Fusion_ExtClkLevel   SamuLevel[SMU7_MAX_LEVELS_SAMU];
 
 uint8_t   UvdBootLevel;
 uint8_t   VceBootLevel;
@@ -266,10 +257,9 @@ struct SMU7_Fusion_DpmTable
 
 };
 
-struct SMU7_Fusion_GIODpmTable
-{
+struct SMU7_Fusion_GIODpmTable {
 
-SMU7_Fusion_GIOLevel  GIOLevel
[SMU7_MAX_LEVELS_GIO];
+SMU7_Fusion_GIOLevel  GIOLevel[SMU7_MAX_LEVELS_GIO];
 
 SMU7_PIDControllerGioPIDController;
 
-- 
2.17.1



[PATCH] drm/amd/pm: Clean up errors in smu71.h

2023-08-01 Thread Ran Sun
Fix the following errors reported by checkpatch:

ERROR: open brace '{' following struct go on the same line
ERROR: space prohibited before open square bracket '['

Signed-off-by: Ran Sun 
---
 drivers/gpu/drm/amd/pm/powerplay/inc/smu71.h | 22 +++-
 1 file changed, 8 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/smu71.h 
b/drivers/gpu/drm/amd/pm/powerplay/inc/smu71.h
index 71c9b2d28640..b5f177412769 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/inc/smu71.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/inc/smu71.h
@@ -118,8 +118,7 @@ typedef struct {
 
 #endif
 
-struct SMU71_PIDController
-{
+struct SMU71_PIDController {
 uint32_t Ki;
 int32_t LFWindupUpperLim;
 int32_t LFWindupLowerLim;
@@ -133,8 +132,7 @@ struct SMU71_PIDController
 
 typedef struct SMU71_PIDController SMU71_PIDController;
 
-struct SMU7_LocalDpmScoreboard
-{
+struct SMU7_LocalDpmScoreboard {
 uint32_t PercentageBusy;
 
 int32_t  PIDError;
@@ -179,8 +177,8 @@ struct SMU7_LocalDpmScoreboard
 uint8_t  DteClampMode;
 uint8_t  FpsClampMode;
 
-uint16_t LevelResidencyCounters [SMU71_MAX_LEVELS_GRAPHICS];
-uint16_t LevelSwitchCounters [SMU71_MAX_LEVELS_GRAPHICS];
+uint16_t LevelResidencyCounters[SMU71_MAX_LEVELS_GRAPHICS];
+uint16_t LevelSwitchCounters[SMU71_MAX_LEVELS_GRAPHICS];
 
 void (*TargetStateCalculator)(uint8_t);
 void (*SavedTargetStateCalculator)(uint8_t);
@@ -200,8 +198,7 @@ typedef struct SMU7_LocalDpmScoreboard 
SMU7_LocalDpmScoreboard;
 
 #define SMU7_MAX_VOLTAGE_CLIENTS 12
 
-struct SMU7_VoltageScoreboard
-{
+struct SMU7_VoltageScoreboard {
 uint16_t CurrentVoltage;
 uint16_t HighestVoltage;
 uint16_t MaxVid;
@@ -325,8 +322,7 @@ typedef struct SMU7_PowerScoreboard SMU7_PowerScoreboard;
 
 // 
--
 
-struct SMU7_ThermalScoreboard
-{
+struct SMU7_ThermalScoreboard {
int16_t  GpuLimit;
int16_t  GpuHyst;
uint16_t CurrGnbTemp;
@@ -360,8 +356,7 @@ typedef struct SMU7_ThermalScoreboard 
SMU7_ThermalScoreboard;
 #define SMU7_VCE_SCLK_HANDSHAKE_DISABLE  0x0002
 
 // All 'soft registers' should be uint32_t.
-struct SMU71_SoftRegisters
-{
+struct SMU71_SoftRegisters {
 uint32_tRefClockFrequency;
 uint32_tPmTimerPeriod;
 uint32_tFeatureEnables;
@@ -413,8 +408,7 @@ struct SMU71_SoftRegisters
 
 typedef struct SMU71_SoftRegisters SMU71_SoftRegisters;
 
-struct SMU71_Firmware_Header
-{
+struct SMU71_Firmware_Header {
 uint32_t Digest[5];
 uint32_t Version;
 uint32_t HeaderSize;
-- 
2.17.1



Re: [PATCH v2 4/7] drm/msm/mdss: populate missing data

2023-08-01 Thread Abhinav Kumar




On 7/28/2023 2:33 PM, Dmitry Baryshkov wrote:

As we are going to use MDSS data for DPU programming, populate missing
MDSS data. The UBWC 1.0 and no UBWC cases do not require MDSS
programming, so skip them.

Signed-off-by: Dmitry Baryshkov 
---
  drivers/gpu/drm/msm/msm_mdss.c | 21 +++--
  1 file changed, 19 insertions(+), 2 deletions(-)



I checked more internal docs on this. Was very hard to get hold of the 
docs having this information on msm8998.


Version is indeed 1.0 but register is not reflecting that.

Hence I am going to go ahead and ack this.

Reviewed-by: Abhinav Kumar 



[PATCH v3 2/3] phy: qcom: qmp-combo: switch to DRM_SIMPLE_BRIDGE

2023-08-01 Thread Dmitry Baryshkov
Switch to using the new DRM_SIMPLE_BRIDGE helper to create the
transparent DRM bridge device instead of handcoding corresponding
functionality.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/phy/qualcomm/Kconfig  |  2 +-
 drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 44 ++-
 2 files changed, 3 insertions(+), 43 deletions(-)

diff --git a/drivers/phy/qualcomm/Kconfig b/drivers/phy/qualcomm/Kconfig
index ced603806375..fb03e3b3f637 100644
--- a/drivers/phy/qualcomm/Kconfig
+++ b/drivers/phy/qualcomm/Kconfig
@@ -63,7 +63,7 @@ config PHY_QCOM_QMP_COMBO
depends on DRM || DRM=n
select GENERIC_PHY
select MFD_SYSCON
-   select DRM_PANEL_BRIDGE if DRM
+   select DRM_SIMPLE_BRIDGE if DRM
help
  Enable this to support the QMP Combo PHY transceiver that is used
  with USB3 and DisplayPort controllers on Qualcomm chips.
diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-combo.c 
b/drivers/phy/qualcomm/phy-qcom-qmp-combo.c
index 9c3de41ecedb..5c7615edb161 100644
--- a/drivers/phy/qualcomm/phy-qcom-qmp-combo.c
+++ b/drivers/phy/qualcomm/phy-qcom-qmp-combo.c
@@ -21,7 +21,7 @@
 #include 
 #include 
 
-#include 
+#include 
 
 #include 
 
@@ -1419,8 +1419,6 @@ struct qmp_combo {
struct clk_hw dp_link_hw;
struct clk_hw dp_pixel_hw;
 
-   struct drm_bridge bridge;
-
struct typec_switch_dev *sw;
enum typec_orientation orientation;
 };
@@ -3193,44 +3191,6 @@ static int qmp_combo_typec_switch_register(struct 
qmp_combo *qmp)
 }
 #endif
 
-#if IS_ENABLED(CONFIG_DRM)
-static int qmp_combo_bridge_attach(struct drm_bridge *bridge,
-  enum drm_bridge_attach_flags flags)
-{
-   struct qmp_combo *qmp = container_of(bridge, struct qmp_combo, bridge);
-   struct drm_bridge *next_bridge;
-
-   if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))
-   return -EINVAL;
-
-   next_bridge = devm_drm_of_get_bridge(qmp->dev, qmp->dev->of_node, 0, 0);
-   if (IS_ERR(next_bridge)) {
-   dev_err(qmp->dev, "failed to acquire drm_bridge: %pe\n", 
next_bridge);
-   return PTR_ERR(next_bridge);
-   }
-
-   return drm_bridge_attach(bridge->encoder, next_bridge, bridge,
-DRM_BRIDGE_ATTACH_NO_CONNECTOR);
-}
-
-static const struct drm_bridge_funcs qmp_combo_bridge_funcs = {
-   .attach = qmp_combo_bridge_attach,
-};
-
-static int qmp_combo_dp_register_bridge(struct qmp_combo *qmp)
-{
-   qmp->bridge.funcs = _combo_bridge_funcs;
-   qmp->bridge.of_node = qmp->dev->of_node;
-
-   return devm_drm_bridge_add(qmp->dev, >bridge);
-}
-#else
-static int qmp_combo_dp_register_bridge(struct qmp_combo *qmp)
-{
-   return 0;
-}
-#endif
-
 static int qmp_combo_parse_dt_lecacy_dp(struct qmp_combo *qmp, struct 
device_node *np)
 {
struct device *dev = qmp->dev;
@@ -3436,7 +3396,7 @@ static int qmp_combo_probe(struct platform_device *pdev)
if (ret)
return ret;
 
-   ret = qmp_combo_dp_register_bridge(qmp);
+   ret = drm_simple_bridge_register(dev);
if (ret)
return ret;
 
-- 
2.39.2



[PATCH v3 3/3] usb: typec: nb7vpq904m: switch to DRM_SIMPLE_BRIDGE

2023-08-01 Thread Dmitry Baryshkov
Switch to using the new DRM_SIMPLE_BRIDGE helper to create the
transparent DRM bridge device instead of handcoding corresponding
functionality.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/usb/typec/mux/Kconfig  |  2 +-
 drivers/usb/typec/mux/nb7vpq904m.c | 44 ++
 2 files changed, 3 insertions(+), 43 deletions(-)

diff --git a/drivers/usb/typec/mux/Kconfig b/drivers/usb/typec/mux/Kconfig
index 784b9d8107e9..350a7ffce67e 100644
--- a/drivers/usb/typec/mux/Kconfig
+++ b/drivers/usb/typec/mux/Kconfig
@@ -39,7 +39,7 @@ config TYPEC_MUX_NB7VPQ904M
tristate "On Semiconductor NB7VPQ904M Type-C redriver driver"
depends on I2C
depends on DRM || DRM=n
-   select DRM_PANEL_BRIDGE if DRM
+   select DRM_SIMPLE_BRIDGE if DRM
select REGMAP_I2C
help
  Say Y or M if your system has a On Semiconductor NB7VPQ904M Type-C
diff --git a/drivers/usb/typec/mux/nb7vpq904m.c 
b/drivers/usb/typec/mux/nb7vpq904m.c
index 9360b65e8b06..c89a956412ea 100644
--- a/drivers/usb/typec/mux/nb7vpq904m.c
+++ b/drivers/usb/typec/mux/nb7vpq904m.c
@@ -11,7 +11,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 #include 
 #include 
 #include 
@@ -70,8 +70,6 @@ struct nb7vpq904m {
bool swap_data_lanes;
struct typec_switch *typec_switch;
 
-   struct drm_bridge bridge;
-
struct mutex lock; /* protect non-concurrent retimer & switch */
 
enum typec_orientation orientation;
@@ -297,44 +295,6 @@ static int nb7vpq904m_retimer_set(struct typec_retimer 
*retimer, struct typec_re
return ret;
 }
 
-#if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE)
-static int nb7vpq904m_bridge_attach(struct drm_bridge *bridge,
-   enum drm_bridge_attach_flags flags)
-{
-   struct nb7vpq904m *nb7 = container_of(bridge, struct nb7vpq904m, 
bridge);
-   struct drm_bridge *next_bridge;
-
-   if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))
-   return -EINVAL;
-
-   next_bridge = devm_drm_of_get_bridge(>client->dev, 
nb7->client->dev.of_node, 0, 0);
-   if (IS_ERR(next_bridge)) {
-   dev_err(>client->dev, "failed to acquire drm_bridge: 
%pe\n", next_bridge);
-   return PTR_ERR(next_bridge);
-   }
-
-   return drm_bridge_attach(bridge->encoder, next_bridge, bridge,
-DRM_BRIDGE_ATTACH_NO_CONNECTOR);
-}
-
-static const struct drm_bridge_funcs nb7vpq904m_bridge_funcs = {
-   .attach = nb7vpq904m_bridge_attach,
-};
-
-static int nb7vpq904m_register_bridge(struct nb7vpq904m *nb7)
-{
-   nb7->bridge.funcs = _bridge_funcs;
-   nb7->bridge.of_node = nb7->client->dev.of_node;
-
-   return devm_drm_bridge_add(>client->dev, >bridge);
-}
-#else
-static int nb7vpq904m_register_bridge(struct nb7vpq904m *nb7)
-{
-   return 0;
-}
-#endif
-
 static const struct regmap_config nb7_regmap = {
.max_register = 0x1f,
.reg_bits = 8,
@@ -461,7 +421,7 @@ static int nb7vpq904m_probe(struct i2c_client *client)
 
gpiod_set_value(nb7->enable_gpio, 1);
 
-   ret = nb7vpq904m_register_bridge(nb7);
+   ret = drm_simple_bridge_register(dev);
if (ret)
return ret;
 
-- 
2.39.2



[PATCH v3 0/3] drm/display: simplify support for transparent DRM bridges

2023-08-01 Thread Dmitry Baryshkov
Supporting DP/USB-C can result in a chain of several transparent
bridges (PHY, redrivers, mux, etc). This results in drivers having
similar boilerplate code for such bridges.

Next, these drivers are susceptible to -EPROBE_DEFER loops: the next
bridge can either be probed from the bridge->attach callback, when it is
too late to return -EPROBE_DEFER, or from the probe() callback, when the
next bridge might not yet be available, because it depends on the
resources provided by the probing device.

Last, but not least, this results in the the internal knowledge of DRM
subsystem slowly diffusing into other subsystems, like PHY or USB/TYPEC.

To solve all these issues, define a separate DRM helper, which creates
separate aux device just for the bridge. During probe such aux device
doesn't result in the EPROBE_DEFER loops. Instead it allows the device
drivers to probe properly, according to the actual resource
dependencies. The bridge auxdevs are then probed when the next bridge
becomes available, sparing drivers from drm_bridge_attach() returning
-EPROBE_DEFER.

Proposed merge strategy: immutable branch with the drm commit, which is
then merged into PHY and USB subsystems together with the corresponding
patch.

Changes since v2:
 - ifdef'ed bridge->of_node access (LKP)

Changes since v1:
 - Added EXPORT_SYMBOL_GPL / MODULE_LICENSE / etc. to drm_simple_bridge

Dmitry Baryshkov (3):
  drm/display: add transparent bridge helper
  phy: qcom: qmp-combo: switch to DRM_SIMPLE_BRIDGE
  usb: typec: nb7vpq904m: switch to DRM_SIMPLE_BRIDGE

 drivers/gpu/drm/display/Kconfig |   9 ++
 drivers/gpu/drm/display/Makefile|   2 +
 drivers/gpu/drm/display/drm_simple_bridge.c | 127 
 drivers/phy/qualcomm/Kconfig|   2 +-
 drivers/phy/qualcomm/phy-qcom-qmp-combo.c   |  44 +--
 drivers/usb/typec/mux/Kconfig   |   2 +-
 drivers/usb/typec/mux/nb7vpq904m.c  |  44 +--
 include/drm/display/drm_simple_bridge.h |  19 +++
 8 files changed, 163 insertions(+), 86 deletions(-)
 create mode 100644 drivers/gpu/drm/display/drm_simple_bridge.c
 create mode 100644 include/drm/display/drm_simple_bridge.h

-- 
2.39.2



[PATCH v3 1/3] drm/display: add transparent bridge helper

2023-08-01 Thread Dmitry Baryshkov
Define a helper for creating simple transparent bridges which serve the
only purpose of linking devices into the bridge chain up to the last
bridge representing the connector. This is especially useful for
DP/USB-C bridge chains, which can span across several devices, but do
not require any additional functionality from the intermediate bridges.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/display/Kconfig |   9 ++
 drivers/gpu/drm/display/Makefile|   2 +
 drivers/gpu/drm/display/drm_simple_bridge.c | 127 
 include/drm/display/drm_simple_bridge.h |  19 +++
 4 files changed, 157 insertions(+)
 create mode 100644 drivers/gpu/drm/display/drm_simple_bridge.c
 create mode 100644 include/drm/display/drm_simple_bridge.h

diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kconfig
index 09712b88a5b8..a6132984b9e3 100644
--- a/drivers/gpu/drm/display/Kconfig
+++ b/drivers/gpu/drm/display/Kconfig
@@ -49,3 +49,12 @@ config DRM_DP_CEC
 
  Note: not all adapters support this feature, and even for those
  that do support this they often do not hook up the CEC pin.
+
+config DRM_SIMPLE_BRIDGE
+   tristate
+   depends on DRM
+   select AUXILIARY_BUS
+   select DRM_PANEL_BRIDGE
+   help
+ Simple transparent bridge that is used by several drivers to build
+ bridges chain.
diff --git a/drivers/gpu/drm/display/Makefile b/drivers/gpu/drm/display/Makefile
index 17ac4a1006a8..6e2b0d7f24b3 100644
--- a/drivers/gpu/drm/display/Makefile
+++ b/drivers/gpu/drm/display/Makefile
@@ -16,3 +16,5 @@ drm_display_helper-$(CONFIG_DRM_DP_AUX_CHARDEV) += 
drm_dp_aux_dev.o
 drm_display_helper-$(CONFIG_DRM_DP_CEC) += drm_dp_cec.o
 
 obj-$(CONFIG_DRM_DISPLAY_HELPER) += drm_display_helper.o
+
+obj-$(CONFIG_DRM_SIMPLE_BRIDGE) += drm_simple_bridge.o
diff --git a/drivers/gpu/drm/display/drm_simple_bridge.c 
b/drivers/gpu/drm/display/drm_simple_bridge.c
new file mode 100644
index ..9e80efe67b93
--- /dev/null
+++ b/drivers/gpu/drm/display/drm_simple_bridge.c
@@ -0,0 +1,127 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2023 Linaro Ltd.
+ *
+ * Author: Dmitry Baryshkov 
+ */
+#include 
+#include 
+
+#include 
+#include 
+
+static DEFINE_IDA(simple_bridge_ida);
+
+static void drm_simple_bridge_release(struct device *dev)
+{
+   struct auxiliary_device *adev = to_auxiliary_dev(dev);
+
+   kfree(adev);
+}
+
+static void drm_simple_bridge_unregister_adev(void *_adev)
+{
+   struct auxiliary_device *adev = _adev;
+
+   auxiliary_device_delete(adev);
+   auxiliary_device_uninit(adev);
+}
+
+int drm_simple_bridge_register(struct device *parent)
+{
+   struct auxiliary_device *adev;
+   int ret;
+
+   adev = kzalloc(sizeof(*adev), GFP_KERNEL);
+   if (!adev)
+   return -ENOMEM;
+
+   ret = ida_alloc(_bridge_ida, GFP_KERNEL);
+   if (ret < 0)
+   return ret;
+
+   adev->id = ret;
+   adev->name = "simple_bridge";
+   adev->dev.parent = parent;
+   adev->dev.of_node = parent->of_node;
+   adev->dev.release = drm_simple_bridge_release;
+
+   ret = auxiliary_device_init(adev);
+   if (ret) {
+   kfree(adev);
+   return ret;
+   }
+
+   ret = auxiliary_device_add(adev);
+   if (ret) {
+   auxiliary_device_uninit(adev);
+   return ret;
+   }
+
+   return devm_add_action_or_reset(parent, 
drm_simple_bridge_unregister_adev, adev);
+}
+EXPORT_SYMBOL_GPL(drm_simple_bridge_register);
+
+struct drm_simple_bridge_data {
+   struct drm_bridge bridge;
+   struct drm_bridge *next_bridge;
+   struct device *dev;
+};
+
+static int drm_simple_bridge_attach(struct drm_bridge *bridge,
+   enum drm_bridge_attach_flags flags)
+{
+   struct drm_simple_bridge_data *data;
+
+   if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))
+   return -EINVAL;
+
+   data = container_of(bridge, struct drm_simple_bridge_data, bridge);
+
+   return drm_bridge_attach(bridge->encoder, data->next_bridge, bridge,
+DRM_BRIDGE_ATTACH_NO_CONNECTOR);
+}
+
+static const struct drm_bridge_funcs drm_simple_bridge_funcs = {
+   .attach = drm_simple_bridge_attach,
+};
+
+static int drm_simple_bridge_probe(struct auxiliary_device *auxdev,
+  const struct auxiliary_device_id *id)
+{
+   struct drm_simple_bridge_data *data;
+
+   data = devm_kzalloc(>dev, sizeof(*data), GFP_KERNEL);
+   if (!data)
+   return -ENOMEM;
+
+   data->dev = >dev;
+   data->next_bridge = devm_drm_of_get_bridge(>dev, 
auxdev->dev.of_node, 0, 0);
+   if (IS_ERR(data->next_bridge))
+   return dev_err_probe(>dev, PTR_ERR(data->next_bridge),
+"failed to acquire drm_bridge\n");
+
+   data->bridge.funcs = 

Re: [PATCH] drm/amd/pm: Clean up errors in smu73_discrete.h

2023-08-01 Thread Bagas Sanjaya
On 01/08/2023 18:34, Jani Nikula wrote:
> On Tue, 01 Aug 2023, Bagas Sanjaya  wrote:
>> And it is unfortunate that you and @208suo.com people doesn't reply to
>> review comments (try searching lore.kernel.org)
> 
> Essentially a one-way firehose of patches pointed at our general
> direction is not benefitial to the community. It's not participation,
> it's not co-operation. If the review gets ignored, why should we invest
> our time on *any* of the patches?
> 
> 

Well, I guess this is the kind of "hey, some new orgs spam us tens
of trivial patches, then we review them as usual, but people from
that org are deaf in regards of our reviews (maybe deliberately?)".
The exact same situation happened last year with @cdjrlc.com
people, when they were notoriously known for spell-fixing and
redundant word fixing patches. Many of these patches were correct,
but some of them were not, triggering reviews requesting changes.
Yet, they also ignore the reviews.

Thanks.

-- 
An old man doll... just what I always wanted! - Clara



[PATCH -next] drm/tests: Fix one kernel-doc comment

2023-08-01 Thread Yang Li
Make @drm_kunit_helper_context_alloc to
@drm_kunit_helper_acquire_ctx_alloc, to silence the warning:

drivers/gpu/drm/tests/drm_kunit_helpers.c:172: warning: expecting prototype for 
drm_kunit_helper_context_alloc(). Prototype was for 
drm_kunit_helper_acquire_ctx_alloc() instead

Reported-by: Abaci Robot 
Closes: https://bugzilla.openanolis.cn/show_bug.cgi?id=6073
Signed-off-by: Yang Li 
---
 drivers/gpu/drm/tests/drm_kunit_helpers.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tests/drm_kunit_helpers.c 
b/drivers/gpu/drm/tests/drm_kunit_helpers.c
index 3d624ff2f651..c1dfbfcaa000 100644
--- a/drivers/gpu/drm/tests/drm_kunit_helpers.c
+++ b/drivers/gpu/drm/tests/drm_kunit_helpers.c
@@ -156,7 +156,7 @@ static void action_drm_release_context(void *ptr)
 }
 
 /**
- * drm_kunit_helper_context_alloc - Allocates an acquire context
+ * drm_kunit_helper_acquire_ctx_alloc - Allocates an acquire context
  * @test: The test context object
  *
  * Allocates and initializes a modeset acquire context.
-- 
2.20.1.7.g153144c



RE: [PATCH -next] drm/amd/pm: Remove many unnecessary NULL values

2023-08-01 Thread Quan, Evan
[AMD Official Use Only - General]

Reviewed-by: Evan Quan 

> -Original Message-
> From: Ruan Jinjie 
> Sent: Tuesday, August 1, 2023 8:55 PM
> To: Quan, Evan ; Deucher, Alexander
> ; Koenig, Christian
> ; Pan, Xinhui ;
> airl...@gmail.com; dan...@ffwll.ch; mrip...@kernel.org;
> tzimmerm...@suse.de; d...@mailo.com; amd-...@lists.freedesktop.org; dri-
> de...@lists.freedesktop.org
> Cc: ruanjin...@huawei.com
> Subject: [PATCH -next] drm/amd/pm: Remove many unnecessary NULL values
>
> Ther are many pointers assigned first, which need not to be initialized, so
> remove the NULL assignment.
>
> Signed-off-by: Ruan Jinjie 
> ---
>  drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c | 2 +-
>  drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c  | 2 +-
>  drivers/gpu/drm/amd/pm/powerplay/smumgr/fiji_smumgr.c| 2 +-
>  drivers/gpu/drm/amd/pm/powerplay/smumgr/iceland_smumgr.c | 2 +-
>  drivers/gpu/drm/amd/pm/powerplay/smumgr/tonga_smumgr.c   | 2 +-
>  5 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c
> b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c
> index 182118e3fd5f..5794b64507bf 100644
> --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c
> +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c
> @@ -1237,7 +1237,7 @@ static int get_vce_clock_voltage_limit_table(struct
> pp_hwmgr *hwmgr,
>   const VCEClockInfoArray*array)
>  {
>   unsigned long i;
> - struct phm_vce_clock_voltage_dependency_table *vce_table = NULL;
> + struct phm_vce_clock_voltage_dependency_table *vce_table;
>
>   vce_table = kzalloc(struct_size(vce_table, entries, table->numEntries),
>   GFP_KERNEL);
> diff --git a/drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c
> b/drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c
> index 4bc8db1be738..9e4228232f02 100644
> --- a/drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c
> +++ b/drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c
> @@ -2732,7 +2732,7 @@ static bool ci_is_dpm_running(struct pp_hwmgr
> *hwmgr)
>
>  static int ci_smu_init(struct pp_hwmgr *hwmgr)
>  {
> - struct ci_smumgr *ci_priv = NULL;
> + struct ci_smumgr *ci_priv;
>
>   ci_priv = kzalloc(sizeof(struct ci_smumgr), GFP_KERNEL);
>
> diff --git a/drivers/gpu/drm/amd/pm/powerplay/smumgr/fiji_smumgr.c
> b/drivers/gpu/drm/amd/pm/powerplay/smumgr/fiji_smumgr.c
> index 02c094a06605..5e43ad2b2956 100644
> --- a/drivers/gpu/drm/amd/pm/powerplay/smumgr/fiji_smumgr.c
> +++ b/drivers/gpu/drm/amd/pm/powerplay/smumgr/fiji_smumgr.c
> @@ -332,7 +332,7 @@ static bool fiji_is_hw_avfs_present(struct pp_hwmgr
> *hwmgr)
>
>  static int fiji_smu_init(struct pp_hwmgr *hwmgr)
>  {
> - struct fiji_smumgr *fiji_priv = NULL;
> + struct fiji_smumgr *fiji_priv;
>
>   fiji_priv = kzalloc(sizeof(struct fiji_smumgr), GFP_KERNEL);
>
> diff --git a/drivers/gpu/drm/amd/pm/powerplay/smumgr/iceland_smumgr.c
> b/drivers/gpu/drm/amd/pm/powerplay/smumgr/iceland_smumgr.c
> index 060fc140c574..97d9802fe673 100644
> --- a/drivers/gpu/drm/amd/pm/powerplay/smumgr/iceland_smumgr.c
> +++ b/drivers/gpu/drm/amd/pm/powerplay/smumgr/iceland_smumgr.c
> @@ -259,7 +259,7 @@ static int iceland_start_smu(struct pp_hwmgr
> *hwmgr)
>
>  static int iceland_smu_init(struct pp_hwmgr *hwmgr)
>  {
> - struct iceland_smumgr *iceland_priv = NULL;
> + struct iceland_smumgr *iceland_priv;
>
>   iceland_priv = kzalloc(sizeof(struct iceland_smumgr), GFP_KERNEL);
>
> diff --git a/drivers/gpu/drm/amd/pm/powerplay/smumgr/tonga_smumgr.c
> b/drivers/gpu/drm/amd/pm/powerplay/smumgr/tonga_smumgr.c
> index acbe41174d7e..6fe6e6abb5d8 100644
> --- a/drivers/gpu/drm/amd/pm/powerplay/smumgr/tonga_smumgr.c
> +++ b/drivers/gpu/drm/amd/pm/powerplay/smumgr/tonga_smumgr.c
> @@ -226,7 +226,7 @@ static int tonga_start_smu(struct pp_hwmgr
> *hwmgr)
>
>  static int tonga_smu_init(struct pp_hwmgr *hwmgr)
>  {
> - struct tonga_smumgr *tonga_priv = NULL;
> + struct tonga_smumgr *tonga_priv;
>
>   tonga_priv = kzalloc(sizeof(struct tonga_smumgr), GFP_KERNEL);
>   if (tonga_priv == NULL)
> --
> 2.34.1



Re: [PATCH v5 22/22] checkpatch: reword long-line warn about commit-msg

2023-08-01 Thread Joe Perches
On Tue, 2023-08-01 at 17:35 -0600, Jim Cromie wrote:
> Reword the warning to complain about line length 1st, since thats
> whats actually tested.
[]
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
[]
> @@ -3272,7 +3272,7 @@ sub process {
>   # A Fixes:, link or signature tag line
> $commit_log_possible_stack_dump)) {
>   WARN("COMMIT_LOG_LONG_LINE",
> -  "Possible unwrapped commit description (prefer a 
> maximum 75 chars per line)\n" . $herecurr);
> +  "Prefer a maximum 75 chars per line (possible 
> unwrapped commit description?)\n" . $herecurr);
>   $commit_log_long_line = 1;
>   }

I don't think this adds any clarity.  Anyone else? 



[PATCH v5 20/22] drm-drivers: DRM_CLASSMAP_USE in 2nd batch of drivers, helpers

2023-08-01 Thread Jim Cromie
Add a DRM_CLASSMAP_USE declaration to 2nd batch of helpers and *_drv.c
files.  For drivers, add the decl just above the module's PARAMs,
since it identifies the "inherited" drm.debug param.

Note: with CONFIG_DRM_USE_DYNAMIC_DEBUG=y, a module not also declaring
DRM_CLASSMAP_USE will have its class'd prdbgs stuck in the initial
(disabled, but for DEBUG) state.

The stuck sites are evident in /proc/dynamic_debug/control as:

   class unknown, _id:N # control's last column

rather than a proper "enumeration":

   class:DRM_UT_CORE

This set of updates was found by choosing M for all DRM-config items I
found (not allmodconfig), building & modprobing them, and grepping
"class unknown," control.  There may yet be others.

Signed-off-by: Jim Cromie 
---
 drivers/gpu/drm/drm_gem_shmem_helper.c | 2 ++
 drivers/gpu/drm/gud/gud_drv.c  | 2 ++
 drivers/gpu/drm/mgag200/mgag200_drv.c  | 2 ++
 drivers/gpu/drm/qxl/qxl_drv.c  | 2 ++
 drivers/gpu/drm/radeon/radeon_drv.c| 2 ++
 drivers/gpu/drm/udl/udl_main.c | 2 ++
 drivers/gpu/drm/vkms/vkms_drv.c| 2 ++
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c| 2 ++
 8 files changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c 
b/drivers/gpu/drm/drm_gem_shmem_helper.c
index 4ea6507a77e5..5e02df98327b 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -23,6 +23,8 @@
 #include 
 #include 
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 MODULE_IMPORT_NS(DMA_BUF);
 
 /**
diff --git a/drivers/gpu/drm/gud/gud_drv.c b/drivers/gpu/drm/gud/gud_drv.c
index 9d7bf8ee45f1..5b555045fce4 100644
--- a/drivers/gpu/drm/gud/gud_drv.c
+++ b/drivers/gpu/drm/gud/gud_drv.c
@@ -31,6 +31,8 @@
 
 #include "gud_internal.h"
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 /* Only used internally */
 static const struct drm_format_info gud_drm_format_r1 = {
.format = GUD_DRM_FORMAT_R1,
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c 
b/drivers/gpu/drm/mgag200/mgag200_drv.c
index 976f0ab2006b..a1b2be1c27f6 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.c
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.c
@@ -24,6 +24,8 @@ int mgag200_modeset = -1;
 MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
 module_param_named(modeset, mgag200_modeset, int, 0400);
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 int mgag200_init_pci_options(struct pci_dev *pdev, u32 option, u32 option2)
 {
struct device *dev = >dev;
diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
index a3b83f89e061..12600f557c23 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.c
+++ b/drivers/gpu/drm/qxl/qxl_drv.c
@@ -65,6 +65,8 @@ module_param_named(modeset, qxl_modeset, int, 0400);
 MODULE_PARM_DESC(num_heads, "Number of virtual crtcs to expose (default 4)");
 module_param_named(num_heads, qxl_num_crtc, int, 0400);
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 static struct drm_driver qxl_driver;
 static struct pci_driver qxl_pci_driver;
 
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c 
b/drivers/gpu/drm/radeon/radeon_drv.c
index e4374814f0ef..4219276ade6a 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -274,6 +274,8 @@ int radeon_cik_support = 1;
 MODULE_PARM_DESC(cik_support, "CIK support (1 = enabled (default), 0 = 
disabled)");
 module_param_named(cik_support, radeon_cik_support, int, 0444);
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 static struct pci_device_id pciidlist[] = {
radeon_PCI_IDS
 };
diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c
index 061cb88c08a2..8f9dfe89f64a 100644
--- a/drivers/gpu/drm/udl/udl_main.c
+++ b/drivers/gpu/drm/udl/udl_main.c
@@ -19,6 +19,8 @@
 
 #define NR_USB_REQUEST_CHANNEL 0x12
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 #define MAX_TRANSFER (PAGE_SIZE*16 - BULK_SIZE)
 #define WRITES_IN_FLIGHT (20)
 #define MAX_VENDOR_DESCRIPTOR_SIZE 256
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 6d3a2d57d992..086a9933fcdf 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -39,6 +39,8 @@
 
 static struct vkms_config *default_config;
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 static bool enable_cursor = true;
 module_param_named(enable_cursor, enable_cursor, bool, 0444);
 MODULE_PARM_DESC(enable_cursor, "Enable/Disable cursor support");
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 8b24ecf60e3e..9cb6be422621 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -275,6 +275,8 @@ static int vmw_probe(struct pci_dev *, const struct 
pci_device_id *);
 static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
  void *ptr);
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 MODULE_PARM_DESC(restrict_iommu, "Try to limit IOMMU usage for TTM pages");
 module_param_named(restrict_iommu, vmw_restrict_iommu, int, 0600);
 

[PATCH v5 21/23] drm-drivers: DRM_CLASSMAP_USE in 2nd batch of drivers, helpers

2023-08-01 Thread Jim Cromie
Add a DRM_CLASSMAP_USE declaration to 2nd batch of helpers and *_drv.c
files.  For drivers, add the decl just above the module's PARAMs,
since it identifies the "inherited" drm.debug param.

Note: with CONFIG_DRM_USE_DYNAMIC_DEBUG=y, a module not also declaring
DRM_CLASSMAP_USE will have its class'd prdbgs stuck in the initial
(disabled, but for DEBUG) state.

The stuck sites are evident in /proc/dynamic_debug/control as:

   class unknown, _id:N # control's last column

rather than a proper "enumeration":

   class:DRM_UT_CORE

This set of updates was found by choosing M for all DRM-config items I
found (not allmodconfig), building & modprobing them, and grepping
"class unknown," control.  There may yet be others.

Signed-off-by: Jim Cromie 
---
 drivers/gpu/drm/drm_gem_shmem_helper.c | 2 ++
 drivers/gpu/drm/gud/gud_drv.c  | 2 ++
 drivers/gpu/drm/mgag200/mgag200_drv.c  | 2 ++
 drivers/gpu/drm/qxl/qxl_drv.c  | 2 ++
 drivers/gpu/drm/radeon/radeon_drv.c| 2 ++
 drivers/gpu/drm/udl/udl_main.c | 2 ++
 drivers/gpu/drm/vkms/vkms_drv.c| 2 ++
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c| 2 ++
 8 files changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c 
b/drivers/gpu/drm/drm_gem_shmem_helper.c
index 4ea6507a77e5..5e02df98327b 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -23,6 +23,8 @@
 #include 
 #include 
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 MODULE_IMPORT_NS(DMA_BUF);
 
 /**
diff --git a/drivers/gpu/drm/gud/gud_drv.c b/drivers/gpu/drm/gud/gud_drv.c
index 9d7bf8ee45f1..5b555045fce4 100644
--- a/drivers/gpu/drm/gud/gud_drv.c
+++ b/drivers/gpu/drm/gud/gud_drv.c
@@ -31,6 +31,8 @@
 
 #include "gud_internal.h"
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 /* Only used internally */
 static const struct drm_format_info gud_drm_format_r1 = {
.format = GUD_DRM_FORMAT_R1,
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c 
b/drivers/gpu/drm/mgag200/mgag200_drv.c
index 976f0ab2006b..a1b2be1c27f6 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.c
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.c
@@ -24,6 +24,8 @@ int mgag200_modeset = -1;
 MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
 module_param_named(modeset, mgag200_modeset, int, 0400);
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 int mgag200_init_pci_options(struct pci_dev *pdev, u32 option, u32 option2)
 {
struct device *dev = >dev;
diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
index a3b83f89e061..12600f557c23 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.c
+++ b/drivers/gpu/drm/qxl/qxl_drv.c
@@ -65,6 +65,8 @@ module_param_named(modeset, qxl_modeset, int, 0400);
 MODULE_PARM_DESC(num_heads, "Number of virtual crtcs to expose (default 4)");
 module_param_named(num_heads, qxl_num_crtc, int, 0400);
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 static struct drm_driver qxl_driver;
 static struct pci_driver qxl_pci_driver;
 
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c 
b/drivers/gpu/drm/radeon/radeon_drv.c
index e4374814f0ef..4219276ade6a 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -274,6 +274,8 @@ int radeon_cik_support = 1;
 MODULE_PARM_DESC(cik_support, "CIK support (1 = enabled (default), 0 = 
disabled)");
 module_param_named(cik_support, radeon_cik_support, int, 0444);
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 static struct pci_device_id pciidlist[] = {
radeon_PCI_IDS
 };
diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c
index 061cb88c08a2..8f9dfe89f64a 100644
--- a/drivers/gpu/drm/udl/udl_main.c
+++ b/drivers/gpu/drm/udl/udl_main.c
@@ -19,6 +19,8 @@
 
 #define NR_USB_REQUEST_CHANNEL 0x12
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 #define MAX_TRANSFER (PAGE_SIZE*16 - BULK_SIZE)
 #define WRITES_IN_FLIGHT (20)
 #define MAX_VENDOR_DESCRIPTOR_SIZE 256
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 6d3a2d57d992..086a9933fcdf 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -39,6 +39,8 @@
 
 static struct vkms_config *default_config;
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 static bool enable_cursor = true;
 module_param_named(enable_cursor, enable_cursor, bool, 0444);
 MODULE_PARM_DESC(enable_cursor, "Enable/Disable cursor support");
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 8b24ecf60e3e..9cb6be422621 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -275,6 +275,8 @@ static int vmw_probe(struct pci_dev *, const struct 
pci_device_id *);
 static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
  void *ptr);
 
+DRM_CLASSMAP_USE(drm_debug_classes);
+
 MODULE_PARM_DESC(restrict_iommu, "Try to limit IOMMU usage for TTM pages");
 module_param_named(restrict_iommu, vmw_restrict_iommu, int, 0600);
 

[PATCH v5 22/22] checkpatch: reword long-line warn about commit-msg

2023-08-01 Thread Jim Cromie
Reword the warning to complain about line length 1st, since thats
whats actually tested.

Cc: a...@canonical.com
Cc: j...@perches.com
Signed-off-by: Jim Cromie 
---
 scripts/checkpatch.pl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index f6b6b2a50dfe..31c55e3ece09 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -3272,7 +3272,7 @@ sub process {
# A Fixes:, link or signature tag line
  $commit_log_possible_stack_dump)) {
WARN("COMMIT_LOG_LONG_LINE",
-"Possible unwrapped commit description (prefer a 
maximum 75 chars per line)\n" . $herecurr);
+"Prefer a maximum 75 chars per line (possible 
unwrapped commit description?)\n" . $herecurr);
$commit_log_long_line = 1;
}
 
-- 
2.41.0



[PATCH v5 19/23] dyndbg-test: build it with just CONFIG_DYNAMIC_DEBUG_CORE

2023-08-01 Thread Jim Cromie
Make the test-module buildable with CONFIG_DYNAMIC_DEBUG_CORE; add
CFLAGS_$ofile defns to supply -DDYNAMIC_DEBUG_MODULE to cc.  Change
the Kconfig entry to allow building with just _CORE, and fix the help
text.

Signed-off-by: Jim Cromie 
---
 lib/Kconfig.debug | 10 +-
 lib/Makefile  |  2 ++
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index ce51d4dc6803..22e022ceb9a1 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -2695,12 +2695,12 @@ config TEST_STATIC_KEYS
  If unsure, say N.
 
 config TEST_DYNAMIC_DEBUG
-   tristate "Test DYNAMIC_DEBUG"
-   depends on DYNAMIC_DEBUG
+   tristate "Build test-dynamic-debug module"
+   depends on DYNAMIC_DEBUG || DYNAMIC_DEBUG_CORE
help
- This module registers a tracer callback to count enabled
- pr_debugs in a 'do_debugging' function, then alters their
- enablements, calls the function, and compares counts.
+ This module works/demo's the dyndbg's classmap API, by
+ creating 2 classes: a DISJOINT classmap (like DRM.debug)
+ and a LEVELS/VERBOSE classmap (like verbose2 > verbose1).
 
  If unsure, say N.
 
diff --git a/lib/Makefile b/lib/Makefile
index f36048371dd2..8411015a57c1 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -233,6 +233,8 @@ obj-$(CONFIG_HAVE_ARCH_TRACEHOOK) += syscall.o
 obj-$(CONFIG_DYNAMIC_DEBUG_CORE) += dynamic_debug.o
 #ensure exported functions have prototypes
 CFLAGS_dynamic_debug.o := -DDYNAMIC_DEBUG_MODULE
+CFLAGS_test_dynamic_debug.o := -DDYNAMIC_DEBUG_MODULE
+CFLAGS_test_dynamic_debug_submod.o := -DDYNAMIC_DEBUG_MODULE
 
 obj-$(CONFIG_SYMBOLIC_ERRNAME) += errname.o
 
-- 
2.41.0



[PATCH v5 22/23] dyndbg-doc: add classmap info to howto

2023-08-01 Thread Jim Cromie
Add some basic info on classmap usage and api

Signed-off-by: Jim Cromie 
---
v5- adjustments per Randy Dunlap
---
 .../admin-guide/dynamic-debug-howto.rst   | 64 ++-
 1 file changed, 63 insertions(+), 1 deletion(-)

diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst 
b/Documentation/admin-guide/dynamic-debug-howto.rst
index 8dc668cc1216..b8d2a7235cbb 100644
--- a/Documentation/admin-guide/dynamic-debug-howto.rst
+++ b/Documentation/admin-guide/dynamic-debug-howto.rst
@@ -224,7 +224,6 @@ the ``p`` flag has meaning, other flags are ignored.
 Note the regexp ``^[-+=][flmpt_]+$`` matches a flags specification.
 To clear all flags at once, use ``=_`` or ``-flmpt``.
 
-
 Debug messages during Boot Process
 ==
 
@@ -374,3 +373,66 @@ just a shortcut for ``print_hex_dump(KERN_DEBUG)``.
 For ``print_hex_dump_debug()``/``print_hex_dump_bytes()``, format string is
 its ``prefix_str`` argument, if it is constant string; or ``hexdump``
 in case ``prefix_str`` is built dynamically.
+
+Dynamic Debug classmaps
+===
+
+Dyndbg generally selects *prdbg* callsites using structural info:
+module, file, function, line.  Using classmaps, user modules can
+organize/select pr_debug()s as they like.
+
+- classes coordinates/spans multiple modules
+- complements the mod,file,func attrs
+- keeps pr_debug's 0-off-cost JUMP_LABEL goodness
+- isolates each from other class'd and un-class'd pr_debugs()
+  (one doesn't intermix 2 clients' bank accounts)
+
+  # IOW this doesn't change DRM.debug settings
+  #> echo -p > /proc/dynamic_debug/control
+
+  # change the classes by naming them explicitly (no wildcard here)
+  #> echo class DRM_UT_CORE +p > /proc/dynamic_debug/control
+
+To support DRM.debug (/sys/module/drm/parameters/debug), dyndbg
+provides DYNDBG_CLASSMAP_PARAM*.  It maps the categories/classes:
+DRM_UT_CORE.. to bits 0..N, allowing to set all classes at once.
+
+Dynamic Debug Classmap API
+==
+
+DYNDBG_CLASSMAP_DEFINE - modules create CLASSMAPs, naming the classes
+and type, and mapping the class-names to consecutive _class_ids.  By
+doing so, they tell dyndbg that they are using those class_ids, and
+authorize dyndbg to manipulate the callsites by their class-names.
+
+Its expected that client modules will follow the DRM.debug model:
+1. define their debug-classes using an enum type, where the enum
+symbol and its integer value define both the classnames and class-ids.
+2. use or macro-wrap __pr_debug_cls(ENUM_VAL, "hello world\n")
+
+There are 2 types of classmaps:
+
+ DD_CLASS_TYPE_DISJOINT_BITS: classes are independent, like DRM.debug
+ DD_CLASS_TYPE_LEVEL_NUM: classes are relative, ordered (V3 > V2)
+
+Both these classmap-types use the class-names/ENUM_VALs to validate
+commands into >control.
+
+DYNDBG_CLASSMAP_PARAM - refers to a DEFINEd classmap, exposing the set
+of defined classes to manipulation as a group.  This interface
+enforces the relatedness of classes of DD_CLASS_TYPE_LEVEL_NUM typed
+classmaps; all classes are independent in the >control parser itself.
+
+DYNDBG_CLASSMAP_USE - drm drivers use the CLASSMAP that drm DEFINEs.
+This shares the classmap definition, authorizes coordinated changes
+amongst the CLASSMAP DEFINEr and multiple USErs, and tells dyndbg
+how to initialize the user's prdbgs at modprobe.
+
+Modules or module-groups (drm & drivers) can define multiple
+classmaps, as long as they share the limited 0..62 per-module-group
+_class_id range, without overlap.
+
+``#define DEBUG`` will enable all pr_debugs in scope, including any
+class'd ones (__pr_debug_cls(id,fmt..)).  This won't be reflected in
+the PARAM readback value, but the pr_debug callsites can be toggled
+into agreement with the param.
-- 
2.41.0



[PATCH v5 23/23] checkpatch: reword long-line warn about commit-msg

2023-08-01 Thread Jim Cromie
Reword the warning to complain about line length 1st, since thats
whats actually tested.

Cc: a...@canonical.com
Cc: j...@perches.com
Signed-off-by: Jim Cromie 
---
 scripts/checkpatch.pl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index f6b6b2a50dfe..31c55e3ece09 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -3272,7 +3272,7 @@ sub process {
# A Fixes:, link or signature tag line
  $commit_log_possible_stack_dump)) {
WARN("COMMIT_LOG_LONG_LINE",
-"Possible unwrapped commit description (prefer a 
maximum 75 chars per line)\n" . $herecurr);
+"Prefer a maximum 75 chars per line (possible 
unwrapped commit description?)\n" . $herecurr);
$commit_log_long_line = 1;
}
 
-- 
2.41.0



[PATCH v5 21/22] dyndbg-doc: add classmap info to howto

2023-08-01 Thread Jim Cromie
Add some basic info on classmap usage and api

Signed-off-by: Jim Cromie 
---
 .../admin-guide/dynamic-debug-howto.rst   | 64 ++-
 1 file changed, 63 insertions(+), 1 deletion(-)

diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst 
b/Documentation/admin-guide/dynamic-debug-howto.rst
index 8dc668cc1216..b8d2a7235cbb 100644
--- a/Documentation/admin-guide/dynamic-debug-howto.rst
+++ b/Documentation/admin-guide/dynamic-debug-howto.rst
@@ -224,7 +224,6 @@ the ``p`` flag has meaning, other flags are ignored.
 Note the regexp ``^[-+=][flmpt_]+$`` matches a flags specification.
 To clear all flags at once, use ``=_`` or ``-flmpt``.
 
-
 Debug messages during Boot Process
 ==
 
@@ -374,3 +373,66 @@ just a shortcut for ``print_hex_dump(KERN_DEBUG)``.
 For ``print_hex_dump_debug()``/``print_hex_dump_bytes()``, format string is
 its ``prefix_str`` argument, if it is constant string; or ``hexdump``
 in case ``prefix_str`` is built dynamically.
+
+Dynamic Debug classmaps
+===
+
+Dyndbg generally selects *prdbg* callsites using structural info:
+module, file, function, line.  Using classmaps, user modules can
+organize/select pr_debug()s as they like.
+
+- classes coordinates/spans multiple modules
+- complements the mod,file,func attrs
+- keeps pr_debug's 0-off-cost JUMP_LABEL goodness
+- isolates each from other class'd and un-class'd pr_debugs()
+  (one doesn't intermix 2 clients' bank accounts)
+
+  # IOW this doesn't change DRM.debug settings
+  #> echo -p > /proc/dynamic_debug/control
+
+  # change the classes by naming them explicitly (no wildcard here)
+  #> echo class DRM_UT_CORE +p > /proc/dynamic_debug/control
+
+To support DRM.debug (/sys/module/drm/parameters/debug), dyndbg
+provides DYNDBG_CLASSMAP_PARAM*.  It maps the categories/classes:
+DRM_UT_CORE.. to bits 0..N, allowing to set all classes at once.
+
+Dynamic Debug Classmap API
+==
+
+DYNDBG_CLASSMAP_DEFINE - modules create CLASSMAPs, naming the classes
+and type, and mapping the class-names to consecutive _class_ids.  By
+doing so, they tell dyndbg that they are using those class_ids, and
+authorize dyndbg to manipulate the callsites by their class-names.
+
+Its expected that client modules will follow the DRM.debug model:
+1. define their debug-classes using an enum type, where the enum
+symbol and its integer value define both the classnames and class-ids.
+2. use or macro-wrap __pr_debug_cls(ENUM_VAL, "hello world\n")
+
+There are 2 types of classmaps:
+
+ DD_CLASS_TYPE_DISJOINT_BITS: classes are independent, like DRM.debug
+ DD_CLASS_TYPE_LEVEL_NUM: classes are relative, ordered (V3 > V2)
+
+Both these classmap-types use the class-names/ENUM_VALs to validate
+commands into >control.
+
+DYNDBG_CLASSMAP_PARAM - refers to a DEFINEd classmap, exposing the set
+of defined classes to manipulation as a group.  This interface
+enforces the relatedness of classes of DD_CLASS_TYPE_LEVEL_NUM typed
+classmaps; all classes are independent in the >control parser itself.
+
+DYNDBG_CLASSMAP_USE - drm drivers use the CLASSMAP that drm DEFINEs.
+This shares the classmap definition, authorizes coordinated changes
+amongst the CLASSMAP DEFINEr and multiple USErs, and tells dyndbg
+how to initialize the user's prdbgs at modprobe.
+
+Modules or module-groups (drm & drivers) can define multiple
+classmaps, as long as they share the limited 0..62 per-module-group
+_class_id range, without overlap.
+
+``#define DEBUG`` will enable all pr_debugs in scope, including any
+class'd ones (__pr_debug_cls(id,fmt..)).  This won't be reflected in
+the PARAM readback value, but the pr_debug callsites can be toggled
+into agreement with the param.
-- 
2.41.0



[PATCH v5 20/23] drm: restore CONFIG_DRM_USE_DYNAMIC_DEBUG un-BROKEN

2023-08-01 Thread Jim Cromie
Lots of burn-in testing needed before signing, upstreaming.

NOTE: I set default Y to maximize testing by default.
Is there a better way to do this ?

Signed-off-by: Jim Cromie 
---
 drivers/gpu/drm/Kconfig | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index ba3fb04bb691..ff478fcba67e 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -52,8 +52,7 @@ config DRM_DEBUG_MM
 
 config DRM_USE_DYNAMIC_DEBUG
bool "use dynamic debug to implement drm.debug"
-   default n
-   depends on BROKEN
+   default y
depends on DRM
depends on DYNAMIC_DEBUG || DYNAMIC_DEBUG_CORE
depends on JUMP_LABEL
-- 
2.41.0



[PATCH v5 15/23] dyndbg: add for_each_boxed_vector

2023-08-01 Thread Jim Cromie
Add a for_each iterator to walk a counted vector member in a struct
(ie the box), and use it to replace 8 open-coded loops.

Signed-off-by: Jim Cromie 
---
v5- parens-on-box-force-precedence
---
 lib/dynamic_debug.c | 20 +++-
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index e10fe6ed29cc..63cf14dc3e9f 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -157,6 +157,9 @@ static void vpr_info_dq(const struct ddebug_query *query, 
const char *msg)
  _dt->num_class_users);\
})
 
+#define for_each_boxed_vector(_box, _vec, _len, _ct, _curs)\
+   for (_ct = 0, _curs = (_box)->_vec; _ct < (_box)->_len; _ct++, _curs++)
+
 #define __outvar /* filled by callee */
 static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table 
const *dt,
const char 
*class_string,
@@ -166,7 +169,7 @@ static struct ddebug_class_map 
*ddebug_find_valid_class(struct ddebug_table cons
struct ddebug_class_user *cli;
int i, idx;
 
-   for (i = 0, map = dt->classes; i < dt->num_classes; i++, map++) {
+   for_each_boxed_vector(dt, classes, num_classes, i, map) {
idx = match_string(map->class_names, map->length, class_string);
if (idx >= 0) {
*class_id = idx + map->base;
@@ -174,7 +177,7 @@ static struct ddebug_class_map 
*ddebug_find_valid_class(struct ddebug_table cons
return map;
}
}
-   for (i = 0, cli = dt->class_users; i < dt->num_class_users; i++, cli++) 
{
+   for_each_boxed_vector(dt, class_users, num_class_users, i, cli) {
idx = match_string(cli->map->class_names, cli->map->length, 
class_string);
if (idx >= 0) {
*class_id = idx + cli->map->base;
@@ -1054,11 +1057,11 @@ static const char *ddebug_class_name(struct 
ddebug_table *dt, struct _ddebug *dp
struct ddebug_class_user *cli = dt->class_users;
int i;
 
-   for (i = 0; i < dt->num_classes; i++, map++)
+   for_each_boxed_vector(dt, classes, num_classes, i, map)
if (class_in_range(dp->class_id, map))
return map->class_names[dp->class_id - map->base];
 
-   for (i = 0; i < dt->num_class_users; i++, cli++)
+   for_each_boxed_vector(dt, class_users, num_class_users, i, cli)
if (class_in_range(dp->class_id, cli->map))
return cli->map->class_names[dp->class_id - 
cli->map->base];
 
@@ -1212,7 +1215,7 @@ static void ddebug_attach_module_classes(struct 
ddebug_table *dt, struct _ddebug
struct ddebug_class_map *cm;
int i, nc = 0;
 
-   for (i = 0, cm = di->classes; i < di->num_classes; i++, cm++) {
+   for_each_boxed_vector(di, classes, num_classes, i, cm) {
 
if (!strcmp(cm->mod_name, dt->mod_name)) {
vpr_cm_info(cm, "classes[%d]:", i);
@@ -1225,7 +1228,7 @@ static void ddebug_attach_module_classes(struct 
ddebug_table *dt, struct _ddebug
vpr_info("module:%s attached %d classes\n", dt->mod_name, nc);
 
/* now iterate dt */
-   for (i = 0, cm = dt->classes; i < dt->num_classes; i++, cm++)
+   for_each_boxed_vector(di, classes, num_classes, i, cm)
ddebug_apply_params(cm, cm->mod_name);
 }
 
@@ -1245,7 +1248,7 @@ static void ddebug_attach_user_module_classes(struct 
ddebug_table *dt,
 * module's refs, save to dt.  For loadables, this is the
 * whole array.
 */
-   for (i = 0, cli = di->class_users; i < di->num_class_users; i++, cli++) 
{
+   for_each_boxed_vector(di, class_users, num_class_users, i, cli) {
 
if (WARN_ON(!cli || !cli->map || !cli->user_mod_name))
continue;
@@ -1260,8 +1263,7 @@ static void ddebug_attach_user_module_classes(struct 
ddebug_table *dt,
}
dt->num_class_users = nc;
 
-   /* now iterate dt */
-   for (i = 0, cli = dt->class_users; i < dt->num_class_users; i++, cli++)
+   for_each_boxed_vector(di, class_users, num_class_users, i, cli)
ddebug_apply_params(cli->map, cli->user_mod_name);
 
vpr_dt_info(dt, "attach-client-module: ");
-- 
2.41.0



[PATCH v5 19/22] drm: restore CONFIG_DRM_USE_DYNAMIC_DEBUG un-BROKEN

2023-08-01 Thread Jim Cromie
Lots of burn-in testing needed before signing, upstreaming.

NOTE: I set default Y to maximize testing by default.
Is there a better way to do this ?

Signed-off-by: Jim Cromie 
---
 drivers/gpu/drm/Kconfig | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index ba3fb04bb691..ff478fcba67e 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -52,8 +52,7 @@ config DRM_DEBUG_MM
 
 config DRM_USE_DYNAMIC_DEBUG
bool "use dynamic debug to implement drm.debug"
-   default n
-   depends on BROKEN
+   default y
depends on DRM
depends on DYNAMIC_DEBUG || DYNAMIC_DEBUG_CORE
depends on JUMP_LABEL
-- 
2.41.0



[PATCH v5 16/23] dyndbg: refactor ddebug_classparam_clamp_input

2023-08-01 Thread Jim Cromie
Extract input validation code, from param_set_dyndbg_module_classes()
(the sys-node >handler) to new: ddebug_classparam_clamp_input(kp),
call it from former.  It takes kernel-param arg, so it can complain
about "foo: bad input".

Reuse ddparam_clamp_input(kp) in ddebug_sync_classbits(),
to validate inputs from parent's params, just like our own.
To support that reuse, alter ddebug_sync_classbits() and caller to
pass kp instead of kp->arg.

Signed-off-by: Jim Cromie 
---
 lib/dynamic_debug.c | 66 ++---
 1 file changed, 45 insertions(+), 21 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 63cf14dc3e9f..afcfeffde1d7 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -655,6 +655,30 @@ static int ddebug_apply_class_bitmap(const struct 
ddebug_class_param *dcp,
 
 #define CLASSMAP_BITMASK(width) ((1UL << (width)) - 1)
 
+static void ddebug_class_param_clamp_input(unsigned long *inrep, const struct 
kernel_param *kp)
+{
+   const struct ddebug_class_param *dcp = kp->arg;
+   const struct ddebug_class_map *map = dcp->map;
+
+   switch (map->map_type) {
+   case DD_CLASS_TYPE_DISJOINT_BITS:
+   /* expect bits. mask and warn if too many */
+   if (*inrep & ~CLASSMAP_BITMASK(map->length)) {
+   pr_warn("%s: input: 0x%lx exceeds mask: 0x%lx, 
masking\n",
+   KP_NAME(kp), *inrep, 
CLASSMAP_BITMASK(map->length));
+   *inrep &= CLASSMAP_BITMASK(map->length);
+   }
+   break;
+   case DD_CLASS_TYPE_LEVEL_NUM:
+   /* input is bitpos, of highest verbosity to be enabled */
+   if (*inrep > map->length) {
+   pr_warn("%s: level:%ld exceeds max:%d, clamping\n",
+   KP_NAME(kp), *inrep, map->length);
+   *inrep = map->length;
+   }
+   break;
+   }
+}
 static int param_set_dyndbg_module_classes(const char *instr,
   const struct kernel_param *kp,
   const char *modnm)
@@ -673,26 +697,15 @@ static int param_set_dyndbg_module_classes(const char 
*instr,
pr_err("expecting numeric input, not: %s > %s\n", instr, 
KP_NAME(kp));
return -EINVAL;
}
+   ddebug_class_param_clamp_input(, kp);
 
switch (map->map_type) {
case DD_CLASS_TYPE_DISJOINT_BITS:
-   /* expect bits. mask and warn if too many */
-   if (inrep & ~CLASSMAP_BITMASK(map->length)) {
-   pr_warn("%s: input: 0x%lx exceeds mask: 0x%lx, 
masking\n",
-   KP_NAME(kp), inrep, 
CLASSMAP_BITMASK(map->length));
-   inrep &= CLASSMAP_BITMASK(map->length);
-   }
v2pr_info("bits:0x%lx > %s.%s\n", inrep, modnm ?: "*", 
KP_NAME(kp));
totct += ddebug_apply_class_bitmap(dcp, , *dcp->bits, 
modnm);
*dcp->bits = inrep;
break;
case DD_CLASS_TYPE_LEVEL_NUM:
-   /* input is bitpos, of highest verbosity to be enabled */
-   if (inrep > map->length) {
-   pr_warn("%s: level:%ld exceeds max:%d, clamping\n",
-   KP_NAME(kp), inrep, map->length);
-   inrep = map->length;
-   }
old_bits = CLASSMAP_BITMASK(*dcp->lvl);
new_bits = CLASSMAP_BITMASK(inrep);
v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, 
KP_NAME(kp));
@@ -1156,16 +1169,27 @@ static const char * const ddebug_classmap_typenames[] = 
{
  ddebug_classmap_typenames[_cm->map_type]);\
})
 
-static void ddebug_sync_classbits(const struct ddebug_class_param *dcp, const 
char *modname)
+static void ddebug_sync_classbits(const struct kernel_param *kp, const char 
*modname)
 {
-   /* clamp initial bitvec, mask off hi-bits */
-   if (*dcp->bits & ~CLASSMAP_BITMASK(dcp->map->length)) {
-   *dcp->bits &= CLASSMAP_BITMASK(dcp->map->length);
-   v2pr_info("preset classbits: %lx\n", *dcp->bits);
+   struct ddebug_class_param *dcp = kp->arg;
+   unsigned long new_bits;
+
+   ddebug_class_param_clamp_input(dcp->bits, kp);
+
+   switch (dcp->map->map_type) {
+   case DD_CLASS_TYPE_DISJOINT_BITS:
+   v2pr_info("%s: classbits: 0x%lx\n", KP_NAME(kp), *dcp->bits);
+   ddebug_apply_class_bitmap(dcp, dcp->bits, 0UL, modname);
+   break;
+   case DD_CLASS_TYPE_LEVEL_NUM:
+   new_bits = CLASSMAP_BITMASK(*dcp->lvl);
+   v2pr_info("%s: lvl:%ld bits:0x%lx\n", KP_NAME(kp), *dcp->lvl, 
new_bits);
+   ddebug_apply_class_bitmap(dcp, _bits, 0UL, modname);
+   break;
+   default:
+   

[PATCH v5 18/23] parens-on-PARAM

2023-08-01 Thread Jim Cromie
---
 include/linux/dynamic_debug.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 871de0c32034..9b86c49173f9 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -172,9 +172,9 @@ struct ddebug_class_param {
 
 #define __DYNDBG_CLASSMAP_PARAM(_name, _bits, _var, _flags)\
static struct ddebug_class_param _name##_##_flags = {   \
-   .bits = &_bits, \
+   .bits = &(_bits),   \
.flags = #_flags,   \
-   .map = &_var,   \
+   .map = &(_var), \
};  \
module_param_cb(_name, _ops_dyndbg_classes,   \
&_name##_##_flags, 0600)
-- 
2.41.0



[PATCH v5 18/22] dyndbg-test: build it with just CONFIG_DYNAMIC_DEBUG_CORE

2023-08-01 Thread Jim Cromie
Make the test-module buildable with CONFIG_DYNAMIC_DEBUG_CORE; add
CFLAGS_$ofile defns to supply -DDYNAMIC_DEBUG_MODULE to cc.  Change
the Kconfig entry to allow building with just _CORE, and fix the help
text.

Signed-off-by: Jim Cromie 
---
 lib/Kconfig.debug | 10 +-
 lib/Makefile  |  2 ++
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index ce51d4dc6803..22e022ceb9a1 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -2695,12 +2695,12 @@ config TEST_STATIC_KEYS
  If unsure, say N.
 
 config TEST_DYNAMIC_DEBUG
-   tristate "Test DYNAMIC_DEBUG"
-   depends on DYNAMIC_DEBUG
+   tristate "Build test-dynamic-debug module"
+   depends on DYNAMIC_DEBUG || DYNAMIC_DEBUG_CORE
help
- This module registers a tracer callback to count enabled
- pr_debugs in a 'do_debugging' function, then alters their
- enablements, calls the function, and compares counts.
+ This module works/demo's the dyndbg's classmap API, by
+ creating 2 classes: a DISJOINT classmap (like DRM.debug)
+ and a LEVELS/VERBOSE classmap (like verbose2 > verbose1).
 
  If unsure, say N.
 
diff --git a/lib/Makefile b/lib/Makefile
index f36048371dd2..8411015a57c1 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -233,6 +233,8 @@ obj-$(CONFIG_HAVE_ARCH_TRACEHOOK) += syscall.o
 obj-$(CONFIG_DYNAMIC_DEBUG_CORE) += dynamic_debug.o
 #ensure exported functions have prototypes
 CFLAGS_dynamic_debug.o := -DDYNAMIC_DEBUG_MODULE
+CFLAGS_test_dynamic_debug.o := -DDYNAMIC_DEBUG_MODULE
+CFLAGS_test_dynamic_debug_submod.o := -DDYNAMIC_DEBUG_MODULE
 
 obj-$(CONFIG_SYMBOLIC_ERRNAME) += errname.o
 
-- 
2.41.0



[PATCH v5 17/23] dyndbg-API: promote DYNDBG_CLASSMAP_PARAM to API

2023-08-01 Thread Jim Cromie
move macro from test-dynamic-debug.c into header, and refine it.

Distinguish the 2 use cases of DYNDBG_CLASSMAP_PARAM*

1.DYNDBG_CLASSMAP_PARAM_REF
for DRM, to pass in extern __drm_debug by name.
dyndbg keeps bits in it, so drm can still use it as before

2.DYNDBG_CLASSMAP_PARAM
new user (test_dynamic_debug) doesn't need to share state,
decls a static long unsigned int to store the bitvec.

__DYNDBG_CLASSMAP_PARAM
   bottom layer - allocate,init a ddebug-class-param, module-param-cb.

Signed-off-by: Jim Cromie 
---
 drivers/gpu/drm/drm_print.c   |  8 ++-
 include/drm/drm_print.h   |  6 --
 include/linux/dynamic_debug.h | 39 +--
 lib/test_dynamic_debug.c  | 22 +++-
 4 files changed, 46 insertions(+), 29 deletions(-)

diff --git a/drivers/gpu/drm/drm_print.c b/drivers/gpu/drm/drm_print.c
index dabcfa0dd279..8f4b609353a5 100644
--- a/drivers/gpu/drm/drm_print.c
+++ b/drivers/gpu/drm/drm_print.c
@@ -69,12 +69,8 @@ DRM_CLASSMAP_DEFINE(drm_debug_classes, 
DD_CLASS_TYPE_DISJOINT_BITS,
"DRM_UT_DP",
"DRM_UT_DRMRES");
 
-static struct ddebug_class_param drm_debug_bitmap = {
-   .bits = &__drm_debug,
-   .flags = "p",
-   .map = _debug_classes,
-};
-module_param_cb(debug, _ops_dyndbg_classes, _debug_bitmap, 0600);
+DRM_CLASSMAP_PARAM_REF(debug, __drm_debug, drm_debug_classes, p);
+
 #endif
 
 void __drm_puts_coredump(struct drm_printer *p, const char *str)
diff --git a/include/drm/drm_print.h b/include/drm/drm_print.h
index 706afc97c79c..94d4f5500030 100644
--- a/include/drm/drm_print.h
+++ b/include/drm/drm_print.h
@@ -322,11 +322,13 @@ enum drm_debug_category {
 };
 
 #ifdef CONFIG_DRM_USE_DYNAMIC_DEBUG
-#define DRM_CLASSMAP_DEFINE(...) DYNDBG_CLASSMAP_DEFINE(__VA_ARGS__)
-#define DRM_CLASSMAP_USE(name)   DYNDBG_CLASSMAP_USE(name)
+#define DRM_CLASSMAP_DEFINE(...)   DYNDBG_CLASSMAP_DEFINE(__VA_ARGS__)
+#define DRM_CLASSMAP_USE(name) DYNDBG_CLASSMAP_USE(name)
+#define DRM_CLASSMAP_PARAM_REF(...)DYNDBG_CLASSMAP_PARAM_REF(__VA_ARGS__)
 #else
 #define DRM_CLASSMAP_DEFINE(...)
 #define DRM_CLASSMAP_USE(name)
+#define DRM_CLASSMAP_PARAM_REF(...)
 #endif
 
 static inline bool drm_debug_enabled_raw(enum drm_debug_category category)
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 85f9b91034ca..871de0c32034 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -90,7 +90,7 @@ struct ddebug_class_map {
  * module, and to validate inputs to DD_CLASS_TYPE_*_NAMES typed params.
  */
 #define DYNDBG_CLASSMAP_DEFINE(_var, _maptype, _base, ...) \
-   const char *_var##_classnames[] = { __VA_ARGS__ };  \
+   static const char *_var##_classnames[] = { __VA_ARGS__ };   \
struct ddebug_class_map __aligned(8) __used \
__section("__dyndbg_classes") _var = {  \
.mod = THIS_MODULE, \
@@ -119,7 +119,7 @@ struct ddebug_class_user {
DYNDBG_CLASSMAP_USE_(_var, __UNIQUE_ID(ddebug_class_user))
 #define DYNDBG_CLASSMAP_USE_(_var, _uname) \
extern struct ddebug_class_map _var;\
-   struct ddebug_class_user __used \
+   static struct ddebug_class_user __used  \
__section("__dyndbg_class_users") _uname = {\
.user_mod_name = KBUILD_MODNAME,\
.map = &_var,   \
@@ -144,6 +144,41 @@ struct ddebug_class_param {
const struct ddebug_class_map *map;
 };
 
+/**
+ * DYNDBG_CLASSMAP_PARAM - wrap a dyndbg-classmap with a controlling sys-param
+ * @_name  sysfs node name
+ * @_var   name of the struct classmap var defining the controlled classes
+ * @_flags flags to be toggled, typically just 'p'
+ *
+ * Creates a sysfs-param to control the classes defined by the
+ * classmap.  Keeps bits in a private/static
+ */
+#define DYNDBG_CLASSMAP_PARAM(_name, _var, _flags) \
+   static unsigned long _name##_bvec;  \
+   __DYNDBG_CLASSMAP_PARAM(_name, _name##_bvec, _var, _flags)
+
+/**
+ * DYNDBG_CLASSMAP_PARAM_REF - wrap a dyndbg-classmap with a controlling 
sys-param
+ * @_name  sysfs node name
+ * @_bits  name of the module's unsigned long bit-vector, ex: __drm_debug
+ * @_var   name of the struct classmap var defining the controlled classes
+ * @_flags flags to be toggled, typically just 'p'
+ *
+ * Creates a sysfs-param to control the classmap, keeping bitvec in user 
@_bits.
+ * This lets drm use __drm_debug elsewhere too.
+ */
+#define DYNDBG_CLASSMAP_PARAM_REF(_name, _bits, _var, _flags)  \
+   __DYNDBG_CLASSMAP_PARAM(_name, _bits, _var, _flags)
+
+#define 

[PATCH v5 14/23] dyndbg-API: fix CONFIG_DRM_USE_DYNAMIC_DEBUG regression

2023-08-01 Thread Jim Cromie
DECLARE_DYNDBG_CLASSMAP() has a design error; it fails a basic K
rule: "define once, refer many times".

When DRM_USE_DYNAMIC_DEBUG=y, DECLARE_DYNDBG_CLASSMAP() is used across
DRM core & drivers; they all repeat the same classmap-defn args, which
must match for the modules to respond together when DRM.debug
categories are enabled.

Worse, it causes the CONFIG_DRM_USE_DYNAMIC_DEBUG=Y regression; 1st
drm.ko loads, and dyndbg initializes its DRM.debug callsites, then a
drm-driver loads, but too late - it missed the DRM.debug enablement.

So replace it with 2 macros:
  DYNDBG_CLASSMAP_DEFINE - invoked once from core - drm.ko
  DYNDBG_CLASSMAP_USE- from all drm drivers and helpers.

DYNDBG_CLASSMAP_DEFINE: based on DECLARE_DYNDBG_CLASSMAP, but now it
drops the static on the constructed classmap variable, and exports it
instead.

DYNDBG_CLASSMAP_USE: then refers to the exported var by name:
* used from drivers, helper-mods
* lets us drop the repetitive "classname" args
* fixes 2nd-defn problem
* creates a ddebug_class_user record in new __dyndbg_class_users section
  this allows ddebug_add_module(etal) to handle them per-module.

The distinction, and the usage record, allows dyndbg to initialize the
driver's DRM.debug callsites separately after it is modprobed.

Since DRM now needs updates to use the new macros, it also gets 2
wrappers: DRM_CLASSMAP_DEFINE, DRM_CLASSMAP_USE which declutter the
users by hiding the ifdef CONFIG_DRM_USE_DYNAMIC_DEBUG.

To review, dyndbg's existing __dyndbg_classes[] section does:

. catalogs the classmaps defined by the module (or builtin modules)
. authorizes dyndbg to >control those class'd prdbgs for the module.
. DYNDBG_CLASSMAP_DEFINE(and old one) creates classmaps in this section.

This patch adds __dyndbg_class_users[] section:

. catalogs uses/references to the classmap definitions.
. authorizes dyndbg to >control those class'd prdbgs in ref'g module.
. DYNDBG_CLASSMAP_USE() creates classmap-user records in this section.

Now ddebug_add_module(etal) can handle classmap-uses like (and after)
classmaps; when a dependent module is loaded, its parent's kernel
params are scanned to find the param wired to dyndbg-param-ops, whose
classmap matches the one ref'd by the client.

To support this, a few data/header changes:

. new struct ddebug_class_user
  contains: user-module-name, 
  it records drm-driver's use of a classmap in the section, allowing lookup

struct ddebug_info gets 2 new fields to encapsulate the new section:
  class_users, num_class_users.
  set by dynamic_debug_init() for builtins.
  or by kernel/module/main:load_info() for loadable modules.

vmlinux.lds.h: new BOUNDED_SECTION for __dyndbg_class_users

dynamic_debug.c has 2 changes in ddebug_add_module(), ddebug_change():

ddebug_add_module() previously called ddebug_attach_module_classes()
to handle classmap DEFINEd by a module, now it also calls
ddebug_attach_user_module_classes() to handle USEd classmaps.

ddebug_attach_user_module_classes() scans the module's class_users
section, follows the refs to the parent's classmap, and calls
ddebug_apply_params() on each.

ddebug_apply_params(new fn):

It scans module's/builtin kernel-params, calls ddebug_match_attach_kparam
for each to find the params/sysfs-nodes which may be wired to a classmap.

ddebug_match_apply_kparam(new fn):

1st, it tests the kernel-param.ops is dyndbg's; this guarantees that
the attached arg is a struct ddebug_class_param, which has a ref to
the param's state, and to the classmap defining the param's handling.

2nd, it requires that the classmap ref'd by the kparam is the one
we're called for; modules can use many separate classmaps (as
test_dynamic_debug does).

Then apply the "parent" kparam's setting to the dependent module,
using ddebug_apply_class_bitmap().

ddebug_change(and callees) also gets adjustments:

ddebug_find_valid_class(): This does a search over the module's
classmaps, looking for the class FOO echo'd to >control.  So now it
searches over __dyndbg_class_users[] after __dyndbg_classes[].

ddebug_class_name(): return class-names for defined AND used classes.

test_dynamic_debug.c, test_dynamic_debug_submod.c:

This (already) demonstrates the 2 types of classmaps & sysfs-params,
following the 4-part recipe:

1. define an enum for the classmap: DRM.debug has DRM_UT_{CORE,KMS,...}
   multiple classes must share 0-62 classid space.
2. DYNDBG_CLASSMAP_DEFINE(.. DRM_UT_{CORE,KMS,...})
3. DYNDBG_CLASSMAP_PARAM* (classmap)
4. DYNDBG_CLASSMAP_USE()
   by _submod only, skipping 2,3

Move all the enum declarations together, to better explain how they
share the 0..62 class-id space available to a module (non-overlapping
subranges).

reorg macros 2,3 by name.  This gives a tabular format, making it easy
to see the pattern of repetition, and the points of change.

And extend the test to replicate the 2-module (parent & dependent)
scenario which caused the CONFIG_DRM_USE_DYNAMIC_DEBUG=y regression
seen in drm & drivers.

The _submod.c 

[PATCH v5 13/23] checkpatch: special case for file-scoped extern linker-symbol

2023-08-01 Thread Jim Cromie
"externs should be avoided in .c files" needs an exception for linker
symbols, like those that mark the start, stop of many kernel sections.

Since code already checks REALNAME to avoid linker-scripts entirely,
add a new else-if block to look at them instead.  As a simple
heuristic, treat all words (in the patch-line) as possible symbols,
and save them to screen the WARN quoted above.

For my test case, this included BOUNDED_BY (a macro), which is extra,
but not troublesome - any extra words collected would have to also be
symbols the script would otherwise complain about.

Where the WARN is issued, precede it with an else-if block to catch
one common extern-in-c use case: "extern struct foo bar[]".  Here we
can at least issue a softer warning, after checking for a match with a
maybe-linker-symbol parsed earlier from the patch.  Though heuristic,
it worked for my test-case, allowing both (start|stop)$symbol's,
matched by $symbol, it wasn't thrown by noise (BOUNDED_BY) in the
maybe-linker-symbols.

NB: git diff ordering dependence on vmlinux.lds.h before c files ?

Cc: a...@canonical.com
Cc: j...@perches.com
Signed-off-by: Jim Cromie 
---
 scripts/checkpatch.pl | 20 
 1 file changed, 20 insertions(+)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index b30114d637c4..f6b6b2a50dfe 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -74,6 +74,8 @@ my $git_command ='export LANGUAGE=en_US.UTF-8; git';
 my $tabsize = 8;
 my ${CONFIG_} = "CONFIG_";
 
+my %maybe_linker_symbol; # for externs in c exceptions, when seen in 
*vmlinux.lds.h
+
 sub help {
my ($exitcode) = @_;
 
@@ -6051,6 +6053,9 @@ sub process {
 
 # check for line continuations outside of #defines, preprocessor #, and asm
 
+   } elsif ($realfile =~ m@/vmlinux.lds.h$@) {
+   $line =~ s/(\w+)/$maybe_linker_symbol{$1}++/ge;
+   #print "REAL: $realfile\nln: $line\nkeys:", sort keys 
%maybe_linker_symbol;
} else {
if ($prevline !~ /^..*\\$/ &&
$line !~ /^\+\s*\#.*\\$/ && # preprocessor
@@ -7107,6 +7112,21 @@ sub process {
 "arguments for function declarations 
should follow identifier\n" . $herecurr);
}
 
+   } elsif ($realfile =~ /\.c$/ && defined $stat &&
+   $stat =~ /^\+extern struct\s+(\w+)\s+(\w+)\[\];/)
+   {
+   my ($st_type, $st_name) = ($1, $2);
+
+   for my $s (keys %maybe_linker_symbol) {
+   #print "Linker symbol? $st_name : $s\n";
+   goto LIKELY_LINKER_SYMBOL
+   if $st_name =~ /$s/;
+   }
+   WARN("AVOID_EXTERNS",
+"found a file-scoped extern type:$st_type 
name:$st_name in .c file\n"
+. "is this a linker symbol ?\n" . $herecurr);
+ LIKELY_LINKER_SYMBOL:
+
} elsif ($realfile =~ /\.c$/ && defined $stat &&
$stat =~ /^.\s*extern\s+/)
{
-- 
2.41.0



[PATCH v5 13/22] checkpatch: file-scoped extern special case for linker-symbol

2023-08-01 Thread Jim Cromie
"externs should be avoided in .c files" needs an exception for linker
symbols, like those that mark the start, stop of many kernel sections.

Since code already checks REALNAME to avoid linker-scripts entirely,
add a new else-if block to look at them instead.  As a simple
heuristic, treat all words (in the patch-line) as possible symbols,
and save them to screen the WARN quoted above.  For my test case, this
included BOUNDED_BY (a macro), which is extra, but not troublesome.

Where the WARN is issued, precede it with an else-if block to catch
one common extern-in-c use case: "extern struct foo bar[]".  Here we
can at least issue a softer warning, after checking for a match with a
maybe-linker-symbol parsed earlier from the patch.  Though heuristic,
it worked for my test-case, allowing both (start|stop)$symbol's,
matched by $symbol, it wasn't thrown by noise (BOUNDED_BY) in the
maybe-linker-symbols.

NB: git diff ordering dependence on vmlinux.lds.h before c files ?

Cc: a...@canonical.com
Cc: j...@perches.com
Signed-off-by: Jim Cromie 
---
 scripts/checkpatch.pl | 20 
 1 file changed, 20 insertions(+)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index b30114d637c4..f6b6b2a50dfe 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -74,6 +74,8 @@ my $git_command ='export LANGUAGE=en_US.UTF-8; git';
 my $tabsize = 8;
 my ${CONFIG_} = "CONFIG_";
 
+my %maybe_linker_symbol; # for externs in c exceptions, when seen in 
*vmlinux.lds.h
+
 sub help {
my ($exitcode) = @_;
 
@@ -6051,6 +6053,9 @@ sub process {
 
 # check for line continuations outside of #defines, preprocessor #, and asm
 
+   } elsif ($realfile =~ m@/vmlinux.lds.h$@) {
+   $line =~ s/(\w+)/$maybe_linker_symbol{$1}++/ge;
+   #print "REAL: $realfile\nln: $line\nkeys:", sort keys 
%maybe_linker_symbol;
} else {
if ($prevline !~ /^..*\\$/ &&
$line !~ /^\+\s*\#.*\\$/ && # preprocessor
@@ -7107,6 +7112,21 @@ sub process {
 "arguments for function declarations 
should follow identifier\n" . $herecurr);
}
 
+   } elsif ($realfile =~ /\.c$/ && defined $stat &&
+   $stat =~ /^\+extern struct\s+(\w+)\s+(\w+)\[\];/)
+   {
+   my ($st_type, $st_name) = ($1, $2);
+
+   for my $s (keys %maybe_linker_symbol) {
+   #print "Linker symbol? $st_name : $s\n";
+   goto LIKELY_LINKER_SYMBOL
+   if $st_name =~ /$s/;
+   }
+   WARN("AVOID_EXTERNS",
+"found a file-scoped extern type:$st_type 
name:$st_name in .c file\n"
+. "is this a linker symbol ?\n" . $herecurr);
+ LIKELY_LINKER_SYMBOL:
+
} elsif ($realfile =~ /\.c$/ && defined $stat &&
$stat =~ /^.\s*extern\s+/)
{
-- 
2.41.0



[PATCH v5 11/23] dyndbg: tighten fn-sig of ddebug_apply_class_bitmap

2023-08-01 Thread Jim Cromie
old_bits arg is currently a pointer to the input bits, but this could
allow inadvertent changes to the input by the fn.  Disallow this.
And constify new_bits while here.

Signed-off-by: Jim Cromie 
---
 lib/dynamic_debug.c | 21 +++--
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 5139c8d45d12..1bc25dc2cb51 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -592,7 +592,8 @@ static int ddebug_exec_queries(char *query, const char 
*modname)
 
 /* apply a new class-param setting */
 static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
-unsigned long *new_bits, unsigned long 
*old_bits,
+const unsigned long *new_bits,
+const unsigned long old_bits,
 const char *query_modname)
 {
 #define QUERY_SIZE 128
@@ -601,12 +602,12 @@ static int ddebug_apply_class_bitmap(const struct 
ddebug_class_param *dcp,
int matches = 0;
int bi, ct;
 
-   if (*new_bits != *old_bits)
+   if (*new_bits != old_bits)
v2pr_info("apply bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits,
- *old_bits, query_modname ?: "'*'");
+ old_bits, query_modname ?: "'*'");
 
for (bi = 0; bi < map->length; bi++) {
-   if (test_bit(bi, new_bits) == test_bit(bi, old_bits))
+   if (test_bit(bi, new_bits) == test_bit(bi, _bits))
continue;
 
snprintf(query, QUERY_SIZE, "class %s %c%s", 
map->class_names[bi],
@@ -618,9 +619,9 @@ static int ddebug_apply_class_bitmap(const struct 
ddebug_class_param *dcp,
v2pr_info("bit_%d: %d matches on class: %s -> 0x%lx\n", bi,
  ct, map->class_names[bi], *new_bits);
}
-   if (*new_bits != *old_bits)
+   if (*new_bits != old_bits)
v2pr_info("applied bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits,
- *old_bits, query_modname ?: "'*'");
+ old_bits, query_modname ?: "'*'");
 
return matches;
 }
@@ -677,7 +678,7 @@ static int param_set_dyndbg_classnames(const char *instr, 
const struct kernel_pa
continue;
}
curr_bits ^= BIT(cls_id);
-   totct += ddebug_apply_class_bitmap(dcp, _bits, 
dcp->bits, NULL);
+   totct += ddebug_apply_class_bitmap(dcp, _bits, 
*dcp->bits, NULL);
*dcp->bits = curr_bits;
v2pr_info("%s: changed bit %d:%s\n", KP_NAME(kp), 
cls_id,
  map->class_names[cls_id]);
@@ -687,7 +688,7 @@ static int param_set_dyndbg_classnames(const char *instr, 
const struct kernel_pa
old_bits = CLASSMAP_BITMASK(*dcp->lvl);
curr_bits = CLASSMAP_BITMASK(cls_id + (wanted ? 1 : 0 
));
 
-   totct += ddebug_apply_class_bitmap(dcp, _bits, 
_bits, NULL);
+   totct += ddebug_apply_class_bitmap(dcp, _bits, 
old_bits, NULL);
*dcp->lvl = (cls_id + (wanted ? 1 : 0));
v2pr_info("%s: changed bit-%d: \"%s\" %lx->%lx\n", 
KP_NAME(kp), cls_id,
  map->class_names[cls_id], old_bits, 
curr_bits);
@@ -741,7 +742,7 @@ static int param_set_dyndbg_module_classes(const char 
*instr,
inrep &= CLASSMAP_BITMASK(map->length);
}
v2pr_info("bits:0x%lx > %s.%s\n", inrep, modnm ?: "*", 
KP_NAME(kp));
-   totct += ddebug_apply_class_bitmap(dcp, , dcp->bits, 
modnm);
+   totct += ddebug_apply_class_bitmap(dcp, , *dcp->bits, 
modnm);
*dcp->bits = inrep;
break;
case DD_CLASS_TYPE_LEVEL_NUM:
@@ -754,7 +755,7 @@ static int param_set_dyndbg_module_classes(const char 
*instr,
old_bits = CLASSMAP_BITMASK(*dcp->lvl);
new_bits = CLASSMAP_BITMASK(inrep);
v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, 
KP_NAME(kp));
-   totct += ddebug_apply_class_bitmap(dcp, _bits, _bits, 
modnm);
+   totct += ddebug_apply_class_bitmap(dcp, _bits, old_bits, 
modnm);
*dcp->lvl = inrep;
break;
default:
-- 
2.41.0



[PATCH v5 12/23] dyndbg-API: remove DD_CLASS_TYPE_(DISJOINT|LEVEL)_NAMES and code

2023-08-01 Thread Jim Cromie
Remove the NAMED class types; these 2 classmap types accept class
names at the PARAM interface, for example:

  echo +DRM_UT_CORE,-DRM_UT_KMS > /sys/module/drm/parameters/debug_names

The code works, but its only used by test-dynamic-debug, and wasn't
asked for by anyone else, so simplify things for now.

Signed-off-by: Jim Cromie 
---
 include/linux/dynamic_debug.h |  19 ++-
 lib/dynamic_debug.c   | 103 +++---
 lib/test_dynamic_debug.c  |  12 
 3 files changed, 12 insertions(+), 122 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 719c5b6ad0f9..b927dfacc429 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -59,24 +59,13 @@ struct _ddebug {
 enum class_map_type {
DD_CLASS_TYPE_DISJOINT_BITS,
/**
-* DD_CLASS_TYPE_DISJOINT_BITS: classes are independent, one per bit.
-* expecting hex input. Built for drm.debug, basis for other types.
+* DD_CLASS_TYPE_DISJOINT_BITS: classes are independent, mapped to 
bits[0..N].
+* Expects hex input. Built for drm.debug, basis for other types.
 */
DD_CLASS_TYPE_LEVEL_NUM,
/**
-* DD_CLASS_TYPE_LEVEL_NUM: input is numeric level, 0-N.
-* N turns on just bits N-1 .. 0, so N=0 turns all bits off.
-*/
-   DD_CLASS_TYPE_DISJOINT_NAMES,
-   /**
-* DD_CLASS_TYPE_DISJOINT_NAMES: input is a CSV of [+-]CLASS_NAMES,
-* classes are independent, like _DISJOINT_BITS.
-*/
-   DD_CLASS_TYPE_LEVEL_NAMES,
-   /**
-* DD_CLASS_TYPE_LEVEL_NAMES: input is a CSV of [+-]CLASS_NAMES,
-* intended for names like: INFO,DEBUG,TRACE, with a module prefix
-* avoid EMERG,ALERT,CRIT,ERR,WARNING: they're not debug
+* DD_CLASS_TYPE_LEVEL_NUM: input is numeric level, 0..N.
+* Input N turns on bits 0..N-1
 */
 };
 
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 1bc25dc2cb51..9f13320f5022 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -631,77 +631,6 @@ static int ddebug_apply_class_bitmap(const struct 
ddebug_class_param *dcp,
 
 #define CLASSMAP_BITMASK(width) ((1UL << (width)) - 1)
 
-/* accept comma-separated-list of [+-] classnames */
-static int param_set_dyndbg_classnames(const char *instr, const struct 
kernel_param *kp)
-{
-   const struct ddebug_class_param *dcp = kp->arg;
-   const struct ddebug_class_map *map = dcp->map;
-   unsigned long curr_bits, old_bits;
-   char *cl_str, *p, *tmp;
-   int cls_id, totct = 0;
-   bool wanted;
-
-   cl_str = tmp = kstrdup(instr, GFP_KERNEL);
-   p = strchr(cl_str, '\n');
-   if (p)
-   *p = '\0';
-
-   /* start with previously set state-bits, then modify */
-   curr_bits = old_bits = *dcp->bits;
-   vpr_info("\"%s\" > %s:0x%lx\n", cl_str, KP_NAME(kp), curr_bits);
-
-   for (; cl_str; cl_str = p) {
-   p = strchr(cl_str, ',');
-   if (p)
-   *p++ = '\0';
-
-   if (*cl_str == '-') {
-   wanted = false;
-   cl_str++;
-   } else {
-   wanted = true;
-   if (*cl_str == '+')
-   cl_str++;
-   }
-   cls_id = match_string(map->class_names, map->length, cl_str);
-   if (cls_id < 0) {
-   pr_err("%s unknown to %s\n", cl_str, KP_NAME(kp));
-   continue;
-   }
-
-   /* have one or more valid class_ids of one *_NAMES type */
-   switch (map->map_type) {
-   case DD_CLASS_TYPE_DISJOINT_NAMES:
-   /* the +/- pertains to a single bit */
-   if (test_bit(cls_id, _bits) == wanted) {
-   v3pr_info("no change on %s\n", cl_str);
-   continue;
-   }
-   curr_bits ^= BIT(cls_id);
-   totct += ddebug_apply_class_bitmap(dcp, _bits, 
*dcp->bits, NULL);
-   *dcp->bits = curr_bits;
-   v2pr_info("%s: changed bit %d:%s\n", KP_NAME(kp), 
cls_id,
- map->class_names[cls_id]);
-   break;
-   case DD_CLASS_TYPE_LEVEL_NAMES:
-   /* cls_id = N in 0..max. wanted +/- determines N or N-1 
*/
-   old_bits = CLASSMAP_BITMASK(*dcp->lvl);
-   curr_bits = CLASSMAP_BITMASK(cls_id + (wanted ? 1 : 0 
));
-
-   totct += ddebug_apply_class_bitmap(dcp, _bits, 
old_bits, NULL);
-   *dcp->lvl = (cls_id + (wanted ? 1 : 0));
-   v2pr_info("%s: changed bit-%d: \"%s\" %lx->%lx\n", 
KP_NAME(kp), cls_id,
- 

[PATCH v5 08/23] dyndbg: reduce verbose/debug clutter

2023-08-01 Thread Jim Cromie
currently, for verbose=3, these are logged (blank lines for clarity):

 dyndbg: query 0: "class DRM_UT_CORE +p" mod:*
 dyndbg: split into words: "class" "DRM_UT_CORE" "+p"

 dyndbg: op='+'
 dyndbg: flags=0x1
 dyndbg: *flagsp=0x1 *maskp=0x

 dyndbg: parsed: func="" file="" module="" format="" lineno=0-0 class=...
 dyndbg: no matches for query
 dyndbg: no-match: func="" file="" module="" format="" lineno=0-0 class=...
 dyndbg: processed 1 queries, with 0 matches, 0 errs

That is excessive, so this patch:
 - shrinks 3 lines of 2nd stanza to single line
 - drops 1st 2 lines of 3rd stanza
   3rd is like 1st, with result, not procedure.
   2nd is just status, retold in 4th, with more info.

Signed-off-by: Jim Cromie 
---
 lib/dynamic_debug.c | 14 +++---
 1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 550d380f7690..4200c72fed09 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -265,9 +265,6 @@ static int ddebug_change(const struct ddebug_query *query,
}
mutex_unlock(_lock);
 
-   if (!nfound && verbose)
-   pr_info("no matches for query\n");
-
return nfound;
 }
 
@@ -496,7 +493,6 @@ static int ddebug_parse_flags(const char *str, struct 
flag_settings *modifiers)
pr_err("bad flag-op %c, at start of %s\n", *str, str);
return -EINVAL;
}
-   v3pr_info("op='%c'\n", op);
 
for (; *str ; ++str) {
for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) {
@@ -510,7 +506,6 @@ static int ddebug_parse_flags(const char *str, struct 
flag_settings *modifiers)
return -EINVAL;
}
}
-   v3pr_info("flags=0x%x\n", modifiers->flags);
 
/* calculate final flags, mask based upon op */
switch (op) {
@@ -526,7 +521,7 @@ static int ddebug_parse_flags(const char *str, struct 
flag_settings *modifiers)
modifiers->flags = 0;
break;
}
-   v3pr_info("*flagsp=0x%x *maskp=0x%x\n", modifiers->flags, 
modifiers->mask);
+   v3pr_info("op='%c' flags=0x%x maskp=0x%x\n", op, modifiers->flags, 
modifiers->mask);
 
return 0;
 }
@@ -536,7 +531,7 @@ static int ddebug_exec_query(char *query_string, const char 
*modname)
struct flag_settings modifiers = {};
struct ddebug_query query = {};
 #define MAXWORDS 9
-   int nwords, nfound;
+   int nwords;
char *words[MAXWORDS];
 
nwords = ddebug_tokenize(query_string, words, MAXWORDS);
@@ -554,10 +549,7 @@ static int ddebug_exec_query(char *query_string, const 
char *modname)
return -EINVAL;
}
/* actually go and implement the change */
-   nfound = ddebug_change(, );
-   vpr_info_dq(, nfound ? "applied" : "no-match");
-
-   return nfound;
+   return ddebug_change(, );
 }
 
 /* handle multiple queries in query string, continue on error, return
-- 
2.41.0



[PATCH v5 06/23] dyndbg: split param_set_dyndbg_classes to module/wrapper fns

2023-08-01 Thread Jim Cromie
rename param_set_dyndbg_classes: add _module_ name & arg, old name is
wrapper to new.  New arg allows caller to specify that only one module
is affected by a prdbgs update.

Outer fn preserves kernel_param interface, passing NULL to inner fn.
This selectivity will be used later to narrow the scope of changes
made.

no functional change.

Signed-off-by: Jim Cromie 
---
 lib/dynamic_debug.c | 37 ++---
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index d875c4fa5335..550d380f7690 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -707,18 +707,9 @@ static int param_set_dyndbg_classnames(const char *instr, 
const struct kernel_pa
return 0;
 }
 
-/**
- * param_set_dyndbg_classes - class FOO >control
- * @instr: string echo>d to sysfs, input depends on map_type
- * @kp:kp->arg has state: bits/lvl, map, map_type
- *
- * Enable/disable prdbgs by their class, as given in the arguments to
- * DECLARE_DYNDBG_CLASSMAP.  For LEVEL map-types, enforce relative
- * levels by bitpos.
- *
- * Returns: 0 or <0 if error.
- */
-int param_set_dyndbg_classes(const char *instr, const struct kernel_param *kp)
+static int param_set_dyndbg_module_classes(const char *instr,
+  const struct kernel_param *kp,
+  const char *modnm)
 {
const struct ddebug_class_param *dcp = kp->arg;
const struct ddebug_class_map *map = dcp->map;
@@ -755,8 +746,8 @@ int param_set_dyndbg_classes(const char *instr, const 
struct kernel_param *kp)
KP_NAME(kp), inrep, 
CLASSMAP_BITMASK(map->length));
inrep &= CLASSMAP_BITMASK(map->length);
}
-   v2pr_info("bits:%lx > %s\n", inrep, KP_NAME(kp));
-   totct += ddebug_apply_class_bitmap(dcp, , dcp->bits, 
NULL);
+   v2pr_info("bits:0x%lx > %s.%s\n", inrep, modnm ?: "*", 
KP_NAME(kp));
+   totct += ddebug_apply_class_bitmap(dcp, , dcp->bits, 
modnm);
*dcp->bits = inrep;
break;
case DD_CLASS_TYPE_LEVEL_NUM:
@@ -769,7 +760,7 @@ int param_set_dyndbg_classes(const char *instr, const 
struct kernel_param *kp)
old_bits = CLASSMAP_BITMASK(*dcp->lvl);
new_bits = CLASSMAP_BITMASK(inrep);
v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, 
KP_NAME(kp));
-   totct += ddebug_apply_class_bitmap(dcp, _bits, _bits, 
NULL);
+   totct += ddebug_apply_class_bitmap(dcp, _bits, _bits, 
modnm);
*dcp->lvl = inrep;
break;
default:
@@ -778,6 +769,22 @@ int param_set_dyndbg_classes(const char *instr, const 
struct kernel_param *kp)
vpr_info("%s: total matches: %d\n", KP_NAME(kp), totct);
return 0;
 }
+
+/**
+ * param_set_dyndbg_classes - class FOO >control
+ * @instr: string echo>d to sysfs, input depends on map_type
+ * @kp:kp->arg has state: bits/lvl, map, map_type
+ *
+ * Enable/disable prdbgs by their class, as given in the arguments to
+ * DECLARE_DYNDBG_CLASSMAP.  For LEVEL map-types, enforce relative
+ * levels by bitpos.
+ *
+ * Returns: 0 or <0 if error.
+ */
+int param_set_dyndbg_classes(const char *instr, const struct kernel_param *kp)
+{
+   return param_set_dyndbg_module_classes(instr, kp, NULL);
+}
 EXPORT_SYMBOL(param_set_dyndbg_classes);
 
 /**
-- 
2.41.0



[PATCH v5 09/23] dyndbg: silence debugs with no-change updates

2023-08-01 Thread Jim Cromie
check for actual changes before announcing them, declutter logs.

Signed-off-by: Jim Cromie 
---
 lib/dynamic_debug.c | 12 +++-
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 4200c72fed09..7430add36423 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -590,7 +590,7 @@ static int ddebug_exec_queries(char *query, const char 
*modname)
return nfound;
 }
 
-/* apply a new bitmap to the sys-knob's current bit-state */
+/* apply a new class-param setting */
 static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
 unsigned long *new_bits, unsigned long 
*old_bits,
 const char *query_modname)
@@ -601,8 +601,9 @@ static int ddebug_apply_class_bitmap(const struct 
ddebug_class_param *dcp,
int matches = 0;
int bi, ct;
 
-   v2pr_info("apply bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, 
*old_bits,
- query_modname ?: "");
+   if (*new_bits != *old_bits)
+   v2pr_info("apply bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits,
+ *old_bits, query_modname ?: "'*'");
 
for (bi = 0; bi < map->length; bi++) {
if (test_bit(bi, new_bits) == test_bit(bi, old_bits))
@@ -617,8 +618,9 @@ static int ddebug_apply_class_bitmap(const struct 
ddebug_class_param *dcp,
v2pr_info("bit_%d: %d matches on class: %s -> 0x%lx\n", bi,
  ct, map->class_names[bi], *new_bits);
}
-   v2pr_info("applied bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, 
*old_bits,
- query_modname ?: "");
+   if (*new_bits != *old_bits)
+   v2pr_info("applied bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits,
+ *old_bits, query_modname ?: "'*'");
 
return matches;
 }
-- 
2.41.0



[PATCH v5 10/23] dyndbg: tighten ddebug_class_name() 1st arg type

2023-08-01 Thread Jim Cromie
Change function's 1st arg-type, and deref in the caller.
The fn doesn't need any other fields in the struct.

no functional change.

Signed-off-by: Jim Cromie 
---
 lib/dynamic_debug.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 7430add36423..5139c8d45d12 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -1113,12 +1113,12 @@ static void *ddebug_proc_next(struct seq_file *m, void 
*p, loff_t *pos)
 #define class_in_range(class_id, map)  \
(class_id >= map->base && class_id < map->base + map->length)
 
-static const char *ddebug_class_name(struct ddebug_iter *iter, struct _ddebug 
*dp)
+static const char *ddebug_class_name(struct ddebug_table *dt, struct _ddebug 
*dp)
 {
-   struct ddebug_class_map *map = iter->table->classes;
-   int i, nc = iter->table->num_classes;
+   struct ddebug_class_map *map = dt->classes;
+   int i;
 
-   for (i = 0; i < nc; i++, map++)
+   for (i = 0; i < dt->num_classes; i++, map++)
if (class_in_range(dp->class_id, map))
return map->class_names[dp->class_id - map->base];
 
@@ -1152,7 +1152,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)
seq_puts(m, "\"");
 
if (dp->class_id != _DPRINTK_CLASS_DFLT) {
-   class = ddebug_class_name(iter, dp);
+   class = ddebug_class_name(iter->table, dp);
if (class)
seq_printf(m, " class:%s", class);
else
-- 
2.41.0



[PATCH v5 05/23] dyndbg: ddebug_apply_class_bitmap - add module arg, select on it

2023-08-01 Thread Jim Cromie
Add query_module param to ddebug_apply_class_bitmap().  This allows
its caller to update just one module, or all (as currently).  We'll
use this later to propagate drm.debug to each USEr as they're
modprobed.

No functional change.

Signed-off-by: Jim Cromie 
---

after `modprobe i915`, heres the module dependencies,
though not all on drm.debug.

bash-5.2# lsmod
Module  Size  Used by
i915 3133440  0
drm_buddy  20480  1 i915
ttm90112  1 i915
i2c_algo_bit   16384  1 i915
video  61440  1 i915
wmi32768  1 video
drm_display_helper200704  1 i915
drm_kms_helper208896  2 drm_display_helper,i915
drm   606208  5 
drm_kms_helper,drm_display_helper,drm_buddy,i915,ttm
cec57344  2 drm_display_helper,i915
---
 lib/dynamic_debug.c | 19 ---
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index b4b6c5111315..d875c4fa5335 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -600,7 +600,8 @@ static int ddebug_exec_queries(char *query, const char 
*modname)
 
 /* apply a new bitmap to the sys-knob's current bit-state */
 static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
-unsigned long *new_bits, unsigned long 
*old_bits)
+unsigned long *new_bits, unsigned long 
*old_bits,
+const char *query_modname)
 {
 #define QUERY_SIZE 128
char query[QUERY_SIZE];
@@ -608,7 +609,8 @@ static int ddebug_apply_class_bitmap(const struct 
ddebug_class_param *dcp,
int matches = 0;
int bi, ct;
 
-   v2pr_info("apply: 0x%lx to: 0x%lx\n", *new_bits, *old_bits);
+   v2pr_info("apply bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, 
*old_bits,
+ query_modname ?: "");
 
for (bi = 0; bi < map->length; bi++) {
if (test_bit(bi, new_bits) == test_bit(bi, old_bits))
@@ -617,12 +619,15 @@ static int ddebug_apply_class_bitmap(const struct 
ddebug_class_param *dcp,
snprintf(query, QUERY_SIZE, "class %s %c%s", 
map->class_names[bi],
 test_bit(bi, new_bits) ? '+' : '-', dcp->flags);
 
-   ct = ddebug_exec_queries(query, NULL);
+   ct = ddebug_exec_queries(query, query_modname);
matches += ct;
 
v2pr_info("bit_%d: %d matches on class: %s -> 0x%lx\n", bi,
  ct, map->class_names[bi], *new_bits);
}
+   v2pr_info("applied bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, 
*old_bits,
+ query_modname ?: "");
+
return matches;
 }
 
@@ -678,7 +683,7 @@ static int param_set_dyndbg_classnames(const char *instr, 
const struct kernel_pa
continue;
}
curr_bits ^= BIT(cls_id);
-   totct += ddebug_apply_class_bitmap(dcp, _bits, 
dcp->bits);
+   totct += ddebug_apply_class_bitmap(dcp, _bits, 
dcp->bits, NULL);
*dcp->bits = curr_bits;
v2pr_info("%s: changed bit %d:%s\n", KP_NAME(kp), 
cls_id,
  map->class_names[cls_id]);
@@ -688,7 +693,7 @@ static int param_set_dyndbg_classnames(const char *instr, 
const struct kernel_pa
old_bits = CLASSMAP_BITMASK(*dcp->lvl);
curr_bits = CLASSMAP_BITMASK(cls_id + (wanted ? 1 : 0 
));
 
-   totct += ddebug_apply_class_bitmap(dcp, _bits, 
_bits);
+   totct += ddebug_apply_class_bitmap(dcp, _bits, 
_bits, NULL);
*dcp->lvl = (cls_id + (wanted ? 1 : 0));
v2pr_info("%s: changed bit-%d: \"%s\" %lx->%lx\n", 
KP_NAME(kp), cls_id,
  map->class_names[cls_id], old_bits, 
curr_bits);
@@ -751,7 +756,7 @@ int param_set_dyndbg_classes(const char *instr, const 
struct kernel_param *kp)
inrep &= CLASSMAP_BITMASK(map->length);
}
v2pr_info("bits:%lx > %s\n", inrep, KP_NAME(kp));
-   totct += ddebug_apply_class_bitmap(dcp, , dcp->bits);
+   totct += ddebug_apply_class_bitmap(dcp, , dcp->bits, 
NULL);
*dcp->bits = inrep;
break;
case DD_CLASS_TYPE_LEVEL_NUM:
@@ -764,7 +769,7 @@ int param_set_dyndbg_classes(const char *instr, const 
struct kernel_param *kp)
old_bits = CLASSMAP_BITMASK(*dcp->lvl);
new_bits = CLASSMAP_BITMASK(inrep);
v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, 
KP_NAME(kp));
-   totct += ddebug_apply_class_bitmap(dcp, _bits, _bits);
+   totct += ddebug_apply_class_bitmap(dcp, _bits, _bits, 
NULL);

[PATCH v5 07/23] dyndbg: drop NUM_TYPE_ARRAY

2023-08-01 Thread Jim Cromie
ARRAY_SIZE works here, since array decl is complete.

no functional change

Signed-off-by: Jim Cromie 
---
 include/linux/dynamic_debug.h | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 596d0664c29f..719c5b6ad0f9 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -104,11 +104,9 @@ struct ddebug_class_map {
.mod_name = KBUILD_MODNAME, \
.base = _base,  \
.map_type = _maptype,   \
-   .length = NUM_TYPE_ARGS(char*, __VA_ARGS__),\
+   .length = ARRAY_SIZE(_var##_classnames),\
.class_names = _var##_classnames,   \
}
-#define NUM_TYPE_ARGS(eltype, ...) \
-(sizeof((eltype[]){__VA_ARGS__}) / sizeof(eltype))
 
 /* encapsulate linker provided built-in (or module) dyndbg data */
 struct _ddebug_info {
-- 
2.41.0



[PATCH v5 03/23] dyndbg: make ddebug_class_param union members same size

2023-08-01 Thread Jim Cromie
struct ddebug_class_param keeps a ref to the state-storage of the
param, make both flavors use the same unsigned long under-type.
ISTM this is simpler and safer.

Signed-off-by: Jim Cromie 
---
 include/linux/dynamic_debug.h | 2 +-
 lib/dynamic_debug.c   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 061dd84d09f3..dc41e70dc2e1 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -122,7 +122,7 @@ struct _ddebug_info {
 struct ddebug_class_param {
union {
unsigned long *bits;
-   unsigned int *lvl;
+   unsigned long *lvl;
};
char flags[8];
const struct ddebug_class_map *map;
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index fdd6d9800a70..22a3182bf89f 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -795,7 +795,7 @@ int param_get_dyndbg_classes(char *buffer, const struct 
kernel_param *kp)
 
case DD_CLASS_TYPE_LEVEL_NAMES:
case DD_CLASS_TYPE_LEVEL_NUM:
-   return scnprintf(buffer, PAGE_SIZE, "%d\n", *dcp->lvl);
+   return scnprintf(buffer, PAGE_SIZE, "%ld\n", *dcp->lvl);
default:
return -1;
}
-- 
2.41.0



[PATCH v5 04/23] dyndbg: replace classmap list with a vector

2023-08-01 Thread Jim Cromie
Classmaps are stored/linked in a section/array, but are each added to
the module's ddebug_table.maps list-head.

This is unnecessary; even when ddebug_attach_classmap() is handling
the builtin section (with classmaps for multiple builtin modules), its
contents are ordered, so a module's possibly multiple classmaps will
be consecutive in the section, and could be treated as a vector/block,
since both start-addy and subrange length are in the ddebug_info arg.

So this changes:

struct ddebug_class_map drops list-head link.

struct ddebug_table drops the list-head maps, and gets: classes &
num_classes for the start-addy and num_classes, placed to improve
struct packing.

The loading: in ddebug_attach_module_classes(), replace the
for-the-modname list-add loop, with a forloop that finds the module's
subrange (start,length) of matching classmaps within the possibly
builtin classmaps vector, and saves those to the ddebug_table.

The reading/using: change list-foreach loops in ddebug_class_name() &
ddebug_find_valid_class() to walk the array from start to length.

Also:
Move #define __outvar up, above an added use in a fn-prototype.
Simplify ddebug_attach_module_classes args, ref has both addy,len.

no functional changes

Signed-off-by: Jim Cromie 
---
 include/linux/dynamic_debug.h |  1 -
 lib/dynamic_debug.c   | 61 ++-
 2 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index dc41e70dc2e1..596d0664c29f 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -81,7 +81,6 @@ enum class_map_type {
 };
 
 struct ddebug_class_map {
-   struct list_head link;
struct module *mod;
const char *mod_name;   /* needed for builtins */
const char **class_names;
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 22a3182bf89f..b4b6c5111315 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -45,10 +45,11 @@ extern struct ddebug_class_map __start___dyndbg_classes[];
 extern struct ddebug_class_map __stop___dyndbg_classes[];
 
 struct ddebug_table {
-   struct list_head link, maps;
+   struct list_head link;
const char *mod_name;
-   unsigned int num_ddebugs;
struct _ddebug *ddebugs;
+   struct ddebug_class_map *classes;
+   unsigned int num_ddebugs, num_classes;
 };
 
 struct ddebug_query {
@@ -146,13 +147,15 @@ static void vpr_info_dq(const struct ddebug_query *query, 
const char *msg)
  query->first_lineno, query->last_lineno, query->class_string);
 }
 
+#define __outvar /* filled by callee */
 static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table 
const *dt,
- const char 
*class_string, int *class_id)
+   const char 
*class_string,
+   __outvar int *class_id)
 {
struct ddebug_class_map *map;
-   int idx;
+   int i, idx;
 
-   list_for_each_entry(map, >maps, link) {
+   for (map = dt->classes, i = 0; i < dt->num_classes; i++, map++) {
idx = match_string(map->class_names, map->length, class_string);
if (idx >= 0) {
*class_id = idx + map->base;
@@ -163,7 +166,6 @@ static struct ddebug_class_map 
*ddebug_find_valid_class(struct ddebug_table cons
return NULL;
 }
 
-#define __outvar /* filled by callee */
 /*
  * Search the tables for _ddebug's which match the given `query' and
  * apply the `flags' and `mask' to them.  Returns number of matching
@@ -1107,9 +1109,10 @@ static void *ddebug_proc_next(struct seq_file *m, void 
*p, loff_t *pos)
 
 static const char *ddebug_class_name(struct ddebug_iter *iter, struct _ddebug 
*dp)
 {
-   struct ddebug_class_map *map;
+   struct ddebug_class_map *map = iter->table->classes;
+   int i, nc = iter->table->num_classes;
 
-   list_for_each_entry(map, >table->maps, link)
+   for (i = 0; i < nc; i++, map++)
if (class_in_range(dp->class_id, map))
return map->class_names[dp->class_id - map->base];
 
@@ -1193,30 +1196,31 @@ static const struct proc_ops proc_fops = {
.proc_write = ddebug_proc_write
 };
 
-static void ddebug_attach_module_classes(struct ddebug_table *dt,
-struct ddebug_class_map *classes,
-int num_classes)
+static void ddebug_attach_module_classes(struct ddebug_table *dt, struct 
_ddebug_info *di)
 {
struct ddebug_class_map *cm;
-   int i, j, ct = 0;
+   int i, nc = 0;
 
-   for (cm = classes, i = 0; i < num_classes; i++, cm++) {
+   /*
+* Find this module's classmaps in a subrange/wholerange of
+* the builtin/modular classmap vector/section.  Save the start
+* and length of the subrange 

[PATCH v5 02/23] test-dyndbg: fixup CLASSMAP usage error

2023-08-01 Thread Jim Cromie
more careful reading of test output reveals:

lib/test_dynamic_debug.c:103 [test_dynamic_debug]do_cats =pmf "doing 
categories\n"
lib/test_dynamic_debug.c:105 [test_dynamic_debug]do_cats =p "LOW msg\n" 
class:MID
lib/test_dynamic_debug.c:106 [test_dynamic_debug]do_cats =p "MID msg\n" class:HI
lib/test_dynamic_debug.c:107 [test_dynamic_debug]do_cats =_ "HI msg\n" class 
unknown, _id:13

That last line is wrong, the HI class is declared.

But the enum's 1st val (explicitly initialized) was wrong; it must be
_base, not _base+1 (a DECLARE_DYNDBG_CLASSMAP[1] param).  So the last
enumeration exceeded the range of mapped class-id's, which triggered
the "class unknown" report.  I intentionally coded in an error, but
forgot to verify its detection and remove it.

RFC:

This patch fixes a bad usage of DECLARE_DYNDBG_CLASSMAP(), showing
that it is too error-prone.  As noted in test-mod comments:

 * Using the CLASSMAP api:
 * - classmaps must have corresponding enum
 * - enum symbols must match/correlate with class-name strings in the map.
 * - base must equal enum's 1st value
 * - multiple maps must set their base to share the 0-62 class_id space !!
 *   (build-bug-on tips welcome)

Those shortcomings could largely be fixed with a __stringify_list
(which doesn't exist,) used in DECLARE_DYNDBG_CLASSMAP to stringify
__VA_ARGS__.  Then, API would accept DRM_UT_* values literally; all
the categories, in order, and not their stringifications, which
created all the usage complications above.

[1] name changes later to DYNDBG_CLASSMAP_DEFINE

Signed-off-by: Jim Cromie 
---
 lib/test_dynamic_debug.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c
index 8dd250ad022b..a01f0193a419 100644
--- a/lib/test_dynamic_debug.c
+++ b/lib/test_dynamic_debug.c
@@ -75,7 +75,7 @@ DD_SYS_WRAP(disjoint_bits, p);
 DD_SYS_WRAP(disjoint_bits, T);
 
 /* symbolic input, independent bits */
-enum cat_disjoint_names { LOW = 11, MID, HI };
+enum cat_disjoint_names { LOW = 10, MID, HI };
 DECLARE_DYNDBG_CLASSMAP(map_disjoint_names, DD_CLASS_TYPE_DISJOINT_NAMES, 10,
"LOW", "MID", "HI");
 DD_SYS_WRAP(disjoint_names, p);
-- 
2.41.0



[PATCH v5 01/23] drm: use correct ccflags-y syntax

2023-08-01 Thread Jim Cromie
Incorrect CFLAGS- usage failed to add -DDYNAMIC_DEBUG_MODULE,
which broke builds with:

CONFIG_DRM_USE_DYNAMIC_DEBUG=y
CONFIG_DYNAMIC_DEBUG_CORE=y
but without DYNAMIC_DEBUG

Nobody noticed because a larger regression emerged.

Also add subdir-ccflags so that all drivers pick up the addition.

Fixes: 84ec67288c10 ("drm_print: wrap drm_*_dbg in dyndbg descriptor factory 
macro")
Signed-off-by: Jim Cromie 
---
 drivers/gpu/drm/Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index a33257d2bc7f..670bf046019e 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -3,7 +3,8 @@
 # Makefile for the drm device driver.  This driver provides support for the
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
-CFLAGS-$(CONFIG_DRM_USE_DYNAMIC_DEBUG) += -DDYNAMIC_DEBUG_MODULE
+ccflags-$(CONFIG_DRM_USE_DYNAMIC_DEBUG)+= 
-DDYNAMIC_DEBUG_MODULE
+subdir-ccflags-$(CONFIG_DRM_USE_DYNAMIC_DEBUG) += -DDYNAMIC_DEBUG_MODULE
 
 drm-y := \
drm_aperture.o \
-- 
2.41.0



[PATCH v5 00/22] fix DRM_USE_DYNAMIC_DEBUG regression

2023-08-01 Thread Jim Cromie
Hi Jason, Daniel

Since patchwork puked on v5 just sent, Im calling this v5b.
Its also on github

remote: Create a pull request for 'dd-fix-5b' on GitHub by visiting:
remote:  https://github.com/jimc/linux/pull/new/dd-fix-5b
remote: 
To github.com:jimc/linux.git
 * [new branch]dd-fix-5b -> dd-fix-5b

This is V5, Im hoping to land this one.
 patchwork will probably call this set v3
 113361 fix DRM_USE_DYNAMIC_DEBUG regression - revs 1,2
 111652 DRM_USE_DYNAMIC_DEBUG regression - older, also 2 revs

It (patch 14 mainly):
 Fixes: aad0214f3026 ("dyndbg: add DECLARE_DYNDBG_CLASSMAP macro")
 Fixes: f158936b60a7 ("drm: POC drm on dyndbg - use in core, 2 helpers, 3 
drivers.")
 Ref: commit bb2ff6c27bc9 ("drm: Disable dynamic debug as broken")

It replaces DECLARE_DYNDBG_CLASSMAP macro with 2 new ones;
DYNDBG_CLASSMAP_DEFINE/_USE, and invokes them from drm.ko and drivers
respectively.  A new __dyndbg_class_users section contains each
driver's _USE; dyndbg scans it at driver-module load, finds drm.debug,
and applies it to the driver's class'd prdbgs.

The code it fixes went in here:
https://lore.kernel.org/lkml/yy7%2f6otbw2lqv...@kroah.com/

then Ref: effectively marked DRM_USE_DYNAMIC_DEBUG=y as broken

and https://lore.kernel.org/lkml/y3xurogav4i7b...@kroah.com/
GregKH opined:
This should go through the drm tree now.  The rest probably should also
go that way and not through my tree as well.

While most of this patchset's churn is still in lib/, DRM is the real
user for all this classmap stuff, and the real acceptance test is in
DRM CI.  Hopefully it won't fall over in BAT.

However, theres also a dyndbg patch to add -s flag, I havent seen it
lately, but it might have a nominal conflict.

I'll happily take reviews/Acks/tested-bys, grumpily breakage reports.
And some landing instructions, wind-speed, runway assignment, etc from the 
Tower.

theres also a few drive-by checkpatch tweaks.
13 fixes a warning that 14 gets about vmlinux.lds.h declared linker-symbols.


Jim Cromie (22):
  drm: use correct ccflags-y syntax
  test-dyndbg: fixup CLASSMAP usage error
  dyndbg: make ddebug_class_param union members same size
  dyndbg: replace classmap list with a vector
  dyndbg: ddebug_apply_class_bitmap - add module arg, select on it
  dyndbg: split param_set_dyndbg_classes to module/wrapper fns
  dyndbg: drop NUM_TYPE_ARRAY
  dyndbg: reduce verbose/debug clutter
  dyndbg: silence debugs with no-change updates
  dyndbg: tighten ddebug_class_name() 1st arg type
  dyndbg: tighten fn-sig of ddebug_apply_class_bitmap
  dyndbg-API: remove DD_CLASS_TYPE_(DISJOINT|LEVEL)_NAMES and code
  checkpatch: file-scoped extern special case for linker-symbol
  dyndbg-API: fix CONFIG_DRM_USE_DYNAMIC_DEBUG regression
  dyndbg: add for_each_boxed_vector
  dyndbg: refactor ddebug_classparam_clamp_input
  dyndbg-API: promote DYNDBG_CLASSMAP_PARAM to API
  dyndbg-test: build it with just CONFIG_DYNAMIC_DEBUG_CORE
  drm: restore CONFIG_DRM_USE_DYNAMIC_DEBUG un-BROKEN
  drm-drivers: DRM_CLASSMAP_USE in 2nd batch of drivers, helpers
  dyndbg-doc: add classmap info to howto
  checkpatch: reword long-line warn about commit-msg

 .../admin-guide/dynamic-debug-howto.rst   |  64 ++-
 MAINTAINERS   |   2 +-
 drivers/gpu/drm/Kconfig   |   3 +-
 drivers/gpu/drm/Makefile  |   3 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c   |  12 +-
 drivers/gpu/drm/display/drm_dp_helper.c   |  12 +-
 drivers/gpu/drm/drm_crtc_helper.c |  12 +-
 drivers/gpu/drm/drm_gem_shmem_helper.c|   2 +
 drivers/gpu/drm/drm_print.c   |  35 +-
 drivers/gpu/drm/gud/gud_drv.c |   2 +
 drivers/gpu/drm/i915/i915_params.c|  12 +-
 drivers/gpu/drm/mgag200/mgag200_drv.c |   2 +
 drivers/gpu/drm/nouveau/nouveau_drm.c |  12 +-
 drivers/gpu/drm/qxl/qxl_drv.c |   2 +
 drivers/gpu/drm/radeon/radeon_drv.c   |   2 +
 drivers/gpu/drm/udl/udl_main.c|   2 +
 drivers/gpu/drm/vkms/vkms_drv.c   |   2 +
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c   |   2 +
 include/asm-generic/vmlinux.lds.h |   1 +
 include/drm/drm_print.h   |  12 +-
 include/linux/dynamic_debug.h | 113 +++--
 kernel/module/main.c  |   3 +
 lib/Kconfig.debug |  10 +-
 lib/Makefile  |   4 +-
 lib/dynamic_debug.c   | 406 +++---
 lib/test_dynamic_debug.c  | 127 +++---
 lib/test_dynamic_debug_submod.c   |  10 +
 scripts/checkpatch.pl |  22 +-
 28 files changed, 550 insertions(+), 341 deletions(-)
 create mode 100644 lib/test_dynamic_debug_submod.c

-- 
2.41.0



Re: [PATCH] drm/nouveau: fixup the uapi header file.

2023-08-01 Thread kernel test robot
Hi Dave,

kernel test robot noticed the following build errors:

[auto build test ERROR on drm-misc/drm-misc-next]
[also build test ERROR on drm/drm-next drm-exynos/exynos-drm-next 
drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm-tip/drm-tip 
linus/master v6.5-rc4 next-20230801]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:
https://github.com/intel-lab-lkp/linux/commits/Dave-Airlie/drm-nouveau-fixup-the-uapi-header-file/20230801-031705
base:   git://anongit.freedesktop.org/drm/drm-misc drm-misc-next
patch link:
https://lore.kernel.org/r/20230731191557.4179175-1-airlied%40gmail.com
patch subject: [PATCH] drm/nouveau: fixup the uapi header file.
config: i386-randconfig-i012-20230731 
(https://download.01.org/0day-ci/archive/20230802/202308020752.d9jonihz-...@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git 
ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce: 
(https://download.01.org/0day-ci/archive/20230802/202308020752.d9jonihz-...@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot 
| Closes: 
https://lore.kernel.org/oe-kbuild-all/202308020752.d9jonihz-...@intel.com/

All errors (new ones prefixed by >>):

   In file included from :1:
>> ./usr/include/drm/nouveau_drm.h:48:2: error: unknown type name 'uint64_t'
   uint64_t param;
   ^
   ./usr/include/drm/nouveau_drm.h:49:2: error: unknown type name 'uint64_t'
   uint64_t value;
   ^
>> ./usr/include/drm/nouveau_drm.h:53:2: error: unknown type name 'uint32_t'
   uint32_t fb_ctxdma_handle;
   ^
   ./usr/include/drm/nouveau_drm.h:54:2: error: unknown type name 'uint32_t'
   uint32_t tt_ctxdma_handle;
   ^
   ./usr/include/drm/nouveau_drm.h:57:2: error: unknown type name 'uint32_t'
   uint32_t pushbuf_domains;
   ^
   ./usr/include/drm/nouveau_drm.h:60:2: error: unknown type name 'uint32_t'
   uint32_t notifier_handle;
   ^
   ./usr/include/drm/nouveau_drm.h:64:3: error: unknown type name 'uint32_t'
   uint32_t handle;
   ^
   ./usr/include/drm/nouveau_drm.h:65:3: error: unknown type name 'uint32_t'
   uint32_t grclass;
   ^
   ./usr/include/drm/nouveau_drm.h:67:2: error: unknown type name 'uint32_t'
   uint32_t nr_subchan;
   ^
   9 errors generated.

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


Re: [PATCH] PCI/VGA: Fixup the firmware fb address om demanding time

2023-08-01 Thread kernel test robot
Hi Sui,

kernel test robot noticed the following build warnings:

[auto build test WARNING on pci/next]
[also build test WARNING on pci/for-linus linus/master v6.5-rc4 next-20230801]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:
https://github.com/intel-lab-lkp/linux/commits/Sui-Jingfeng/PCI-VGA-Fixup-the-firmware-fb-address-om-demanding-time/20230802-023743
base:   https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link:
https://lore.kernel.org/r/20230801183706.702567-1-suijingfeng%40loongson.cn
patch subject: [PATCH] PCI/VGA: Fixup the firmware fb address om demanding time
config: parisc-allyesconfig 
(https://download.01.org/0day-ci/archive/20230802/202308020634.9sxwtdn0-...@intel.com/config)
compiler: hppa-linux-gcc (GCC) 12.3.0
reproduce: 
(https://download.01.org/0day-ci/archive/20230802/202308020634.9sxwtdn0-...@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot 
| Closes: 
https://lore.kernel.org/oe-kbuild-all/202308020634.9sxwtdn0-...@intel.com/

All warnings (new ones prefixed by >>):

   In file included from include/linux/printk.h:564,
from include/linux/kernel.h:30,
from include/linux/cpumask.h:10,
from include/linux/mm_types_task.h:14,
from include/linux/mm_types.h:5,
from include/linux/buildid.h:5,
from include/linux/module.h:14,
from drivers/pci/vgaarb.c:17:
   drivers/pci/vgaarb.c: In function 'vga_arb_get_fb_range_from_tracker':
>> drivers/pci/vgaarb.c:13:54: warning: format '%llx' expects argument of type 
>> 'long long unsigned int', but argument 4 has type 'resource_size_t' {aka 
>> 'unsigned int'} [-Wformat=]
  13 | #define vgaarb_dbg(dev, fmt, arg...)dev_dbg(dev, "vgaarb: " fmt, 
##arg)
 |  ^~
   include/linux/dynamic_debug.h:222:29: note: in definition of macro 
'__dynamic_func_call_cls'
 222 | func(, ##__VA_ARGS__);   \
 | ^~~
   include/linux/dynamic_debug.h:248:9: note: in expansion of macro 
'_dynamic_func_call_cls'
 248 | _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, 
##__VA_ARGS__)
 | ^~
   include/linux/dynamic_debug.h:271:9: note: in expansion of macro 
'_dynamic_func_call'
 271 | _dynamic_func_call(fmt, __dynamic_dev_dbg,  \
 | ^~
   include/linux/dev_printk.h:155:9: note: in expansion of macro 
'dynamic_dev_dbg'
 155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
 | ^~~
   include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
 155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
 |  ^~~
   drivers/pci/vgaarb.c:13:41: note: in expansion of macro 'dev_dbg'
  13 | #define vgaarb_dbg(dev, fmt, arg...)dev_dbg(dev, "vgaarb: " fmt, 
##arg)
 | ^~~
   drivers/pci/vgaarb.c:131:17: note: in expansion of macro 'vgaarb_dbg'
 131 | vgaarb_dbg(>dev,
 | ^~
   drivers/pci/vgaarb.c:13:54: warning: format '%llx' expects argument of type 
'long long unsigned int', but argument 5 has type 'resource_size_t' {aka 
'unsigned int'} [-Wformat=]
  13 | #define vgaarb_dbg(dev, fmt, arg...)dev_dbg(dev, "vgaarb: " fmt, 
##arg)
 |  ^~
   include/linux/dynamic_debug.h:222:29: note: in definition of macro 
'__dynamic_func_call_cls'
 222 | func(, ##__VA_ARGS__);   \
 | ^~~
   include/linux/dynamic_debug.h:248:9: note: in expansion of macro 
'_dynamic_func_call_cls'
 248 | _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, 
##__VA_ARGS__)
 | ^~
   include/linux/dynamic_debug.h:271:9: note: in expansion of macro 
'_dynamic_func_call'
 271 | _dynamic_func_call(fmt, __dynamic_dev_dbg,  \
 | ^~
   include/linux/dev_printk.h:155:9: note: in expansion of macro 
'dynamic_dev_dbg'
 155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
 | ^~~
   include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
 155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
 |

Re: [PATCH v5 02/10] drm/msm/dpu: bail from _dpu_core_perf_crtc_update_bus if there are no ICC paths

2023-08-01 Thread Abhinav Kumar




On 7/29/2023 6:00 PM, Dmitry Baryshkov wrote:

Skip bandwidth aggregation and return early if there are no interconnect
paths defined for the DPU device.

Signed-off-by: Dmitry Baryshkov 
---
  drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 6 +++---
  1 file changed, 3 insertions(+), 3 deletions(-)



Reviewed-by: Abhinav Kumar 



[GIT PULL FOR v6.6] drm: xilinx: Miscellaneous fixes

2023-08-01 Thread Laurent Pinchart
Hello,

The following changes since commit 52920704df878050123dfeb469aa6ab8022547c1:

  Merge tag 'drm-misc-next-2023-07-27' of 
git://anongit.freedesktop.org/drm/drm-misc into drm-next (2023-07-27 15:01:26 
+0200)

are available in the Git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/pinchartl/linux.git 
tags/drm-next-xilinx-20230802

for you to fetch changes up to 9bde3bfe24ca09a43b26e4bfcd569edace434cfa:

  drm: xlnx: zynqmp_dpsub: Use devm_platform_ioremap_resource_byname() 
(2023-08-02 01:36:54 +0300)


Miscellaneous fixes for the Xilinx zynqmp-dpsub driver


Jiasheng Jiang (1):
  drm: xlnx: zynqmp_dpsub: Add missing check for dma_set_mask

Lee Jones (1):
  drm/xlnx/zynqmp_dp: Fix function name zynqmp_dp_link_train() -> 
zynqmp_dp_train()

Li Zetao (1):
  drm: xlnx: zynqmp_dpsub: Use devm_platform_ioremap_resource_byname()

Wang Ming (1):
  drm: xlnx: zynqmp_dpsub: Use dev_err_probe instead of dev_err

 drivers/gpu/drm/xlnx/zynqmp_disp.c  | 14 +-
 drivers/gpu/drm/xlnx/zynqmp_dp.c|  2 +-
 drivers/gpu/drm/xlnx/zynqmp_dpsub.c |  4 +++-
 3 files changed, 9 insertions(+), 11 deletions(-)

-- 
Regards,

Laurent Pinchart


Re: [PATCH 02/37] drm/xlnx/zynqmp_disp: Use correct kerneldoc formatting in zynqmp_disp

2023-08-01 Thread Laurent Pinchart
Jon, Mauro, would you have any feedback on this ?
On Tue, Mar 21, 2023 at 01:15:51AM +0200, Laurent Pinchart wrote:
> Hi Lee,
> 
> (CC'ing Jon and Mauro)
> 
> On Mon, Mar 20, 2023 at 08:17:00AM +, Lee Jones wrote:
> > On Sun, 19 Mar 2023, Laurent Pinchart wrote:
> > > Thank you for the patch.
> > >
> > > On Fri, Mar 17, 2023 at 08:16:43AM +, Lee Jones wrote:
> > > > Fixes the following W=1 kernel build warning(s):
> > > >
> > > >  drivers/gpu/drm/xlnx/zynqmp_disp.c:151: warning: Function parameter or 
> > > > member 'blend' not described in 'zynqmp_disp'
> > > >  drivers/gpu/drm/xlnx/zynqmp_disp.c:151: warning: Function parameter or 
> > > > member 'avbuf' not described in 'zynqmp_disp'
> > > >  drivers/gpu/drm/xlnx/zynqmp_disp.c:151: warning: Function parameter or 
> > > > member 'audio' not described in 'zynqmp_disp'
> > > >
> > > > Cc: Hyun Kwon 
> > > > Cc: Laurent Pinchart 
> > > > Cc: David Airlie 
> > > > Cc: Daniel Vetter 
> > > > Cc: Michal Simek 
> > > > Cc: dri-devel@lists.freedesktop.org
> > > > Cc: linux-arm-ker...@lists.infradead.org
> > > > Signed-off-by: Lee Jones 
> > > > ---
> > > >  drivers/gpu/drm/xlnx/zynqmp_disp.c | 6 +++---
> > > >  1 file changed, 3 insertions(+), 3 deletions(-)
> > > >
> > > > diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c 
> > > > b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> > > > index 3b87eebddc979..63358f4898625 100644
> > > > --- a/drivers/gpu/drm/xlnx/zynqmp_disp.c
> > > > +++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> > > > @@ -128,9 +128,9 @@ struct zynqmp_disp_layer {
> > > >   * struct zynqmp_disp - Display controller
> > > >   * @dev: Device structure
> > > >   * @dpsub: Display subsystem
> > > > - * @blend.base: Register I/O base address for the blender
> > > > - * @avbuf.base: Register I/O base address for the audio/video buffer 
> > > > manager
> > > > - * @audio.base: Registers I/O base address for the audio mixer
> > > > + * @blend: .base: Register I/O base address for the blender
> > > > + * @avbuf: .base: Register I/O base address for the audio/video buffer 
> > > > manager
> > > > + * @audio: .base: Registers I/O base address for the audio mixer
> > >
> > > This is a hack, it won't work properly if the nested structures get
> > > extended with more fields.
> > 
> > The original doc is a hack, for it is not recognised kerneldoc format.  :)
> 
> I'll claim it's a bug, not a hack :-D
> 
> > > Is there a correct kerneldoc syntax for this code construct ?
> > 
> > Not that I'm aware of.
> > 
> > Unless it's been added since my last round of this stuff.
> 
> I haven't seen anything either. I tried moving the documentation inline,
> and the scripts/kernel-doc script ignores the comment blocks for the
> inner fields.
> 
> Mauro, Jon, is this a known issue ? If so, are there plans to fix it ?
> What's the recommended way to proceed here ?
> 
> > > >   * @layers: Layers (planes)
> > > >   */
> > > >  struct zynqmp_disp {

-- 
Regards,

Laurent Pinchart


Re: [PATCH] drm/modes: Fix division by zero error

2023-08-01 Thread Astra Joan
Hi Jani,

Thank you so much for the suggestions! I've submitted a V2 patch with
the updated code, and also a patch test request which should come back
soon. Please let me know if the new version looks good.

Best regards,
Ziqi


Re: [RFC v1 1/3] mm/mmu_notifier: Add a new notifier for mapping updates (new pages)

2023-08-01 Thread Peter Xu
On Tue, Aug 01, 2023 at 07:11:09AM +, Kasireddy, Vivek wrote:
> Ok, I'll keep your use-case in mind but AFAICS, the process that creates
> the udmabuf can be considered the owner. So, I think it makes sense that
> the owner's VMA range can be registered (via mmu_notifiers) for updates.

No need to have your special attention on this; my use case is not anything
useful with details, just wanted to show the idea that virtual address
range based notification might not work.

[...]

> What limitation do you see with the usage of mmu notifiers for this use-case?
> And, if using mmu notifiers is not the right approach, how do you suggest we
> can solve this problem?

AFAIU, even if there'll be a notification chanism, it needs to be at least
in per-file address space (probably in file offsets) rather than per-mm for
a shmem backend, so that any mapping of the file should notify that.

Isn't it already too late though to wait that notification until page is
installed?  Because here you pinned the page for DMA, I think it means
before a new page installed (but after the page is invalidated) the device
can DMA to an invalid buffer.

To come back to the original question: I don't know how that could work at
all, the userapp should just never do that invalidation, because right
after it does, the dma buffer will be invalid, and the device can update
data into trash.  So.. I don't have an easy way to do this right.. besides
disabling ram discard just like what vfio does already.

Thanks,

-- 
Peter Xu



[PATCH v2] drm/modes: Fix division by zero error

2023-08-01 Thread Ziqi Zhao
In the bug reported by Syzbot, the variable `den == (1 << 22)` and
`mode->vscan == (1 << 10)`, causing the multiplication to overflow and
accidentally make `den == 0`. To prevent any chance of overflow, we
replace `num` and `den` with 64-bit unsigned integers, and explicitly
check if the divisor `den` will overflow. If so, we employ full 64-bit
division with rounding; otherwise we keep the 64-bit to 32-bit division
that could potentially be better optimized.

In order to minimize the performance overhead, the overflow check for
`den` is wrapped with an `unlikely` condition. Please let me know if
this usage is appropriate.

Reported-by: syzbot+622bba18029bcde67...@syzkaller.appspotmail.com
Signed-off-by: Ziqi Zhao 
---
V1 -> V2: address style comments suggested by Jani Nikula


 drivers/gpu/drm/drm_modes.c | 11 +++
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index ac9a406250c5..137101960690 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -1285,13 +1285,13 @@ EXPORT_SYMBOL(drm_mode_set_name);
  */
 int drm_mode_vrefresh(const struct drm_display_mode *mode)
 {
-   unsigned int num, den;
+   u64 num, den;
 
if (mode->htotal == 0 || mode->vtotal == 0)
return 0;
 
-   num = mode->clock;
-   den = mode->htotal * mode->vtotal;
+   num = mul_u32_u32(mode->clock, 1000);
+   den = mul_u32_u32(mode->htotal, mode->vtotal);
 
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
num *= 2;
@@ -1300,7 +1300,10 @@ int drm_mode_vrefresh(const struct drm_display_mode 
*mode)
if (mode->vscan > 1)
den *= mode->vscan;
 
-   return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(num, 1000), den);
+   if (unlikely(den > UINT_MAX))
+   return DIV64_U64_ROUND_CLOSEST(num, den);
+
+   return DIV_ROUND_CLOSEST_ULL(num, (u32) den);
 }
 EXPORT_SYMBOL(drm_mode_vrefresh);
 
-- 
2.34.1



Re: [PATCH -next] drm: xlnx: zynqmp_dpsub: Use devm_platform_ioremap_resource_byname()

2023-08-01 Thread Laurent Pinchart
Hi Li,

Thank you for the patch.

On Tue, Aug 01, 2023 at 04:32:20PM +0800, Li Zetao wrote:
> Convert platform_get_resource_byname() + devm_ioremap_resource() to a
> single call to devm_platform_ioremap_resource_byname(), as this is
> exactly what this function does.
> 
> Signed-off-by: Li Zetao 

Reviewed-by: Laurent Pinchart 

> ---
>  drivers/gpu/drm/xlnx/zynqmp_disp.c | 10 +++---
>  1 file changed, 3 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c 
> b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> index 3b87eebddc97..2b731f3eea54 100644
> --- a/drivers/gpu/drm/xlnx/zynqmp_disp.c
> +++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> @@ -1228,7 +1228,6 @@ int zynqmp_disp_probe(struct zynqmp_dpsub *dpsub)
>  {
>   struct platform_device *pdev = to_platform_device(dpsub->dev);
>   struct zynqmp_disp *disp;
> - struct resource *res;
>   int ret;
>  
>   disp = kzalloc(sizeof(*disp), GFP_KERNEL);
> @@ -1238,22 +1237,19 @@ int zynqmp_disp_probe(struct zynqmp_dpsub *dpsub)
>   disp->dev = >dev;
>   disp->dpsub = dpsub;
>  
> - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "blend");
> - disp->blend.base = devm_ioremap_resource(disp->dev, res);
> + disp->blend.base = devm_platform_ioremap_resource_byname(pdev, "blend");
>   if (IS_ERR(disp->blend.base)) {
>   ret = PTR_ERR(disp->blend.base);
>   goto error;
>   }
>  
> - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "av_buf");
> - disp->avbuf.base = devm_ioremap_resource(disp->dev, res);
> + disp->avbuf.base = devm_platform_ioremap_resource_byname(pdev, 
> "av_buf");
>   if (IS_ERR(disp->avbuf.base)) {
>   ret = PTR_ERR(disp->avbuf.base);
>   goto error;
>   }
>  
> - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aud");
> - disp->audio.base = devm_ioremap_resource(disp->dev, res);
> + disp->audio.base = devm_platform_ioremap_resource_byname(pdev, "aud");
>   if (IS_ERR(disp->audio.base)) {
>   ret = PTR_ERR(disp->audio.base);
>   goto error;

-- 
Regards,

Laurent Pinchart


Re: [PATCH] drm/nouveau: fixup the uapi header file.

2023-08-01 Thread kernel test robot
Hi Dave,

kernel test robot noticed the following build errors:

[auto build test ERROR on drm-misc/drm-misc-next]
[also build test ERROR on drm/drm-next drm-exynos/exynos-drm-next 
drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm-tip/drm-tip 
linus/master v6.5-rc4 next-20230801]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:
https://github.com/intel-lab-lkp/linux/commits/Dave-Airlie/drm-nouveau-fixup-the-uapi-header-file/20230801-031705
base:   git://anongit.freedesktop.org/drm/drm-misc drm-misc-next
patch link:
https://lore.kernel.org/r/20230731191557.4179175-1-airlied%40gmail.com
patch subject: [PATCH] drm/nouveau: fixup the uapi header file.
config: i386-randconfig-m021-20230730 
(https://download.01.org/0day-ci/archive/20230802/202308020519.o6km2q1k-...@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: 
(https://download.01.org/0day-ci/archive/20230802/202308020519.o6km2q1k-...@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot 
| Closes: 
https://lore.kernel.org/oe-kbuild-all/202308020519.o6km2q1k-...@intel.com/

All errors (new ones prefixed by >>):

   In file included from :
>> ./usr/include/drm/nouveau_drm.h:48:9: error: unknown type name 'uint64_t'
  48 | uint64_t param;
 | ^~~~
   ./usr/include/drm/nouveau_drm.h:49:9: error: unknown type name 'uint64_t'
  49 | uint64_t value;
 | ^~~~
>> ./usr/include/drm/nouveau_drm.h:53:9: error: unknown type name 'uint32_t'
  53 | uint32_t fb_ctxdma_handle;
 | ^~~~
   ./usr/include/drm/nouveau_drm.h:54:9: error: unknown type name 'uint32_t'
  54 | uint32_t tt_ctxdma_handle;
 | ^~~~
   ./usr/include/drm/nouveau_drm.h:57:9: error: unknown type name 'uint32_t'
  57 | uint32_t pushbuf_domains;
 | ^~~~
   ./usr/include/drm/nouveau_drm.h:60:9: error: unknown type name 'uint32_t'
  60 | uint32_t notifier_handle;
 | ^~~~
   ./usr/include/drm/nouveau_drm.h:64:17: error: unknown type name 'uint32_t'
  64 | uint32_t handle;
 | ^~~~
   ./usr/include/drm/nouveau_drm.h:65:17: error: unknown type name 'uint32_t'
  65 | uint32_t grclass;
 | ^~~~
   ./usr/include/drm/nouveau_drm.h:67:9: error: unknown type name 'uint32_t'
  67 | uint32_t nr_subchan;
 | ^~~~

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


Re: [PATCH v3] drm/bridge: Add debugfs print for bridge chains

2023-08-01 Thread Laurent Pinchart
Hi Tomi,

Thank you for the patch.

On Mon, Jul 31, 2023 at 03:13:14PM +0300, Tomi Valkeinen wrote:
> DRM bridges are not visible to the userspace and it may not be
> immediately clear if the chain is somehow constructed incorrectly. I
> have had two separate instances of a bridge driver failing to do a
> drm_bridge_attach() call, resulting in the bridge connector not being
> part of the chain. In some situations this doesn't seem to cause issues,
> but it will if DRM_BRIDGE_ATTACH_NO_CONNECTOR flag is used.
> 
> Add a debugfs file to print the bridge chains. For me, on this TI AM62
> based platform, I get the following output:
> 
> encoder[39]
>   bridge[0] type: 0, ops: 0x0
>   bridge[1] type: 0, ops: 0x0, OF: 
> /bus@f/i2c@2000/dsi@e:toshiba,tc358778
>   bridge[2] type: 0, ops: 0x3, OF: 
> /bus@f/i2c@2001/hdmi@48:lontium,lt8912b
>   bridge[3] type: 11, ops: 0x7, OF: /hdmi-connector:hdmi-connector
> 
> Signed-off-by: Tomi Valkeinen 
> ---
> Changes in v3:
> - Use drm_for_each_bridge_in_chain()
> - Drop extra comment
> - Fix whitespace issue
> - Call drm_bridge_debugfs_init() only if the driver uses modeset
> - Drop #ifdef for drm_bridge_debugfs_init() declaration
> - Link to v2: 
> https://lore.kernel.org/r/20230721-drm-bridge-chain-debugfs-v2-1-76df94347...@ideasonboard.com
> 
> Changes in v2:
> - Fixed compilation issue when !CONFIG_OF
> - Link to v1: 
> https://lore.kernel.org/r/20230721-drm-bridge-chain-debugfs-v1-1-8614ff7e8...@ideasonboard.com
> ---
>  drivers/gpu/drm/drm_bridge.c  | 46 
> +++
>  drivers/gpu/drm/drm_debugfs.c |  3 +++
>  include/drm/drm_bridge.h  |  3 +++
>  3 files changed, 52 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> index c3d69af02e79..39e68e45bb12 100644
> --- a/drivers/gpu/drm/drm_bridge.c
> +++ b/drivers/gpu/drm/drm_bridge.c
> @@ -27,8 +27,10 @@
>  #include 
>  
>  #include 
> +#include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  
> @@ -1345,6 +1347,50 @@ struct drm_bridge *of_drm_find_bridge(struct 
> device_node *np)
>  EXPORT_SYMBOL(of_drm_find_bridge);
>  #endif
>  
> +#ifdef CONFIG_DEBUG_FS
> +static int drm_bridge_chains_info(struct seq_file *m, void *data)
> +{
> + struct drm_debugfs_entry *entry = m->private;
> + struct drm_device *dev = entry->dev;
> + struct drm_printer p = drm_seq_file_printer(m);
> + struct drm_mode_config *config = >mode_config;
> + struct drm_encoder *encoder;
> + unsigned int bridge_idx = 0;
> +
> + list_for_each_entry(encoder, >encoder_list, head) {
> + struct drm_bridge *bridge;
> +
> + drm_printf(, "encoder[%u]\n", encoder->base.id);
> +
> + drm_for_each_bridge_in_chain(encoder, bridge) {
> + drm_printf(, "\tbridge[%u] type: %u, ops: %#x",
> +bridge_idx, bridge->type, bridge->ops);
> +
> +#ifdef CONFIG_OF
> + if (bridge->of_node)
> + drm_printf(, ", OF: %pOFfc", bridge->of_node);
> +#endif
> +
> + drm_printf(, "\n");
> +
> + bridge_idx++;
> + }
> + }
> +
> + return 0;
> +}
> +
> +static const struct drm_debugfs_info drm_bridge_debugfs_list[] = {
> + { "bridge_chains", drm_bridge_chains_info, 0 },
> +};
> +
> +void drm_bridge_debugfs_init(struct drm_minor *minor)
> +{
> + drm_debugfs_add_files(minor->dev, drm_bridge_debugfs_list,
> +   ARRAY_SIZE(drm_bridge_debugfs_list));
> +}
> +#endif
> +
>  MODULE_AUTHOR("Ajay Kumar ");
>  MODULE_DESCRIPTION("DRM bridge infrastructure");
>  MODULE_LICENSE("GPL and additional rights");
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index a3a488205009..3b1de2c61c89 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -31,6 +31,7 @@
>  
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -274,6 +275,8 @@ int drm_debugfs_init(struct drm_minor *minor, int 
> minor_id,
>  
>   if (drm_drv_uses_atomic_modeset(dev)) {
>   drm_atomic_debugfs_init(minor);
> +

You could drop the blank line, up to you.

> + drm_bridge_debugfs_init(minor);
>   }
>  
>   if (drm_core_check_feature(dev, DRIVER_MODESET)) {
> diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> index bf964cdfb330..cb10ee108538 100644
> --- a/include/drm/drm_bridge.h
> +++ b/include/drm/drm_bridge.h
> @@ -949,4 +949,7 @@ static inline struct drm_bridge 
> *drmm_of_get_bridge(struct drm_device *drm,
>  }
>  #endif
>  
> +struct drm_minor;

Let's move this to tbe beginning of the file with the other forward
declarations. With this addressedn

Reviewed-by: Laurent Pinchart 

> +void drm_bridge_debugfs_init(struct drm_minor *minor);
> +
>  #endif
> 
> ---
> base-commit: a0c64d153d687756c8719b8d10e609d62e1cb6fd
> 

Re: [PATCH] drm/msm/dpu: Drop encoder vsync_event

2023-08-01 Thread Jessica Zhang




On 8/1/2023 1:37 PM, Dmitry Baryshkov wrote:

On 01/08/2023 23:18, Jessica Zhang wrote:

Drop vsync_event and vsync_event_work handlers as they are unnecessary.

Signed-off-by: Jessica Zhang 
---
  drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 65 
+

  drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h   |  4 --
  2 files changed, 1 insertion(+), 68 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c

index f0a2a1dca741..d34e684a4178 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -152,7 +152,6 @@ enum dpu_enc_rc_states {
   * @crtc_frame_event_cb_data:    callback handler private data
   * @frame_done_timeout_ms:    frame done timeout in ms
   * @frame_done_timer:    watchdog timer for frame done event
- * @vsync_event_timer:    vsync timer
   * @disp_info:    local copy of msm_display_info struct
   * @idle_pc_supported:    indicate if idle power collaps is 
supported

   * @rc_lock:    resource control mutex lock to protect
@@ -160,7 +159,6 @@ enum dpu_enc_rc_states {
   * @rc_state:    resource controller state
   * @delayed_off_work:    delayed worker to schedule disabling of
   *    clks and resources after IDLE_TIMEOUT time.
- * @vsync_event_work:    worker to handle vsync event for 
autorefresh

   * @topology:   topology of the display
   * @idle_timeout:    idle timeout duration in milliseconds
   * @wide_bus_en:    wide bus is enabled on this interface
@@ -194,7 +192,6 @@ struct dpu_encoder_virt {
  atomic_t frame_done_timeout_ms;
  struct timer_list frame_done_timer;
-    struct timer_list vsync_event_timer;
  struct msm_display_info disp_info;
@@ -202,7 +199,6 @@ struct dpu_encoder_virt {
  struct mutex rc_lock;
  enum dpu_enc_rc_states rc_state;
  struct delayed_work delayed_off_work;
-    struct kthread_work vsync_event_work;
  struct msm_display_topology topology;
  u32 idle_timeout;
@@ -1770,49 +1766,6 @@ int dpu_encoder_vsync_time(struct drm_encoder 
*drm_enc, ktime_t *wakeup_time)

  return 0;
  }
-static void dpu_encoder_vsync_event_handler(struct timer_list *t)
-{
-    struct dpu_encoder_virt *dpu_enc = from_timer(dpu_enc, t,
-    vsync_event_timer);
-    struct drm_encoder *drm_enc = _enc->base;
-    struct msm_drm_private *priv;
-    struct msm_drm_thread *event_thread;
-
-    if (!drm_enc->dev || !drm_enc->crtc) {
-    DPU_ERROR("invalid parameters\n");
-    return;
-    }
-
-    priv = drm_enc->dev->dev_private;
-
-    if (drm_enc->crtc->index >= ARRAY_SIZE(priv->event_thread)) {
-    DPU_ERROR("invalid crtc index\n");
-    return;
-    }
-    event_thread = >event_thread[drm_enc->crtc->index];
-    if (!event_thread) {
-    DPU_ERROR("event_thread not found for crtc:%d\n",
-    drm_enc->crtc->index);
-    return;
-    }
-
-    del_timer(_enc->vsync_event_timer);
-}
-
-static void dpu_encoder_vsync_event_work_handler(struct kthread_work 
*work)

-{
-    struct dpu_encoder_virt *dpu_enc = container_of(work,
-    struct dpu_encoder_virt, vsync_event_work);
-    ktime_t wakeup_time;
-
-    if (dpu_encoder_vsync_time(_enc->base, _time))
-    return;
-
-    trace_dpu_enc_vsync_event_work(DRMID(_enc->base), wakeup_time);
-    mod_timer(_enc->vsync_event_timer,
-    nsecs_to_jiffies(ktime_to_ns(wakeup_time)));
-}
-
  static u32
  dpu_encoder_dsc_initial_line_calc(struct drm_dsc_config *dsc,
    u32 enc_ip_width)
@@ -1972,7 +1925,6 @@ void dpu_encoder_kickoff(struct drm_encoder 
*drm_enc)

  {
  struct dpu_encoder_virt *dpu_enc;
  struct dpu_encoder_phys *phys;
-    ktime_t wakeup_time;
  unsigned long timeout_ms;
  unsigned int i;
@@ -1998,14 +1950,6 @@ void dpu_encoder_kickoff(struct drm_encoder 
*drm_enc)

  phys->ops.handle_post_kickoff(phys);
  }
-    if (dpu_enc->disp_info.intf_type == INTF_DSI &&
-    !dpu_encoder_vsync_time(drm_enc, _time)) {
-    trace_dpu_enc_early_kickoff(DRMID(drm_enc),
-    ktime_to_ms(wakeup_time));
-    mod_timer(_enc->vsync_event_timer,
-    nsecs_to_jiffies(ktime_to_ns(wakeup_time)));
-    }
-
  DPU_ATRACE_END("encoder_kickoff");
  }
@@ -2439,11 +2383,7 @@ struct drm_encoder *dpu_encoder_init(struct 
drm_device *dev,

  timer_setup(_enc->frame_done_timer,
  dpu_encoder_frame_done_timeout, 0);
-    if (disp_info->intf_type == INTF_DSI)
-    timer_setup(_enc->vsync_event_timer,
-    dpu_encoder_vsync_event_handler,
-    0);
-    else if (disp_info->intf_type == INTF_DP)
+    if (disp_info->intf_type == INTF_DP)
  dpu_enc->wide_bus_en = msm_dp_wide_bus_available(
  priv->dp[disp_info->h_tile_instance[0]]);
@@ -2451,9 +2391,6 @@ struct drm_encoder 

Re: [PATCH 05/14] dt-bindings: display: rockchip-vop: Document rv1126 vop

2023-08-01 Thread Conor Dooley
On Mon, Jul 31, 2023 at 04:30:03PM +0530, Jagan Teki wrote:
> Document the VOP for Rockchip RV1126.
> 
> Signed-off-by: Jagan Teki 

There's no commentary here about compatibility with other, existing,
devices nor did you CC me on the rest of the series. How am I supposed
to know if appending to enum is the right thing to do?

Ditto the other binding.

Thanks,
Conor.

> ---
> Cc: dri-devel@lists.freedesktop.org
> Cc: devicet...@vger.kernel.org
> Cc: Rob Herring 
> Cc: Krzysztof Kozlowski 
> Cc: Conor Dooley 
> Cc: Sandy Huang 
> Cc: David Airlie 
> Cc: Daniel Vetter 
> 
>  .../devicetree/bindings/display/rockchip/rockchip-vop.yaml   | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git 
> a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.yaml 
> b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.yaml
> index df61cb5f5c54..b339b7e708c6 100644
> --- a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.yaml
> +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.yaml
> @@ -31,6 +31,7 @@ properties:
>- rockchip,rk3368-vop
>- rockchip,rk3399-vop-big
>- rockchip,rk3399-vop-lit
> +  - rockchip,rv1126-vop
>  
>reg:
>  minItems: 1
> -- 
> 2.25.1
> 


signature.asc
Description: PGP signature


Re: [PATCH 07/14] dt-bindings: display: rockchip-dw-mipi-dsi: Document rv1126 DSI

2023-08-01 Thread Conor Dooley
On Mon, Jul 31, 2023 at 04:30:05PM +0530, Jagan Teki wrote:
> Document the MIPI DSI for Rockchip RV1126.
> 
> Signed-off-by: Jagan Teki 

Acked-by: Conor Dooley 

Thanks,
Conor.

> ---
> Cc: dri-devel@lists.freedesktop.org
> Cc: devicet...@vger.kernel.org
> Cc: Rob Herring 
> Cc: Krzysztof Kozlowski 
> Cc: Conor Dooley 
> Cc: Sandy Huang 
> Cc: David Airlie 
> Cc: Daniel Vetter 
> 
>  .../bindings/display/rockchip/rockchip,dw-mipi-dsi.yaml | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git 
> a/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-mipi-dsi.yaml
>  
> b/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-mipi-dsi.yaml
> index 8e8a40879140..ccf79e738fa1 100644
> --- 
> a/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-mipi-dsi.yaml
> +++ 
> b/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-mipi-dsi.yaml
> @@ -18,6 +18,7 @@ properties:
>- rockchip,rk3288-mipi-dsi
>- rockchip,rk3399-mipi-dsi
>- rockchip,rk3568-mipi-dsi
> +  - rockchip,rv1126-mipi-dsi
>- const: snps,dw-mipi-dsi
>  
>interrupts:
> @@ -77,6 +78,7 @@ allOf:
>  enum:
>- rockchip,px30-mipi-dsi
>- rockchip,rk3568-mipi-dsi
> +  - rockchip,rv1126-mipi-dsi
>  
>  then:
>properties:
> -- 
> 2.25.1
> 


signature.asc
Description: PGP signature


[PATCH 5/8] drm/sched: Add drm_sched_start_timeout_unlocked helper

2023-08-01 Thread Matthew Brost
Also add a lockdep assert to drm_sched_start_timeout.

Signed-off-by: Matthew Brost 
---
 drivers/gpu/drm/scheduler/sched_main.c | 23 +--
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/scheduler/sched_main.c 
b/drivers/gpu/drm/scheduler/sched_main.c
index 84821a124ca2..be963d68a733 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -360,11 +360,20 @@ static void drm_sched_job_done_cb(struct dma_fence *f, 
struct dma_fence_cb *cb)
  */
 static void drm_sched_start_timeout(struct drm_gpu_scheduler *sched)
 {
+   lockdep_assert_held(>job_list_lock);
+
if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
!list_empty(>pending_list))
queue_delayed_work(sched->timeout_wq, >work_tdr, 
sched->timeout);
 }
 
+static void drm_sched_start_timeout_unlocked(struct drm_gpu_scheduler *sched)
+{
+   spin_lock(>job_list_lock);
+   drm_sched_start_timeout(sched);
+   spin_unlock(>job_list_lock);
+}
+
 /**
  * drm_sched_fault - immediately start timeout handler
  *
@@ -476,11 +485,8 @@ static void drm_sched_job_timedout(struct work_struct 
*work)
spin_unlock(>job_list_lock);
}
 
-   if (status != DRM_GPU_SCHED_STAT_ENODEV) {
-   spin_lock(>job_list_lock);
-   drm_sched_start_timeout(sched);
-   spin_unlock(>job_list_lock);
-   }
+   if (status != DRM_GPU_SCHED_STAT_ENODEV)
+   drm_sched_start_timeout_unlocked(sched);
 }
 
 /**
@@ -606,11 +612,8 @@ void drm_sched_start(struct drm_gpu_scheduler *sched, bool 
full_recovery)
drm_sched_job_done(s_job);
}
 
-   if (full_recovery) {
-   spin_lock(>job_list_lock);
-   drm_sched_start_timeout(sched);
-   spin_unlock(>job_list_lock);
-   }
+   if (full_recovery)
+   drm_sched_start_timeout_unlocked(sched);
 
drm_sched_run_wq_start(sched);
 }
-- 
2.34.1



[PATCH 7/8] drm/sched: Submit job before starting TDR

2023-08-01 Thread Matthew Brost
If the TDR is set to a value, it can fire before a job is submitted in
drm_sched_main. The job should be always be submitted before the TDR
fires, fix this ordering.

v2:
  - Add to pending list before run_job, start TDR after (Luben, Boris)

Signed-off-by: Matthew Brost 
---
 drivers/gpu/drm/scheduler/sched_main.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/scheduler/sched_main.c 
b/drivers/gpu/drm/scheduler/sched_main.c
index 2e404a6542ad..9573f13f8459 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -445,7 +445,6 @@ static void drm_sched_job_begin(struct drm_sched_job *s_job)
 
spin_lock(>job_list_lock);
list_add_tail(_job->list, >pending_list);
-   drm_sched_start_timeout(sched);
spin_unlock(>job_list_lock);
 }
 
@@ -1146,6 +1145,7 @@ static void drm_sched_main(struct work_struct *w)
fence = sched->ops->run_job(sched_job);
complete_all(>entity_idle);
drm_sched_fence_scheduled(s_fence);
+   drm_sched_start_timeout_unlocked(sched);
 
if (!IS_ERR_OR_NULL(fence)) {
drm_sched_fence_set_parent(s_fence, fence);
-- 
2.34.1



[PATCH 1/8] drm/sched: Convert drm scheduler to use a work queue rather than kthread

2023-08-01 Thread Matthew Brost
In XE, the new Intel GPU driver, a choice has made to have a 1 to 1
mapping between a drm_gpu_scheduler and drm_sched_entity. At first this
seems a bit odd but let us explain the reasoning below.

1. In XE the submission order from multiple drm_sched_entity is not
guaranteed to be the same completion even if targeting the same hardware
engine. This is because in XE we have a firmware scheduler, the GuC,
which allowed to reorder, timeslice, and preempt submissions. If a using
shared drm_gpu_scheduler across multiple drm_sched_entity, the TDR falls
apart as the TDR expects submission order == completion order. Using a
dedicated drm_gpu_scheduler per drm_sched_entity solve this problem.

2. In XE submissions are done via programming a ring buffer (circular
buffer), a drm_gpu_scheduler provides a limit on number of jobs, if the
limit of number jobs is set to RING_SIZE / MAX_SIZE_PER_JOB we get flow
control on the ring for free.

A problem with this design is currently a drm_gpu_scheduler uses a
kthread for submission / job cleanup. This doesn't scale if a large
number of drm_gpu_scheduler are used. To work around the scaling issue,
use a worker rather than kthread for submission / job cleanup.

v2:
  - (Rob Clark) Fix msm build
  - Pass in run work queue
v3:
  - (Boris) don't have loop in worker

Signed-off-by: Matthew Brost 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c |  14 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c  |  14 +-
 drivers/gpu/drm/etnaviv/etnaviv_sched.c |   2 +-
 drivers/gpu/drm/lima/lima_sched.c   |   2 +-
 drivers/gpu/drm/msm/adreno/adreno_device.c  |   6 +-
 drivers/gpu/drm/msm/msm_ringbuffer.c|   2 +-
 drivers/gpu/drm/panfrost/panfrost_job.c |   2 +-
 drivers/gpu/drm/scheduler/sched_main.c  | 136 +++-
 drivers/gpu/drm/v3d/v3d_sched.c |  10 +-
 include/drm/gpu_scheduler.h |  14 +-
 10 files changed, 113 insertions(+), 89 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index f60753f97ac5..9c2a10aeb0b3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@ -1489,9 +1489,9 @@ static int amdgpu_debugfs_test_ib_show(struct seq_file 
*m, void *unused)
for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
struct amdgpu_ring *ring = adev->rings[i];
 
-   if (!ring || !ring->sched.thread)
+   if (!ring || !ring->sched.ready)
continue;
-   kthread_park(ring->sched.thread);
+   drm_sched_run_wq_stop(>sched);
}
 
seq_printf(m, "run ib test:\n");
@@ -1505,9 +1505,9 @@ static int amdgpu_debugfs_test_ib_show(struct seq_file 
*m, void *unused)
for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
struct amdgpu_ring *ring = adev->rings[i];
 
-   if (!ring || !ring->sched.thread)
+   if (!ring || !ring->sched.ready)
continue;
-   kthread_unpark(ring->sched.thread);
+   drm_sched_run_wq_start(>sched);
}
 
up_write(>reset_domain->sem);
@@ -1727,7 +1727,7 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
 
ring = adev->rings[val];
 
-   if (!ring || !ring->funcs->preempt_ib || !ring->sched.thread)
+   if (!ring || !ring->funcs->preempt_ib || !ring->sched.ready)
return -EINVAL;
 
/* the last preemption failed */
@@ -1745,7 +1745,7 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
goto pro_end;
 
/* stop the scheduler */
-   kthread_park(ring->sched.thread);
+   drm_sched_run_wq_stop(>sched);
 
/* preempt the IB */
r = amdgpu_ring_preempt_ib(ring);
@@ -1779,7 +1779,7 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
 
 failure:
/* restart the scheduler */
-   kthread_unpark(ring->sched.thread);
+   drm_sched_run_wq_start(>sched);
 
up_read(>reset_domain->sem);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index fac9312b1695..00c9c03c8f94 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2364,7 +2364,7 @@ static int amdgpu_device_init_schedulers(struct 
amdgpu_device *adev)
break;
}
 
-   r = drm_sched_init(>sched, _sched_ops,
+   r = drm_sched_init(>sched, _sched_ops, NULL,
   ring->num_hw_submission, 
amdgpu_job_hang_limit,
   timeout, adev->reset_domain->wq,
   ring->sched_score, ring->name,
@@ -4627,7 +4627,7 @@ bool amdgpu_device_has_job_running(struct amdgpu_device 
*adev)
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
struct amdgpu_ring *ring = adev->rings[i];
 
-   if 

[PATCH 6/8] drm/sched: Start run wq before TDR in drm_sched_start

2023-08-01 Thread Matthew Brost
If the TDR is set to a very small value it can fire before the run wq is
started in the function drm_sched_start. The run wq is expected to
running when the TDR fires, fix this ordering so this expectation is
always met.

Signed-off-by: Matthew Brost 
---
 drivers/gpu/drm/scheduler/sched_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/scheduler/sched_main.c 
b/drivers/gpu/drm/scheduler/sched_main.c
index be963d68a733..2e404a6542ad 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -612,10 +612,10 @@ void drm_sched_start(struct drm_gpu_scheduler *sched, 
bool full_recovery)
drm_sched_job_done(s_job);
}
 
+   drm_sched_run_wq_start(sched);
+
if (full_recovery)
drm_sched_start_timeout_unlocked(sched);
-
-   drm_sched_run_wq_start(sched);
 }
 EXPORT_SYMBOL(drm_sched_start);
 
-- 
2.34.1



[PATCH 8/8] drm/sched: Add helper to set TDR timeout

2023-08-01 Thread Matthew Brost
Add helper to set TDR timeout and restart the TDR with new timeout
value. This will be used in XE, new Intel GPU driver, to trigger the TDR
to cleanup drm_sched_entity that encounter errors.

Signed-off-by: Matthew Brost 
---
 drivers/gpu/drm/scheduler/sched_main.c | 18 ++
 include/drm/gpu_scheduler.h|  1 +
 2 files changed, 19 insertions(+)

diff --git a/drivers/gpu/drm/scheduler/sched_main.c 
b/drivers/gpu/drm/scheduler/sched_main.c
index 9573f13f8459..19ec0cb5caee 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -374,6 +374,24 @@ static void drm_sched_start_timeout_unlocked(struct 
drm_gpu_scheduler *sched)
spin_unlock(>job_list_lock);
 }
 
+/**
+ * drm_sched_set_timeout - set timeout for reset worker
+ *
+ * @sched: scheduler instance to set and (re)-start the worker for
+ * @timeout: timeout period
+ *
+ * Set and (re)-start the timeout for the given scheduler.
+ */
+void drm_sched_set_timeout(struct drm_gpu_scheduler *sched, long timeout)
+{
+   spin_lock(>job_list_lock);
+   sched->timeout = timeout;
+   cancel_delayed_work(>work_tdr);
+   drm_sched_start_timeout(sched);
+   spin_unlock(>job_list_lock);
+}
+EXPORT_SYMBOL(drm_sched_set_timeout);
+
 /**
  * drm_sched_fault - immediately start timeout handler
  *
diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
index 267bd060d178..f4af856aebd9 100644
--- a/include/drm/gpu_scheduler.h
+++ b/include/drm/gpu_scheduler.h
@@ -589,6 +589,7 @@ void drm_sched_entity_modify_sched(struct drm_sched_entity 
*entity,
struct drm_gpu_scheduler **sched_list,
unsigned int num_sched_list);
 
+void drm_sched_set_timeout(struct drm_gpu_scheduler *sched, long timeout);
 void drm_sched_job_cleanup(struct drm_sched_job *job);
 void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
 void drm_sched_add_msg(struct drm_gpu_scheduler *sched,
-- 
2.34.1



[PATCH 4/8] drm/sched: Add generic scheduler message interface

2023-08-01 Thread Matthew Brost
Add generic schedule message interface which sends messages to backend
from the drm_gpu_scheduler main submission thread. The idea is some of
these messages modify some state in drm_sched_entity which is also
modified during submission. By scheduling these messages and submission
in the same thread their is not race changing states in
drm_sched_entity.

This interface will be used in XE, new Intel GPU driver, to cleanup,
suspend, resume, and change scheduling properties of a drm_sched_entity.

The interface is designed to be generic and extendable with only the
backend understanding the messages.

Signed-off-by: Matthew Brost 
---
 drivers/gpu/drm/scheduler/sched_main.c | 52 +-
 include/drm/gpu_scheduler.h| 29 +-
 2 files changed, 78 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/scheduler/sched_main.c 
b/drivers/gpu/drm/scheduler/sched_main.c
index 2597fb298733..84821a124ca2 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -1049,6 +1049,49 @@ drm_sched_pick_best(struct drm_gpu_scheduler 
**sched_list,
 }
 EXPORT_SYMBOL(drm_sched_pick_best);
 
+/**
+ * drm_sched_add_msg - add scheduler message
+ *
+ * @sched: scheduler instance
+ * @msg: message to be added
+ *
+ * Can and will pass an jobs waiting on dependencies or in a runnable queue.
+ * Messages processing will stop if schedule run wq is stopped and resume when
+ * run wq is started.
+ */
+void drm_sched_add_msg(struct drm_gpu_scheduler *sched,
+  struct drm_sched_msg *msg)
+{
+   spin_lock(>job_list_lock);
+   list_add_tail(>link, >msgs);
+   spin_unlock(>job_list_lock);
+
+   drm_sched_run_wq_queue(sched);
+}
+EXPORT_SYMBOL(drm_sched_add_msg);
+
+/**
+ * drm_sched_get_msg - get scheduler message
+ *
+ * @sched: scheduler instance
+ *
+ * Returns NULL or message
+ */
+static struct drm_sched_msg *
+drm_sched_get_msg(struct drm_gpu_scheduler *sched)
+{
+   struct drm_sched_msg *msg;
+
+   spin_lock(>job_list_lock);
+   msg = list_first_entry_or_null(>msgs,
+  struct drm_sched_msg, link);
+   if (msg)
+   list_del(>link);
+   spin_unlock(>job_list_lock);
+
+   return msg;
+}
+
 /**
  * drm_sched_main - main scheduler thread
  *
@@ -1060,6 +1103,7 @@ static void drm_sched_main(struct work_struct *w)
container_of(w, struct drm_gpu_scheduler, work_run);
struct drm_sched_entity *entity;
struct drm_sched_job *cleanup_job;
+   struct drm_sched_msg *msg;
int r;
 
if (READ_ONCE(sched->pause_run_wq))
@@ -1067,12 +,15 @@ static void drm_sched_main(struct work_struct *w)
 
cleanup_job = drm_sched_get_cleanup_job(sched);
entity = drm_sched_select_entity(sched);
+   msg = drm_sched_get_msg(sched);
 
-   if (!entity && !cleanup_job)
+   if (!entity && !cleanup_job && !msg)
return; /* No more work */
 
if (cleanup_job)
sched->ops->free_job(cleanup_job);
+   if (msg)
+   sched->ops->process_msg(msg);
 
if (entity) {
struct dma_fence *fence;
@@ -1082,7 +1129,7 @@ static void drm_sched_main(struct work_struct *w)
sched_job = drm_sched_entity_pop_job(entity);
if (!sched_job) {
complete_all(>entity_idle);
-   if (!cleanup_job)
+   if (!cleanup_job && !msg)
return; /* No more work */
goto again;
}
@@ -1177,6 +1224,7 @@ int drm_sched_init(struct drm_gpu_scheduler *sched,
 
init_waitqueue_head(>job_scheduled);
INIT_LIST_HEAD(>pending_list);
+   INIT_LIST_HEAD(>msgs);
spin_lock_init(>job_list_lock);
atomic_set(>hw_rq_count, 0);
INIT_DELAYED_WORK(>work_tdr, drm_sched_job_timedout);
diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
index df1993dd44ae..267bd060d178 100644
--- a/include/drm/gpu_scheduler.h
+++ b/include/drm/gpu_scheduler.h
@@ -394,6 +394,23 @@ enum drm_gpu_sched_stat {
DRM_GPU_SCHED_STAT_ENODEV,
 };
 
+/**
+ * struct drm_sched_msg - an in-band (relative to GPU scheduler run queue)
+ * message
+ *
+ * Generic enough for backend defined messages, backend can expand if needed.
+ */
+struct drm_sched_msg {
+   /** @link: list link into the gpu scheduler list of messages */
+   struct list_headlink;
+   /**
+* @private_data: opaque pointer to message private data (backend 
defined)
+*/
+   void*private_data;
+   /** @opcode: opcode of message (backend defined) */
+   unsigned intopcode;
+};
+
 /**
  * struct drm_sched_backend_ops - Define the backend operations
  * called by the scheduler
@@ -471,6 +488,12 @@ struct drm_sched_backend_ops {
 

[PATCH 3/8] drm/sched: Add DRM_SCHED_POLICY_SINGLE_ENTITY scheduling policy

2023-08-01 Thread Matthew Brost
DRM_SCHED_POLICY_SINGLE_ENTITY creates a 1 to 1 relationship between
scheduler and entity. No priorities or run queue used in this mode.
Intended for devices with firmware schedulers.

v2:
  - Drop sched / rq union (Luben)

Signed-off-by: Matthew Brost 
---
 drivers/gpu/drm/scheduler/sched_entity.c | 69 ++--
 drivers/gpu/drm/scheduler/sched_fence.c  |  2 +-
 drivers/gpu/drm/scheduler/sched_main.c   | 62 ++---
 include/drm/gpu_scheduler.h  |  8 +++
 4 files changed, 118 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/scheduler/sched_entity.c 
b/drivers/gpu/drm/scheduler/sched_entity.c
index 941ea8edead2..59c1ca578256 100644
--- a/drivers/gpu/drm/scheduler/sched_entity.c
+++ b/drivers/gpu/drm/scheduler/sched_entity.c
@@ -83,6 +83,7 @@ int drm_sched_entity_init(struct drm_sched_entity *entity,
memset(entity, 0, sizeof(struct drm_sched_entity));
INIT_LIST_HEAD(>list);
entity->rq = NULL;
+   entity->single_sched = NULL;
entity->guilty = guilty;
entity->num_sched_list = num_sched_list;
entity->priority = priority;
@@ -90,8 +91,17 @@ int drm_sched_entity_init(struct drm_sched_entity *entity,
entity->last_scheduled = NULL;
RB_CLEAR_NODE(>rb_tree_node);
 
-   if(num_sched_list)
-   entity->rq = _list[0]->sched_rq[entity->priority];
+   if (num_sched_list) {
+   if (sched_list[0]->sched_policy !=
+   DRM_SCHED_POLICY_SINGLE_ENTITY) {
+   entity->rq = _list[0]->sched_rq[entity->priority];
+   } else {
+   if (num_sched_list != 1 || sched_list[0]->single_entity)
+   return -EINVAL;
+   sched_list[0]->single_entity = entity;
+   entity->single_sched = sched_list[0];
+   }
+   }
 
init_completion(>entity_idle);
 
@@ -124,7 +134,8 @@ void drm_sched_entity_modify_sched(struct drm_sched_entity 
*entity,
struct drm_gpu_scheduler **sched_list,
unsigned int num_sched_list)
 {
-   WARN_ON(!num_sched_list || !sched_list);
+   WARN_ON(!num_sched_list || !sched_list ||
+   !!entity->single_sched);
 
entity->sched_list = sched_list;
entity->num_sched_list = num_sched_list;
@@ -194,13 +205,15 @@ static void drm_sched_entity_kill(struct drm_sched_entity 
*entity)
 {
struct drm_sched_job *job;
struct dma_fence *prev;
+   bool single_entity = !!entity->single_sched;
 
-   if (!entity->rq)
+   if (!entity->rq && !single_entity)
return;
 
spin_lock(>rq_lock);
entity->stopped = true;
-   drm_sched_rq_remove_entity(entity->rq, entity);
+   if (!single_entity)
+   drm_sched_rq_remove_entity(entity->rq, entity);
spin_unlock(>rq_lock);
 
/* Make sure this entity is not used by the scheduler at the moment */
@@ -222,6 +235,20 @@ static void drm_sched_entity_kill(struct drm_sched_entity 
*entity)
dma_fence_put(prev);
 }
 
+/**
+ * drm_sched_entity_to_scheduler - Schedule entity to GPU scheduler
+ * @entity: scheduler entity
+ *
+ * Returns GPU scheduler for the entity
+ */
+struct drm_gpu_scheduler *
+drm_sched_entity_to_scheduler(struct drm_sched_entity *entity)
+{
+   bool single_entity = !!entity->single_sched;
+
+   return single_entity ? entity->single_sched : entity->rq->sched;
+}
+
 /**
  * drm_sched_entity_flush - Flush a context entity
  *
@@ -239,11 +266,12 @@ long drm_sched_entity_flush(struct drm_sched_entity 
*entity, long timeout)
struct drm_gpu_scheduler *sched;
struct task_struct *last_user;
long ret = timeout;
+   bool single_entity = !!entity->single_sched;
 
-   if (!entity->rq)
+   if (!entity->rq && !single_entity)
return 0;
 
-   sched = entity->rq->sched;
+   sched = drm_sched_entity_to_scheduler(entity);
/**
 * The client will not queue more IBs during this fini, consume existing
 * queued IBs or discard them on SIGKILL
@@ -336,7 +364,7 @@ static void drm_sched_entity_wakeup(struct dma_fence *f,
container_of(cb, struct drm_sched_entity, cb);
 
drm_sched_entity_clear_dep(f, cb);
-   drm_sched_wakeup(entity->rq->sched);
+   drm_sched_wakeup(drm_sched_entity_to_scheduler(entity));
 }
 
 /**
@@ -350,6 +378,8 @@ static void drm_sched_entity_wakeup(struct dma_fence *f,
 void drm_sched_entity_set_priority(struct drm_sched_entity *entity,
   enum drm_sched_priority priority)
 {
+   WARN_ON(!!entity->single_sched);
+
spin_lock(>rq_lock);
entity->priority = priority;
spin_unlock(>rq_lock);
@@ -362,7 +392,7 @@ EXPORT_SYMBOL(drm_sched_entity_set_priority);
  */
 static bool drm_sched_entity_add_dependency_cb(struct 

[PATCH 2/8] drm/sched: Move schedule policy to scheduler / entity

2023-08-01 Thread Matthew Brost
Rather than a global modparam for scheduling policy, move the scheduling
policy to scheduler / entity so user can control each scheduler / entity
policy.

v2:
  - s/DRM_SCHED_POLICY_MAX/DRM_SCHED_POLICY_COUNT (Luben)
  - Only include policy in scheduler (Luben)

Signed-off-by: Matthew Brost 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  1 +
 drivers/gpu/drm/etnaviv/etnaviv_sched.c|  3 ++-
 drivers/gpu/drm/lima/lima_sched.c  |  3 ++-
 drivers/gpu/drm/msm/msm_ringbuffer.c   |  3 ++-
 drivers/gpu/drm/panfrost/panfrost_job.c|  3 ++-
 drivers/gpu/drm/scheduler/sched_entity.c   | 24 ++
 drivers/gpu/drm/scheduler/sched_main.c | 23 +++--
 drivers/gpu/drm/v3d/v3d_sched.c| 15 +-
 include/drm/gpu_scheduler.h| 20 --
 9 files changed, 70 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 00c9c03c8f94..4df0fca5a74c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2368,6 +2368,7 @@ static int amdgpu_device_init_schedulers(struct 
amdgpu_device *adev)
   ring->num_hw_submission, 
amdgpu_job_hang_limit,
   timeout, adev->reset_domain->wq,
   ring->sched_score, ring->name,
+  DRM_SCHED_POLICY_DEFAULT,
   adev->dev);
if (r) {
DRM_ERROR("Failed to create scheduler on ring %s.\n",
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_sched.c 
b/drivers/gpu/drm/etnaviv/etnaviv_sched.c
index 8486a2923f1b..61204a3f8b0b 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_sched.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_sched.c
@@ -136,7 +136,8 @@ int etnaviv_sched_init(struct etnaviv_gpu *gpu)
ret = drm_sched_init(>sched, _sched_ops, NULL,
 etnaviv_hw_jobs_limit, etnaviv_job_hang_limit,
 msecs_to_jiffies(500), NULL, NULL,
-dev_name(gpu->dev), gpu->dev);
+dev_name(gpu->dev), DRM_SCHED_POLICY_DEFAULT,
+gpu->dev);
if (ret)
return ret;
 
diff --git a/drivers/gpu/drm/lima/lima_sched.c 
b/drivers/gpu/drm/lima/lima_sched.c
index 54f53bece27c..33042ba6ae93 100644
--- a/drivers/gpu/drm/lima/lima_sched.c
+++ b/drivers/gpu/drm/lima/lima_sched.c
@@ -491,7 +491,8 @@ int lima_sched_pipe_init(struct lima_sched_pipe *pipe, 
const char *name)
return drm_sched_init(>base, _sched_ops, NULL, 1,
  lima_job_hang_limit,
  msecs_to_jiffies(timeout), NULL,
- NULL, name, pipe->ldev->dev);
+ NULL, name, DRM_SCHED_POLICY_DEFAULT,
+ pipe->ldev->dev);
 }
 
 void lima_sched_pipe_fini(struct lima_sched_pipe *pipe)
diff --git a/drivers/gpu/drm/msm/msm_ringbuffer.c 
b/drivers/gpu/drm/msm/msm_ringbuffer.c
index 5879fc262047..f408a9097315 100644
--- a/drivers/gpu/drm/msm/msm_ringbuffer.c
+++ b/drivers/gpu/drm/msm/msm_ringbuffer.c
@@ -97,7 +97,8 @@ struct msm_ringbuffer *msm_ringbuffer_new(struct msm_gpu 
*gpu, int id,
 
ret = drm_sched_init(>sched, _sched_ops, NULL,
num_hw_submissions, 0, sched_timeout,
-   NULL, NULL, to_msm_bo(ring->bo)->name, gpu->dev->dev);
+   NULL, NULL, to_msm_bo(ring->bo)->name,
+   DRM_SCHED_POLICY_DEFAULT, gpu->dev->dev);
if (ret) {
goto fail;
}
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c 
b/drivers/gpu/drm/panfrost/panfrost_job.c
index f48b07056a16..effa48b33dce 100644
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
@@ -819,7 +819,8 @@ int panfrost_job_init(struct panfrost_device *pfdev)
 nentries, 0,
 msecs_to_jiffies(JOB_TIMEOUT_MS),
 pfdev->reset.wq,
-NULL, "pan_js", pfdev->dev);
+NULL, "pan_js", DRM_SCHED_POLICY_DEFAULT,
+pfdev->dev);
if (ret) {
dev_err(pfdev->dev, "Failed to create scheduler: %d.", 
ret);
goto err_sched;
diff --git a/drivers/gpu/drm/scheduler/sched_entity.c 
b/drivers/gpu/drm/scheduler/sched_entity.c
index 15d04a0ec623..941ea8edead2 100644
--- a/drivers/gpu/drm/scheduler/sched_entity.c
+++ b/drivers/gpu/drm/scheduler/sched_entity.c
@@ -33,6 +33,20 @@
 #define to_drm_sched_job(sched_job)\
container_of((sched_job), struct drm_sched_job, queue_node)
 
+static bool bad_policies(struct 

[PATCH 0/8] DRM scheduler changes for Xe

2023-08-01 Thread Matthew Brost
As a prerequisite to merging the new Intel Xe DRM driver [1] [2], we
have been asked to merge our common DRM scheduler patches first.

This a continuation of a RFC [3] with all comments addressed, ready for
a full review, and hopefully in state which can merged in the near
future. More details of this series can found in the cover letter of the
RFC [3].

These changes have been tested with the Xe driver.

Matt

[1] https://gitlab.freedesktop.org/drm/xe/kernel
[2] https://patchwork.freedesktop.org/series/112188/
[3] https://patchwork.freedesktop.org/series/116055/

Matthew Brost (8):
  drm/sched: Convert drm scheduler to use a work queue rather than
kthread
  drm/sched: Move schedule policy to scheduler / entity
  drm/sched: Add DRM_SCHED_POLICY_SINGLE_ENTITY scheduling policy
  drm/sched: Add generic scheduler message interface
  drm/sched: Add drm_sched_start_timeout_unlocked helper
  drm/sched: Start run wq before TDR in drm_sched_start
  drm/sched: Submit job before starting TDR
  drm/sched: Add helper to set TDR timeout

 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c |  14 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c  |  15 +-
 drivers/gpu/drm/etnaviv/etnaviv_sched.c |   5 +-
 drivers/gpu/drm/lima/lima_sched.c   |   5 +-
 drivers/gpu/drm/msm/adreno/adreno_device.c  |   6 +-
 drivers/gpu/drm/msm/msm_ringbuffer.c|   5 +-
 drivers/gpu/drm/panfrost/panfrost_job.c |   5 +-
 drivers/gpu/drm/scheduler/sched_entity.c|  85 +-
 drivers/gpu/drm/scheduler/sched_fence.c |   2 +-
 drivers/gpu/drm/scheduler/sched_main.c  | 294 +++-
 drivers/gpu/drm/v3d/v3d_sched.c |  25 +-
 include/drm/gpu_scheduler.h |  70 -
 12 files changed, 396 insertions(+), 135 deletions(-)

-- 
2.34.1



Re: [PATCH v2] drm/panel: Enable DSC and CMD mode for Visionox VTDR6130 panel

2023-08-01 Thread Dmitry Baryshkov

On 01/08/2023 23:43, Paloma Arellano wrote:


On 8/1/2023 1:26 AM, neil.armstr...@linaro.org wrote:

On 28/07/2023 23:44, Jessica Zhang wrote:



On 7/28/2023 2:37 AM, Dmitry Baryshkov wrote:
On Fri, 28 Jul 2023 at 04:26, Paloma Arellano 
 wrote:


Enable display compression (DSC v1.2) and CMD mode for 1080x2400 
Visionox
VTDR6130 AMOLED DSI panel. In addition, this patch will set the 
default

to command mode with DSC enabled.

Note: This patch has only been validated DSC over command mode as 
DSC over

video mode has never been validated for the MSM driver before.

Depends on: "Add prepare_prev_first flag to Visionox VTDR6130" [1]

Changes since v1:
  - Changed from email address

[1] https://patchwork.freedesktop.org/series/121337/

Suggested-by: Jessica Zhang 
Signed-off-by: Paloma Arellano 
---
  .../gpu/drm/panel/panel-visionox-vtdr6130.c   | 77 
++-

  1 file changed, 73 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c 
b/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c

index e1363e128e7e..5658d39a3a6b 100644
--- a/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c
+++ b/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c
@@ -9,6 +9,7 @@
  #include 

  #include 
+#include 
  #include 
  #include 
  #include 
@@ -20,7 +21,8 @@ struct visionox_vtdr6130 {
 struct mipi_dsi_device *dsi;
 struct gpio_desc *reset_gpio;
 struct regulator_bulk_data supplies[3];
-   bool prepared;
+   bool prepared, enabled;
+   bool video_mode;
  };

  static inline struct visionox_vtdr6130 
*to_visionox_vtdr6130(struct drm_panel *panel)
@@ -50,12 +52,18 @@ static int visionox_vtdr6130_on(struct 
visionox_vtdr6130 *ctx)

 if (ret)
 return ret;

+   mipi_dsi_dcs_write_seq(dsi, 0x03, 0x01);
 mipi_dsi_dcs_write_seq(dsi, 
MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x20);
 mipi_dsi_dcs_write_seq(dsi, 
MIPI_DCS_SET_DISPLAY_BRIGHTNESS, 0x00, 0x00);

 mipi_dsi_dcs_write_seq(dsi, 0x59, 0x09);
 mipi_dsi_dcs_write_seq(dsi, 0x6c, 0x01);
 mipi_dsi_dcs_write_seq(dsi, 0x6d, 0x00);
-   mipi_dsi_dcs_write_seq(dsi, 0x6f, 0x01);
+
+   if (ctx->video_mode)
+   mipi_dsi_dcs_write_seq(dsi, 0x6f, 0x01);
+   else
+   mipi_dsi_dcs_write_seq(dsi, 0x6f, 0x02);
+
 mipi_dsi_dcs_write_seq(dsi, 0x70,
    0x12, 0x00, 0x00, 0xab, 0x30, 0x80, 
0x09, 0x60, 0x04,
    0x38, 0x00, 0x28, 0x02, 0x1c, 0x02, 
0x1c, 0x02, 0x00,
@@ -214,6 +222,42 @@ static const struct drm_display_mode 
visionox_vtdr6130_mode = {

 .height_mm = 157,
  };

+static int visionox_vtdr6130_enable(struct drm_panel *panel)
+{
+   struct visionox_vtdr6130 *ctx = to_visionox_vtdr6130(panel);
+   struct mipi_dsi_device *dsi = ctx->dsi;
+   struct drm_dsc_picture_parameter_set pps;
+   int ret;
+
+   if (ctx->enabled)
+   return 0;
+
+   if (!dsi->dsc) {
+   dev_err(>dev, "DSC not attached to DSI\n");
+   return -ENODEV;
+   }


The error message is misleading. Also, if you don't want to enable DSC
for the video mode, this will break.


+
+   drm_dsc_pps_payload_pack(, dsi->dsc);
+   ret = mipi_dsi_picture_parameter_set(dsi, );
+   if (ret) {
+   dev_err(>dev, "Failed to set PPS\n");
+   return ret;
+   }
+
+   ctx->enabled = true;


Do we need this refcount just for PPS upload? What will happen if PPS
is uploaded several times?


+
+   return 0;
+}
+
+static int visionox_vtdr6130_disable(struct drm_panel *panel)
+{
+   struct visionox_vtdr6130 *ctx = to_visionox_vtdr6130(panel);
+
+   ctx->enabled = false;
+
+   return 0;
+}
+
  static int visionox_vtdr6130_get_modes(struct drm_panel *panel,
    struct drm_connector 
*connector)

  {
@@ -237,6 +281,8 @@ static const struct drm_panel_funcs 
visionox_vtdr6130_panel_funcs = {

 .prepare = visionox_vtdr6130_prepare,
 .unprepare = visionox_vtdr6130_unprepare,
 .get_modes = visionox_vtdr6130_get_modes,
+   .enable = visionox_vtdr6130_enable,
+   .disable = visionox_vtdr6130_disable,
  };

  static int visionox_vtdr6130_bl_update_status(struct 
backlight_device *bl)
@@ -269,11 +315,31 @@ static int visionox_vtdr6130_probe(struct 
mipi_dsi_device *dsi)

  {
 struct device *dev = >dev;
 struct visionox_vtdr6130 *ctx;
+   struct drm_dsc_config *dsc;
 int ret;

 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
 if (!ctx)
 return -ENOMEM;
+
+   ctx->video_mode = of_property_read_bool(dev->of_node, 
"enforce-video-mode");


Please also add a DT bindings patch.


+
+   dsc = devm_kzalloc(dev, sizeof(*dsc), GFP_KERNEL);
+   if (!dsc)
+   return -ENOMEM;


You can add struct drm_dsc_config to struct visionox_vtdr6130 instead
of 

Re: [PATCH v2] drm/panel: Enable DSC and CMD mode for Visionox VTDR6130 panel

2023-08-01 Thread Paloma Arellano



On 8/1/2023 1:26 AM, neil.armstr...@linaro.org wrote:

On 28/07/2023 23:44, Jessica Zhang wrote:



On 7/28/2023 2:37 AM, Dmitry Baryshkov wrote:
On Fri, 28 Jul 2023 at 04:26, Paloma Arellano 
 wrote:


Enable display compression (DSC v1.2) and CMD mode for 1080x2400 
Visionox
VTDR6130 AMOLED DSI panel. In addition, this patch will set the 
default

to command mode with DSC enabled.

Note: This patch has only been validated DSC over command mode as 
DSC over

video mode has never been validated for the MSM driver before.

Depends on: "Add prepare_prev_first flag to Visionox VTDR6130" [1]

Changes since v1:
  - Changed from email address

[1] https://patchwork.freedesktop.org/series/121337/

Suggested-by: Jessica Zhang 
Signed-off-by: Paloma Arellano 
---
  .../gpu/drm/panel/panel-visionox-vtdr6130.c   | 77 
++-

  1 file changed, 73 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c 
b/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c

index e1363e128e7e..5658d39a3a6b 100644
--- a/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c
+++ b/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c
@@ -9,6 +9,7 @@
  #include 

  #include 
+#include 
  #include 
  #include 
  #include 
@@ -20,7 +21,8 @@ struct visionox_vtdr6130 {
 struct mipi_dsi_device *dsi;
 struct gpio_desc *reset_gpio;
 struct regulator_bulk_data supplies[3];
-   bool prepared;
+   bool prepared, enabled;
+   bool video_mode;
  };

  static inline struct visionox_vtdr6130 
*to_visionox_vtdr6130(struct drm_panel *panel)
@@ -50,12 +52,18 @@ static int visionox_vtdr6130_on(struct 
visionox_vtdr6130 *ctx)

 if (ret)
 return ret;

+   mipi_dsi_dcs_write_seq(dsi, 0x03, 0x01);
 mipi_dsi_dcs_write_seq(dsi, 
MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x20);
 mipi_dsi_dcs_write_seq(dsi, 
MIPI_DCS_SET_DISPLAY_BRIGHTNESS, 0x00, 0x00);

 mipi_dsi_dcs_write_seq(dsi, 0x59, 0x09);
 mipi_dsi_dcs_write_seq(dsi, 0x6c, 0x01);
 mipi_dsi_dcs_write_seq(dsi, 0x6d, 0x00);
-   mipi_dsi_dcs_write_seq(dsi, 0x6f, 0x01);
+
+   if (ctx->video_mode)
+   mipi_dsi_dcs_write_seq(dsi, 0x6f, 0x01);
+   else
+   mipi_dsi_dcs_write_seq(dsi, 0x6f, 0x02);
+
 mipi_dsi_dcs_write_seq(dsi, 0x70,
    0x12, 0x00, 0x00, 0xab, 0x30, 0x80, 
0x09, 0x60, 0x04,
    0x38, 0x00, 0x28, 0x02, 0x1c, 0x02, 
0x1c, 0x02, 0x00,
@@ -214,6 +222,42 @@ static const struct drm_display_mode 
visionox_vtdr6130_mode = {

 .height_mm = 157,
  };

+static int visionox_vtdr6130_enable(struct drm_panel *panel)
+{
+   struct visionox_vtdr6130 *ctx = to_visionox_vtdr6130(panel);
+   struct mipi_dsi_device *dsi = ctx->dsi;
+   struct drm_dsc_picture_parameter_set pps;
+   int ret;
+
+   if (ctx->enabled)
+   return 0;
+
+   if (!dsi->dsc) {
+   dev_err(>dev, "DSC not attached to DSI\n");
+   return -ENODEV;
+   }


The error message is misleading. Also, if you don't want to enable DSC
for the video mode, this will break.


+
+   drm_dsc_pps_payload_pack(, dsi->dsc);
+   ret = mipi_dsi_picture_parameter_set(dsi, );
+   if (ret) {
+   dev_err(>dev, "Failed to set PPS\n");
+   return ret;
+   }
+
+   ctx->enabled = true;


Do we need this refcount just for PPS upload? What will happen if PPS
is uploaded several times?


+
+   return 0;
+}
+
+static int visionox_vtdr6130_disable(struct drm_panel *panel)
+{
+   struct visionox_vtdr6130 *ctx = to_visionox_vtdr6130(panel);
+
+   ctx->enabled = false;
+
+   return 0;
+}
+
  static int visionox_vtdr6130_get_modes(struct drm_panel *panel,
    struct drm_connector 
*connector)

  {
@@ -237,6 +281,8 @@ static const struct drm_panel_funcs 
visionox_vtdr6130_panel_funcs = {

 .prepare = visionox_vtdr6130_prepare,
 .unprepare = visionox_vtdr6130_unprepare,
 .get_modes = visionox_vtdr6130_get_modes,
+   .enable = visionox_vtdr6130_enable,
+   .disable = visionox_vtdr6130_disable,
  };

  static int visionox_vtdr6130_bl_update_status(struct 
backlight_device *bl)
@@ -269,11 +315,31 @@ static int visionox_vtdr6130_probe(struct 
mipi_dsi_device *dsi)

  {
 struct device *dev = >dev;
 struct visionox_vtdr6130 *ctx;
+   struct drm_dsc_config *dsc;
 int ret;

 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
 if (!ctx)
 return -ENOMEM;
+
+   ctx->video_mode = of_property_read_bool(dev->of_node, 
"enforce-video-mode");


Please also add a DT bindings patch.


+
+   dsc = devm_kzalloc(dev, sizeof(*dsc), GFP_KERNEL);
+   if (!dsc)
+   return -ENOMEM;


You can add struct drm_dsc_config to struct visionox_vtdr6130 instead
of allocating it.


+
+   /* Set DSC params */
+ 

Re: [PATCH] drm/msm/dpu: Drop encoder vsync_event

2023-08-01 Thread Dmitry Baryshkov

On 01/08/2023 23:18, Jessica Zhang wrote:

Drop vsync_event and vsync_event_work handlers as they are unnecessary.

Signed-off-by: Jessica Zhang 
---
  drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 65 +
  drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h   |  4 --
  2 files changed, 1 insertion(+), 68 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index f0a2a1dca741..d34e684a4178 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -152,7 +152,6 @@ enum dpu_enc_rc_states {
   * @crtc_frame_event_cb_data: callback handler private data
   * @frame_done_timeout_ms:frame done timeout in ms
   * @frame_done_timer: watchdog timer for frame done event
- * @vsync_event_timer: vsync timer
   * @disp_info:local copy of msm_display_info struct
   * @idle_pc_supported:indicate if idle power collaps is 
supported
   * @rc_lock:  resource control mutex lock to protect
@@ -160,7 +159,6 @@ enum dpu_enc_rc_states {
   * @rc_state: resource controller state
   * @delayed_off_work: delayed worker to schedule disabling of
   *clks and resources after IDLE_TIMEOUT time.
- * @vsync_event_work:  worker to handle vsync event for autorefresh
   * @topology:   topology of the display
   * @idle_timeout: idle timeout duration in milliseconds
   * @wide_bus_en:  wide bus is enabled on this interface
@@ -194,7 +192,6 @@ struct dpu_encoder_virt {
  
  	atomic_t frame_done_timeout_ms;

struct timer_list frame_done_timer;
-   struct timer_list vsync_event_timer;
  
  	struct msm_display_info disp_info;
  
@@ -202,7 +199,6 @@ struct dpu_encoder_virt {

struct mutex rc_lock;
enum dpu_enc_rc_states rc_state;
struct delayed_work delayed_off_work;
-   struct kthread_work vsync_event_work;
struct msm_display_topology topology;
  
  	u32 idle_timeout;

@@ -1770,49 +1766,6 @@ int dpu_encoder_vsync_time(struct drm_encoder *drm_enc, 
ktime_t *wakeup_time)
return 0;
  }
  
-static void dpu_encoder_vsync_event_handler(struct timer_list *t)

-{
-   struct dpu_encoder_virt *dpu_enc = from_timer(dpu_enc, t,
-   vsync_event_timer);
-   struct drm_encoder *drm_enc = _enc->base;
-   struct msm_drm_private *priv;
-   struct msm_drm_thread *event_thread;
-
-   if (!drm_enc->dev || !drm_enc->crtc) {
-   DPU_ERROR("invalid parameters\n");
-   return;
-   }
-
-   priv = drm_enc->dev->dev_private;
-
-   if (drm_enc->crtc->index >= ARRAY_SIZE(priv->event_thread)) {
-   DPU_ERROR("invalid crtc index\n");
-   return;
-   }
-   event_thread = >event_thread[drm_enc->crtc->index];
-   if (!event_thread) {
-   DPU_ERROR("event_thread not found for crtc:%d\n",
-   drm_enc->crtc->index);
-   return;
-   }
-
-   del_timer(_enc->vsync_event_timer);
-}
-
-static void dpu_encoder_vsync_event_work_handler(struct kthread_work *work)
-{
-   struct dpu_encoder_virt *dpu_enc = container_of(work,
-   struct dpu_encoder_virt, vsync_event_work);
-   ktime_t wakeup_time;
-
-   if (dpu_encoder_vsync_time(_enc->base, _time))
-   return;
-
-   trace_dpu_enc_vsync_event_work(DRMID(_enc->base), wakeup_time);
-   mod_timer(_enc->vsync_event_timer,
-   nsecs_to_jiffies(ktime_to_ns(wakeup_time)));
-}
-
  static u32
  dpu_encoder_dsc_initial_line_calc(struct drm_dsc_config *dsc,
  u32 enc_ip_width)
@@ -1972,7 +1925,6 @@ void dpu_encoder_kickoff(struct drm_encoder *drm_enc)
  {
struct dpu_encoder_virt *dpu_enc;
struct dpu_encoder_phys *phys;
-   ktime_t wakeup_time;
unsigned long timeout_ms;
unsigned int i;
  
@@ -1998,14 +1950,6 @@ void dpu_encoder_kickoff(struct drm_encoder *drm_enc)

phys->ops.handle_post_kickoff(phys);
}
  
-	if (dpu_enc->disp_info.intf_type == INTF_DSI &&

-   !dpu_encoder_vsync_time(drm_enc, _time)) {
-   trace_dpu_enc_early_kickoff(DRMID(drm_enc),
-   ktime_to_ms(wakeup_time));
-   mod_timer(_enc->vsync_event_timer,
-   nsecs_to_jiffies(ktime_to_ns(wakeup_time)));
-   }
-
DPU_ATRACE_END("encoder_kickoff");
  }
  
@@ -2439,11 +2383,7 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,

timer_setup(_enc->frame_done_timer,
dpu_encoder_frame_done_timeout, 0);
  
-	if (disp_info->intf_type == INTF_DSI)

-   timer_setup(_enc->vsync_event_timer,
-   

Re: [PATCH 1/2] drm/exec: use unique instead of local label

2023-08-01 Thread Nick Desaulniers
On Mon, Jul 31, 2023 at 5:36 AM Christian König
 wrote:
>
> GCC forbids to jump to labels in loop conditions and a new clang
> check stumbled over this.
>
> So instead using a local label inside the loop condition use an
> unique label outside of it.
>
> Fixes: commit 09593216bff1 ("drm: execution context for GEM buffers v7")
> Link: https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
> Link: https://github.com/ClangBuiltLinux/linux/issues/1890
> Link: 
> https://github.com/llvm/llvm-project/commit/20219106060208f0c2f5d096eb3aed7b712f5067
> Reported-by: Nathan Chancellor 
> Reported-by: Naresh Kamboju 
> CC: Boris Brezillon 
> Signed-off-by: Christian König 

Works for me; thanks for the patch!
Reviewed-by: Nick Desaulniers 

I suspect it's possible to change the indirect goto into a direct goto
with some further refactoring (macros can take block statements; if
drm_exec_until_all_locked accepted a block statement arg then you
could introduce a new scope, and a new local label to that scope, then
just use direct goto), but this will probably apply cleaner. (oh, is
09593216bff1 only in next at the moment? The AuthorDate threw me.)

There are some curious cases where __attribute__((cleanup())) doesn't
mesh well with indirect gotos.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37722

May not ever be a problem here...

> ---
>  include/drm/drm_exec.h | 14 +++---
>  1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/include/drm/drm_exec.h b/include/drm/drm_exec.h
> index 73205afec162..e0462361adf9 100644
> --- a/include/drm/drm_exec.h
> +++ b/include/drm/drm_exec.h
> @@ -3,6 +3,7 @@
>  #ifndef __DRM_EXEC_H__
>  #define __DRM_EXEC_H__
>
> +#include 

If you wanted to be more specific (if this addition is due to
__PASTE), then `compiler_types.h` is more precise.

>  #include 
>
>  #define DRM_EXEC_INTERRUPTIBLE_WAITBIT(0)
> @@ -74,13 +75,12 @@ struct drm_exec {
>   * Since labels can't be defined local to the loops body we use a jump 
> pointer
>   * to make sure that the retry is only used from within the loops body.
>   */
> -#define drm_exec_until_all_locked(exec)\
> -   for (void *__drm_exec_retry_ptr; ({ \
> -   __label__ __drm_exec_retry; \
> -__drm_exec_retry:  \
> -   __drm_exec_retry_ptr = &&__drm_exec_retry;  \
> -   (void)__drm_exec_retry_ptr; \
> -   drm_exec_cleanup(exec); \
> +#define drm_exec_until_all_locked(exec)  
>   \
> +__PASTE(__drm_exec_, __LINE__):  
>   \
> +   for (void *__drm_exec_retry_ptr; ({ \
> +   __drm_exec_retry_ptr = &&__PASTE(__drm_exec_, __LINE__);\
> +   (void)__drm_exec_retry_ptr; \
> +   drm_exec_cleanup(exec); \
> });)
>
>  /**
> --
> 2.34.1
>


-- 
Thanks,
~Nick Desaulniers


  1   2   3   4   >