All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ben Skeggs <skeggsb@gmail.com>
To: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
Cc: David Airlie <airlied@redhat.com>,
	bskeggs@redhat.com, regressions@lists.linux.dev,
	dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org
Subject: Re: [Nouveau] [REGRESSION] GM20B probe fails after commit 2541626cfb79
Date: Wed, 18 Jan 2023 11:28:49 +1000	[thread overview]
Message-ID: <CACAvsv48vH6hbacQCN+yKP8ZcDjFMWciBt6U_Xv-LEYJHZ1q9g@mail.gmail.com> (raw)
In-Reply-To: <20230116122403.upk5ci4mbebw23m7@wslaptop>

On Mon, 16 Jan 2023 at 22:27, Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt> wrote:
>
> On Mon, Jan 16, 2023 at 07:45:05AM +1000, David Airlie wrote:
> > On Thu, Dec 29, 2022 at 12:58 AM Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt> wrote:
> > As a quick check can you try changing
> >
> > drivers/gpu/drm/nouveau/nvkm/core/firmware.c:nvkm_firmware_mem_target
> > from NVKM_MEM_TARGET_HOST to NVKM_MEM_TARGET_NCOH ?
>
> Hello!
>
> Applying this change breaks probing in a different way, with a
> bad PC=0x0. From a quick look at nvkm_falcon_load_dmem it looks like this
> could happen due to the .load_dmem() callback not being properly
> initialized. This is the kernel log I got:
In addition to Dave's change, can you try changing the
nvkm_falcon_load_dmem() call in gm20b_pmu_init() to:

nvkm_falcon_pio_wr(falcon, (u8 *)&args, 0, 0, DMEM, addr_args,
sizeof(args), 0, false);

Ben.

>
> [    2.010601] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
> [    2.019436] Mem abort info:
> [    2.022273]   ESR = 0x0000000086000005
> [    2.026066]   EC = 0x21: IABT (current EL), IL = 32 bits
> [    2.031429]   SET = 0, FnV = 0
> [    2.034528]   EA = 0, S1PTW = 0
> [    2.037694]   FSC = 0x05: level 1 translation fault
> [    2.042572] [0000000000000000] user address but active_mm is swapper
> [    2.048961] Internal error: Oops: 0000000086000005 [#1] SMP
> [    2.054529] Modules linked in:
> [    2.057582] CPU: 0 PID: 36 Comm: kworker/u8:1 Not tainted 6.2.0-rc3+ #2
> [    2.064190] Hardware name: Google Pixel C (DT)
> [    2.068628] Workqueue: events_unbound deferred_probe_work_func
> [    2.074463] pstate: 40000005 (nZcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [    2.081417] pc : 0x0
> [    2.083600] lr : nvkm_falcon_load_dmem+0x58/0x80
> [    2.088218] sp : ffffffc009ddb6f0
> [    2.091526] x29: ffffffc009ddb6f0 x28: ffffff808028a008 x27: ffffff8081e43c38
> [    2.098658] x26: 00000000000000ff x25: ffffff808028a0a0 x24: 0000000000000000
> [    2.105788] x23: ffffff8080c328f8 x22: 000000000000002c x21: 0000000000005fd4
> [    2.112917] x20: ffffffc009ddb76c x19: ffffff8080c328b8 x18: 0000000000000000
> [    2.120047] x17: 2e74696e695f646f x16: 6874656d5f77732f x15: 0000000000000000
> [    2.127176] x14: 0000000002f546c2 x13: 0000000000000000 x12: 00000000000001ce
> [    2.134306] x11: 0000000000000001 x10: 0000000000000a90 x9 : ffffffc009ddb600
> [    2.141436] x8 : ffffff80803d19f0 x7 : ffffff80bf971180 x6 : 00000000000001b9
> [    2.148565] x5 : 0000000000000000 x4 : 0000000000000000 x3 : 000000000000002c
> [    2.155693] x2 : 0000000000005fd4 x1 : ffffffc009ddb76c x0 : ffffff8080c328b8
> [    2.162822] Call trace:
> [    2.165264]  0x0
> [    2.167099]  gm20b_pmu_init+0x78/0xb4
> [    2.170762]  nvkm_pmu_init+0x20/0x34
> [    2.174334]  nvkm_subdev_init_+0x60/0x12c
> [    2.178339]  nvkm_subdev_init+0x60/0xa0
> [    2.182171]  nvkm_device_init+0x14c/0x2a0
> [    2.186178]  nvkm_udevice_init+0x60/0x9c
> [    2.190097]  nvkm_object_init+0x48/0x1b0
> [    2.194013]  nvkm_ioctl_new+0x168/0x254
> [    2.197843]  nvkm_ioctl+0xd0/0x220
> [    2.201239]  nvkm_client_ioctl+0x10/0x1c
> [    2.205160]  nvif_object_ctor+0xf4/0x22c
> [    2.209079]  nvif_device_ctor+0x28/0x70
> [    2.212910]  nouveau_cli_init+0x150/0x590
> [    2.216916]  nouveau_drm_device_init+0x60/0x2a0
> [    2.221442]  nouveau_platform_device_create+0x90/0xd0
> [    2.226489]  nouveau_platform_probe+0x3c/0x9c
> [    2.230841]  platform_probe+0x68/0xc0
> [    2.234500]  really_probe+0xbc/0x2dc
> [    2.238070]  __driver_probe_device+0x78/0xe0
> [    2.242334]  driver_probe_device+0xd8/0x160
> [    2.246511]  __device_attach_driver+0xb8/0x134
> [    2.250948]  bus_for_each_drv+0x78/0xd0
> [    2.254782]  __device_attach+0x9c/0x1a0
> [    2.258612]  device_initial_probe+0x14/0x20
> [    2.262789]  bus_probe_device+0x98/0xa0
> [    2.266619]  deferred_probe_work_func+0x88/0xc0
> [    2.271142]  process_one_work+0x204/0x40c
> [    2.275150]  worker_thread+0x230/0x450
> [    2.278894]  kthread+0xc8/0xcc
> [    2.281946]  ret_from_fork+0x10/0x20
> [    2.285525] Code: bad PC value
> [    2.288576] ---[ end trace 0000000000000000 ]---
>
> Diogo

WARNING: multiple messages have this Message-ID (diff)
From: Ben Skeggs <skeggsb@gmail.com>
To: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
Cc: David Airlie <airlied@redhat.com>,
	bskeggs@redhat.com, regressions@lists.linux.dev,
	dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org
Subject: Re: [REGRESSION] GM20B probe fails after commit 2541626cfb79
Date: Wed, 18 Jan 2023 11:28:49 +1000	[thread overview]
Message-ID: <CACAvsv48vH6hbacQCN+yKP8ZcDjFMWciBt6U_Xv-LEYJHZ1q9g@mail.gmail.com> (raw)
In-Reply-To: <20230116122403.upk5ci4mbebw23m7@wslaptop>

On Mon, 16 Jan 2023 at 22:27, Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt> wrote:
>
> On Mon, Jan 16, 2023 at 07:45:05AM +1000, David Airlie wrote:
> > On Thu, Dec 29, 2022 at 12:58 AM Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt> wrote:
> > As a quick check can you try changing
> >
> > drivers/gpu/drm/nouveau/nvkm/core/firmware.c:nvkm_firmware_mem_target
> > from NVKM_MEM_TARGET_HOST to NVKM_MEM_TARGET_NCOH ?
>
> Hello!
>
> Applying this change breaks probing in a different way, with a
> bad PC=0x0. From a quick look at nvkm_falcon_load_dmem it looks like this
> could happen due to the .load_dmem() callback not being properly
> initialized. This is the kernel log I got:
In addition to Dave's change, can you try changing the
nvkm_falcon_load_dmem() call in gm20b_pmu_init() to:

nvkm_falcon_pio_wr(falcon, (u8 *)&args, 0, 0, DMEM, addr_args,
sizeof(args), 0, false);

Ben.

>
> [    2.010601] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
> [    2.019436] Mem abort info:
> [    2.022273]   ESR = 0x0000000086000005
> [    2.026066]   EC = 0x21: IABT (current EL), IL = 32 bits
> [    2.031429]   SET = 0, FnV = 0
> [    2.034528]   EA = 0, S1PTW = 0
> [    2.037694]   FSC = 0x05: level 1 translation fault
> [    2.042572] [0000000000000000] user address but active_mm is swapper
> [    2.048961] Internal error: Oops: 0000000086000005 [#1] SMP
> [    2.054529] Modules linked in:
> [    2.057582] CPU: 0 PID: 36 Comm: kworker/u8:1 Not tainted 6.2.0-rc3+ #2
> [    2.064190] Hardware name: Google Pixel C (DT)
> [    2.068628] Workqueue: events_unbound deferred_probe_work_func
> [    2.074463] pstate: 40000005 (nZcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [    2.081417] pc : 0x0
> [    2.083600] lr : nvkm_falcon_load_dmem+0x58/0x80
> [    2.088218] sp : ffffffc009ddb6f0
> [    2.091526] x29: ffffffc009ddb6f0 x28: ffffff808028a008 x27: ffffff8081e43c38
> [    2.098658] x26: 00000000000000ff x25: ffffff808028a0a0 x24: 0000000000000000
> [    2.105788] x23: ffffff8080c328f8 x22: 000000000000002c x21: 0000000000005fd4
> [    2.112917] x20: ffffffc009ddb76c x19: ffffff8080c328b8 x18: 0000000000000000
> [    2.120047] x17: 2e74696e695f646f x16: 6874656d5f77732f x15: 0000000000000000
> [    2.127176] x14: 0000000002f546c2 x13: 0000000000000000 x12: 00000000000001ce
> [    2.134306] x11: 0000000000000001 x10: 0000000000000a90 x9 : ffffffc009ddb600
> [    2.141436] x8 : ffffff80803d19f0 x7 : ffffff80bf971180 x6 : 00000000000001b9
> [    2.148565] x5 : 0000000000000000 x4 : 0000000000000000 x3 : 000000000000002c
> [    2.155693] x2 : 0000000000005fd4 x1 : ffffffc009ddb76c x0 : ffffff8080c328b8
> [    2.162822] Call trace:
> [    2.165264]  0x0
> [    2.167099]  gm20b_pmu_init+0x78/0xb4
> [    2.170762]  nvkm_pmu_init+0x20/0x34
> [    2.174334]  nvkm_subdev_init_+0x60/0x12c
> [    2.178339]  nvkm_subdev_init+0x60/0xa0
> [    2.182171]  nvkm_device_init+0x14c/0x2a0
> [    2.186178]  nvkm_udevice_init+0x60/0x9c
> [    2.190097]  nvkm_object_init+0x48/0x1b0
> [    2.194013]  nvkm_ioctl_new+0x168/0x254
> [    2.197843]  nvkm_ioctl+0xd0/0x220
> [    2.201239]  nvkm_client_ioctl+0x10/0x1c
> [    2.205160]  nvif_object_ctor+0xf4/0x22c
> [    2.209079]  nvif_device_ctor+0x28/0x70
> [    2.212910]  nouveau_cli_init+0x150/0x590
> [    2.216916]  nouveau_drm_device_init+0x60/0x2a0
> [    2.221442]  nouveau_platform_device_create+0x90/0xd0
> [    2.226489]  nouveau_platform_probe+0x3c/0x9c
> [    2.230841]  platform_probe+0x68/0xc0
> [    2.234500]  really_probe+0xbc/0x2dc
> [    2.238070]  __driver_probe_device+0x78/0xe0
> [    2.242334]  driver_probe_device+0xd8/0x160
> [    2.246511]  __device_attach_driver+0xb8/0x134
> [    2.250948]  bus_for_each_drv+0x78/0xd0
> [    2.254782]  __device_attach+0x9c/0x1a0
> [    2.258612]  device_initial_probe+0x14/0x20
> [    2.262789]  bus_probe_device+0x98/0xa0
> [    2.266619]  deferred_probe_work_func+0x88/0xc0
> [    2.271142]  process_one_work+0x204/0x40c
> [    2.275150]  worker_thread+0x230/0x450
> [    2.278894]  kthread+0xc8/0xcc
> [    2.281946]  ret_from_fork+0x10/0x20
> [    2.285525] Code: bad PC value
> [    2.288576] ---[ end trace 0000000000000000 ]---
>
> Diogo

WARNING: multiple messages have this Message-ID (diff)
From: Ben Skeggs <skeggsb@gmail.com>
To: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
Cc: David Airlie <airlied@redhat.com>,
	nouveau@lists.freedesktop.org,  regressions@lists.linux.dev,
	dri-devel@lists.freedesktop.org,  bskeggs@redhat.com
Subject: Re: [REGRESSION] GM20B probe fails after commit 2541626cfb79
Date: Wed, 18 Jan 2023 11:28:49 +1000	[thread overview]
Message-ID: <CACAvsv48vH6hbacQCN+yKP8ZcDjFMWciBt6U_Xv-LEYJHZ1q9g@mail.gmail.com> (raw)
In-Reply-To: <20230116122403.upk5ci4mbebw23m7@wslaptop>

On Mon, 16 Jan 2023 at 22:27, Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt> wrote:
>
> On Mon, Jan 16, 2023 at 07:45:05AM +1000, David Airlie wrote:
> > On Thu, Dec 29, 2022 at 12:58 AM Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt> wrote:
> > As a quick check can you try changing
> >
> > drivers/gpu/drm/nouveau/nvkm/core/firmware.c:nvkm_firmware_mem_target
> > from NVKM_MEM_TARGET_HOST to NVKM_MEM_TARGET_NCOH ?
>
> Hello!
>
> Applying this change breaks probing in a different way, with a
> bad PC=0x0. From a quick look at nvkm_falcon_load_dmem it looks like this
> could happen due to the .load_dmem() callback not being properly
> initialized. This is the kernel log I got:
In addition to Dave's change, can you try changing the
nvkm_falcon_load_dmem() call in gm20b_pmu_init() to:

nvkm_falcon_pio_wr(falcon, (u8 *)&args, 0, 0, DMEM, addr_args,
sizeof(args), 0, false);

Ben.

>
> [    2.010601] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
> [    2.019436] Mem abort info:
> [    2.022273]   ESR = 0x0000000086000005
> [    2.026066]   EC = 0x21: IABT (current EL), IL = 32 bits
> [    2.031429]   SET = 0, FnV = 0
> [    2.034528]   EA = 0, S1PTW = 0
> [    2.037694]   FSC = 0x05: level 1 translation fault
> [    2.042572] [0000000000000000] user address but active_mm is swapper
> [    2.048961] Internal error: Oops: 0000000086000005 [#1] SMP
> [    2.054529] Modules linked in:
> [    2.057582] CPU: 0 PID: 36 Comm: kworker/u8:1 Not tainted 6.2.0-rc3+ #2
> [    2.064190] Hardware name: Google Pixel C (DT)
> [    2.068628] Workqueue: events_unbound deferred_probe_work_func
> [    2.074463] pstate: 40000005 (nZcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [    2.081417] pc : 0x0
> [    2.083600] lr : nvkm_falcon_load_dmem+0x58/0x80
> [    2.088218] sp : ffffffc009ddb6f0
> [    2.091526] x29: ffffffc009ddb6f0 x28: ffffff808028a008 x27: ffffff8081e43c38
> [    2.098658] x26: 00000000000000ff x25: ffffff808028a0a0 x24: 0000000000000000
> [    2.105788] x23: ffffff8080c328f8 x22: 000000000000002c x21: 0000000000005fd4
> [    2.112917] x20: ffffffc009ddb76c x19: ffffff8080c328b8 x18: 0000000000000000
> [    2.120047] x17: 2e74696e695f646f x16: 6874656d5f77732f x15: 0000000000000000
> [    2.127176] x14: 0000000002f546c2 x13: 0000000000000000 x12: 00000000000001ce
> [    2.134306] x11: 0000000000000001 x10: 0000000000000a90 x9 : ffffffc009ddb600
> [    2.141436] x8 : ffffff80803d19f0 x7 : ffffff80bf971180 x6 : 00000000000001b9
> [    2.148565] x5 : 0000000000000000 x4 : 0000000000000000 x3 : 000000000000002c
> [    2.155693] x2 : 0000000000005fd4 x1 : ffffffc009ddb76c x0 : ffffff8080c328b8
> [    2.162822] Call trace:
> [    2.165264]  0x0
> [    2.167099]  gm20b_pmu_init+0x78/0xb4
> [    2.170762]  nvkm_pmu_init+0x20/0x34
> [    2.174334]  nvkm_subdev_init_+0x60/0x12c
> [    2.178339]  nvkm_subdev_init+0x60/0xa0
> [    2.182171]  nvkm_device_init+0x14c/0x2a0
> [    2.186178]  nvkm_udevice_init+0x60/0x9c
> [    2.190097]  nvkm_object_init+0x48/0x1b0
> [    2.194013]  nvkm_ioctl_new+0x168/0x254
> [    2.197843]  nvkm_ioctl+0xd0/0x220
> [    2.201239]  nvkm_client_ioctl+0x10/0x1c
> [    2.205160]  nvif_object_ctor+0xf4/0x22c
> [    2.209079]  nvif_device_ctor+0x28/0x70
> [    2.212910]  nouveau_cli_init+0x150/0x590
> [    2.216916]  nouveau_drm_device_init+0x60/0x2a0
> [    2.221442]  nouveau_platform_device_create+0x90/0xd0
> [    2.226489]  nouveau_platform_probe+0x3c/0x9c
> [    2.230841]  platform_probe+0x68/0xc0
> [    2.234500]  really_probe+0xbc/0x2dc
> [    2.238070]  __driver_probe_device+0x78/0xe0
> [    2.242334]  driver_probe_device+0xd8/0x160
> [    2.246511]  __device_attach_driver+0xb8/0x134
> [    2.250948]  bus_for_each_drv+0x78/0xd0
> [    2.254782]  __device_attach+0x9c/0x1a0
> [    2.258612]  device_initial_probe+0x14/0x20
> [    2.262789]  bus_probe_device+0x98/0xa0
> [    2.266619]  deferred_probe_work_func+0x88/0xc0
> [    2.271142]  process_one_work+0x204/0x40c
> [    2.275150]  worker_thread+0x230/0x450
> [    2.278894]  kthread+0xc8/0xcc
> [    2.281946]  ret_from_fork+0x10/0x20
> [    2.285525] Code: bad PC value
> [    2.288576] ---[ end trace 0000000000000000 ]---
>
> Diogo

  reply	other threads:[~2023-01-18  1:29 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-28 14:49 [REGRESSION] GM20B probe fails after commit 2541626cfb79 Diogo Ivo
2022-12-28 14:49 ` [Nouveau] " Diogo Ivo
2022-12-28 14:49 ` Diogo Ivo
2023-01-05 12:28 ` Thorsten Leemhuis
2023-01-05 12:28   ` [Nouveau] " Thorsten Leemhuis
2023-01-05 12:28   ` Thorsten Leemhuis
2023-01-13 13:19   ` Linux kernel regression tracking (Thorsten Leemhuis)
2023-01-13 13:19     ` Linux kernel regression tracking (Thorsten Leemhuis)
2023-01-13 13:19     ` [Nouveau] " Linux kernel regression tracking (Thorsten Leemhuis)
2023-01-14  3:27     ` Karol Herbst
2023-01-14  3:27       ` Karol Herbst
2023-01-14  3:27       ` Karol Herbst
2023-01-14 16:03       ` Diogo Ivo
2023-01-14 16:03         ` [Nouveau] " Diogo Ivo
2023-01-14 16:03         ` Diogo Ivo
2023-01-14 18:56         ` Karol Herbst
2023-01-14 18:56           ` Karol Herbst
2023-01-14 18:56           ` [Nouveau] " Karol Herbst
2023-01-14 15:58     ` Diogo Ivo
2023-01-14 15:58       ` [Nouveau] " Diogo Ivo
2023-01-14 15:58       ` Diogo Ivo
2023-02-03  9:13   ` Linux kernel regression tracking (#update)
2023-02-03  9:13     ` Linux kernel regression tracking (#update)
2023-02-03  9:13     ` [Nouveau] " Linux kernel regression tracking (#update)
2023-01-15 21:45 ` David Airlie
2023-01-15 21:45   ` David Airlie
2023-01-15 21:45   ` [Nouveau] " David Airlie
2023-01-16 12:24   ` Diogo Ivo
2023-01-16 12:24     ` [Nouveau] " Diogo Ivo
2023-01-16 12:24     ` Diogo Ivo
2023-01-18  1:28     ` Ben Skeggs [this message]
2023-01-18  1:28       ` Ben Skeggs
2023-01-18  1:28       ` Ben Skeggs
2023-01-18  8:42       ` [Nouveau] " Nicolas Chauvet
2023-01-18  8:42         ` Nicolas Chauvet
2023-01-20 11:34       ` Diogo Ivo
2023-01-20 11:34         ` [Nouveau] " Diogo Ivo
2023-01-20 11:34         ` Diogo Ivo
2023-01-27  6:00         ` Ben Skeggs
2023-01-27  6:00           ` Ben Skeggs
2023-01-27  6:00           ` [Nouveau] " Ben Skeggs
2023-01-27  9:03           ` Nicolas Chauvet
2023-01-27  9:03             ` Nicolas Chauvet
2023-01-27  9:03             ` [Nouveau] " Nicolas Chauvet
2023-01-27 10:48             ` Diogo Ivo
2023-01-27 10:48               ` [Nouveau] " Diogo Ivo
2023-01-27 10:39           ` Diogo Ivo
2023-01-27 10:39             ` [Nouveau] " Diogo Ivo
2023-01-27 10:39             ` Diogo Ivo
2023-01-29 22:36             ` Ben Skeggs
2023-01-29 22:36               ` Ben Skeggs
2023-01-29 22:36               ` [Nouveau] " Ben Skeggs
2023-01-30 13:54               ` Diogo Ivo
2023-01-30 13:54                 ` [Nouveau] " Diogo Ivo
2023-01-30 13:54                 ` Diogo Ivo
2023-01-30 16:05               ` Nicolas Chauvet
2023-01-30 16:05                 ` Nicolas Chauvet
2023-01-30 16:05                 ` [Nouveau] " Nicolas Chauvet
2023-01-17 15:55   ` Nicolas Chauvet
2023-01-17 15:55     ` Nicolas Chauvet

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CACAvsv48vH6hbacQCN+yKP8ZcDjFMWciBt6U_Xv-LEYJHZ1q9g@mail.gmail.com \
    --to=skeggsb@gmail.com \
    --cc=airlied@redhat.com \
    --cc=bskeggs@redhat.com \
    --cc=diogo.ivo@tecnico.ulisboa.pt \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=nouveau@lists.freedesktop.org \
    --cc=regressions@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.