lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CADnq5_PwcJ2J9Enc2GFYHPgyX4DO_+gHf=8fDvDz1eVmq6+L6w@mail.gmail.com>
Date: Mon, 3 Nov 2025 16:29:45 -0500
From: Alex Deucher <alexdeucher@...il.com>
To: "Yo-Jung Leo Lin (AMD)" <Leo.Lin@....com>
Cc: Alex Deucher <alexander.deucher@....com>, 
	Christian König <christian.koenig@....com>, 
	David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>, 
	Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>, Maxime Ripard <mripard@...nel.org>, 
	Thomas Zimmermann <tzimmermann@...e.de>, Jonathan Corbet <corbet@....net>, amd-gfx@...ts.freedesktop.org, 
	dri-devel@...ts.freedesktop.org, linux-kernel@...r.kernel.org, 
	linux-doc@...r.kernel.org, anson.tsao@....com, superm1@...nel.org
Subject: Re: [PATCH 2/5] drm/amdgpu: add helper to read UMA carveout info

On Mon, Nov 3, 2025 at 4:22 PM Alex Deucher <alexdeucher@...il.com> wrote:
>
> On Mon, Nov 3, 2025 at 2:54 AM Yo-Jung Leo Lin (AMD) <Leo.Lin@....com> wrote:
> >
> > Currently, the available UMA allocation configs in the integrated system
> > information table have not been parsed. Add a helper function to retrieve
> > and store these configs.
> >
> > Co-developed-by: Mario Limonciello (AMD) <superm1@...nel.org>
> > Signed-off-by: Mario Limonciello (AMD) <superm1@...nel.org>
> > Signed-off-by: Yo-Jung Leo Lin (AMD) <Leo.Lin@....com>
> > ---
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c     | 32 ++++++++--
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 75 ++++++++++++++++++++++++
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h |  1 +
> >  drivers/gpu/drm/amd/amdgpu/atom.h                |  4 ++
> >  4 files changed, 107 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> > index 763f2b8dcf13..58cc3bc9d42d 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> > @@ -28,6 +28,7 @@
> >  #include "amdgpu.h"
> >  #include "amdgpu_atombios.h"
> >  #include "amdgpu_atomfirmware.h"
> > +#include "atomfirmware.h"
> >  #include "amdgpu_i2c.h"
> >  #include "amdgpu_display.h"
> >
> > @@ -1877,6 +1878,10 @@ void amdgpu_atombios_fini(struct amdgpu_device *adev)
> >         if (adev->mode_info.atom_context) {
> >                 kfree(adev->mode_info.atom_context->scratch);
> >                 kfree(adev->mode_info.atom_context->iio);
> > +               kfree(adev->mode_info.atom_context->uma_carveout_options);
> > +               adev->mode_info.atom_context->uma_carveout_options = NULL;
> > +               adev->mode_info.atom_context->uma_carveout_nr = 0;
> > +               adev->mode_info.atom_context->uma_carveout_index = 0;
> >         }
> >         kfree(adev->mode_info.atom_context);
> >         adev->mode_info.atom_context = NULL;
> > @@ -1891,16 +1896,19 @@ void amdgpu_atombios_fini(struct amdgpu_device *adev)
> >   *
> >   * Initializes the driver info and register access callbacks for the
> >   * ATOM interpreter (r4xx+).
> > - * Returns 0 on sucess, -ENOMEM on failure.
> > + * Returns 0 on success, -ENOMEM on memory allocation error, or -EINVAL on ATOM ROM parsing error
> >   * Called at driver startup.
> >   */
> >  int amdgpu_atombios_init(struct amdgpu_device *adev)
> >  {
> >         struct card_info *atom_card_info =
> >             kzalloc(sizeof(struct card_info), GFP_KERNEL);
> > +       int rc;
> >
> > -       if (!atom_card_info)
> > -               return -ENOMEM;
> > +       if (!atom_card_info) {
> > +               rc = -ENOMEM;
> > +               goto out_card_info;
> > +       }
> >
> >         adev->mode_info.atom_card_info = atom_card_info;
> >         atom_card_info->dev = adev_to_drm(adev);
> > @@ -1913,8 +1921,16 @@ int amdgpu_atombios_init(struct amdgpu_device *adev)
> >
> >         adev->mode_info.atom_context = amdgpu_atom_parse(atom_card_info, adev->bios);
> >         if (!adev->mode_info.atom_context) {
> > -               amdgpu_atombios_fini(adev);
> > -               return -ENOMEM;
> > +               rc = -ENOMEM;
> > +               goto out_atom_ctx;
> > +       }
> > +
> > +       rc = amdgpu_atomfirmware_get_uma_carveout_info(adev);
> > +
> > +       if (rc) {
> > +               drm_dbg(adev_to_drm(adev), "Failed to get UMA carveout info: %d\n", rc);
> > +               if (rc != -ENODEV)
> > +                       goto out_uma_info;
> >         }
> >
> >         mutex_init(&adev->mode_info.atom_context->mutex);
> > @@ -1930,6 +1946,12 @@ int amdgpu_atombios_init(struct amdgpu_device *adev)
> >         }
> >
> >         return 0;
> > +
> > +out_uma_info:
> > +out_atom_ctx:
> > +       amdgpu_atombios_fini(adev);
> > +out_card_info:
> > +       return rc;
> >  }
> >
> >  int amdgpu_atombios_get_data_table(struct amdgpu_device *adev,
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> > index 636385c80f64..698416e84f1f 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> > @@ -21,12 +21,14 @@
> >   *
> >   */
> >
> > +#include "linux/slab.h"
> >  #include <drm/amdgpu_drm.h>
> >  #include "amdgpu.h"
> >  #include "atomfirmware.h"
> >  #include "amdgpu_atomfirmware.h"
> >  #include "atom.h"
> >  #include "atombios.h"
> > +#include "atomfirmware.h"
> >  #include "soc15_hw_ip.h"
> >
> >  union firmware_info {
> > @@ -296,6 +298,79 @@ static int convert_atom_mem_type_to_vram_type(struct amdgpu_device *adev,
> >         return vram_type;
> >  }
> >
> > +static int __amdgpu_atomfirmware_get_uma_carveout_info_v2_3(struct amdgpu_device *adev,
> > +                                                           union igp_info *igp_info)
> > +{
> > +       struct atom_context *ctx = adev->mode_info.atom_context;
> > +       struct uma_carveout_option *opts;
> > +
> > +       opts = kzalloc(sizeof(igp_info->v23.UMASizeControlOption), GFP_KERNEL);
> > +
> > +       if (!opts)
> > +               goto out_mem;
> > +
> > +       memcpy(opts, igp_info->v23.UMASizeControlOption,
> > +               sizeof(igp_info->v23.UMASizeControlOption));
> > +
> > +       ctx->uma_carveout_index = igp_info->v23.UMACarveoutIndex;
> > +       ctx->uma_carveout_nr = igp_info->v23.UMACarveoutIndexMax;
> > +       ctx->uma_carveout_options = opts;
> > +
> > +       return 0;
> > +
> > +out_mem:
> > +       return -ENOMEM;
> > +}
> > +
> > +static int __amdgpu_atomfirmware_get_uma_carveout_info(struct amdgpu_device *adev,
> > +                                                      u8 frev, u8 crev,
> > +                                                      union igp_info *igp_info)
> > +{
> > +       switch (frev) {
> > +       case 2:
> > +               switch (crev) {
> > +               case 3:
> > +                       return __amdgpu_atomfirmware_get_uma_carveout_info_v2_3(adev, igp_info);
> > +               break;
> > +               default:
> > +                       break;
> > +               }
> > +               break;
> > +       default:
> > +               break;
> > +       }
> > +       return -ENODEV;
> > +}
>
> I think this function can be moved into
> amdgpu_atomfirmware_get_uma_carveout_info().
>
> > +
> > +int amdgpu_atomfirmware_get_uma_carveout_info(struct amdgpu_device *adev)
> > +{
> > +       struct amdgpu_mode_info *mode_info = &adev->mode_info;
> > +       union igp_info *igp_info;
> > +       u16 data_offset, size;
> > +       u8 frev, crev;
> > +       int index;
> > +
> > +       if (!(adev->flags & AMD_IS_APU))
> > +               return -ENODEV;
> > +
> > +       if (!amdgpu_acpi_is_set_uma_allocation_size_supported())
> > +               return -ENODEV;
> > +
> > +       index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
> > +                                           integratedsysteminfo);
> > +
> > +       if (!amdgpu_atom_parse_data_header(mode_info->atom_context,
> > +                                         index, &size,
> > +                                         &frev, &crev, &data_offset)) {
> > +               return -EINVAL;
> > +       }
> > +
> > +       igp_info = (union igp_info *)
> > +                       (mode_info->atom_context->bios + data_offset);
> > +
> > +       return __amdgpu_atomfirmware_get_uma_carveout_info(adev, frev, crev, igp_info);
> > +}
> > +
> >  int
> >  amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
> >                                   int *vram_width, int *vram_type,
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
> > index 649b5530d8ae..fb3f34a36569 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
> > @@ -32,6 +32,7 @@ void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev);
> >  int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev);
> >  int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
> >         int *vram_width, int *vram_type, int *vram_vendor);
> > +int amdgpu_atomfirmware_get_uma_carveout_info(struct amdgpu_device *adev);
> >  int amdgpu_atomfirmware_get_clock_info(struct amdgpu_device *adev);
> >  int amdgpu_atomfirmware_get_gfx_info(struct amdgpu_device *adev);
> >  bool amdgpu_atomfirmware_mem_ecc_supported(struct amdgpu_device *adev);
> > diff --git a/drivers/gpu/drm/amd/amdgpu/atom.h b/drivers/gpu/drm/amd/amdgpu/atom.h
> > index 825ff28731f5..f07c612f0386 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/atom.h
> > +++ b/drivers/gpu/drm/amd/amdgpu/atom.h
> > @@ -153,6 +153,10 @@ struct atom_context {
> >         uint8_t vbios_ver_str[STRLEN_NORMAL];
> >         uint8_t date[STRLEN_NORMAL];
> >         uint8_t build_num[STRLEN_NORMAL];
> > +
> > +       uint8_t uma_carveout_index;
> > +       uint8_t uma_carveout_nr;
> > +       struct uma_carveout_option *uma_carveout_options;
>
> I don't think these really belong in the atom context.  They don't
> really have anything to do with atombios.  I think it makes more sense
> to do this in amdgpu_acpi_init() if atcs supports uma resizing.  If
> the atcs support is present, then call the atomfirmware function to
> parse the atom table and if all of that is ok, then register the sysfs
> interface.

Also, I think it would be better to abstract struct
uma_carveout_option in case the structure changes in future vbios
tables.

Alex

>
> Alex
>
>
> >  };
> >
> >  extern int amdgpu_atom_debug;
> >
> > --
> > 2.43.0
> >

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ