[Intel-gfx] [PATCH] drm/i915: Refactor dma mask usage to a common helper
Ruhl, Michael J
michael.j.ruhl at intel.com
Fri Apr 17 17:14:24 UTC 2020
>-----Original Message-----
>From: Chris Wilson <chris at chris-wilson.co.uk>
>Sent: Friday, April 17, 2020 12:17 PM
>To: Ruhl, Michael J <michael.j.ruhl at intel.com>; intel-
>gfx at lists.freedesktop.org
>Subject: Re: [Intel-gfx] [PATCH] drm/i915: Refactor dma mask usage to a
>common helper
>
>Quoting Ruhl, Michael J (2020-04-17 17:05:07)
>> >-----Original Message-----
>> >From: Chris Wilson <chris at chris-wilson.co.uk>
>> >Sent: Friday, April 17, 2020 11:42 AM
>> >To: Ruhl, Michael J <michael.j.ruhl at intel.com>; intel-
>> >gfx at lists.freedesktop.org
>> >Subject: Re: [Intel-gfx] [PATCH] drm/i915: Refactor dma mask usage to a
>> >common helper
>> >
>> >Quoting Michael J. Ruhl (2020-04-17 16:22:44)
>> >> DMA_MASK bit values are different for different generations.
>> >>
>> >> This will become more difficult to manage over time with the open
>> >> coded usage of different versions of the device.
>> >>
>> >> Fix by:
>> >> adding dma_mask_size to the device info configuration,
>> >> updating open code call sequence to the latest interface,
>> >> refactoring into a common function for setting the dma_mask
>> >>
>> >> Note: GEN(5) and down is also set in intel_gmch_probe().
>> >>
>> >> Signed-off-by: Michael J. Ruhl <michael.j.ruhl at intel.com>
>> >> cc: Brian Welty <brian.welty at intel.com>
>> >> cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>> >> ---
>> >> drivers/gpu/drm/i915/gt/intel_ggtt.c | 15 --------------
>> >> drivers/gpu/drm/i915/i915_drv.c | 25
>++++++++++++++++++++++++
>> >> drivers/gpu/drm/i915/i915_pci.c | 14 +++++++++++++
>> >> drivers/gpu/drm/i915/intel_device_info.c | 1 +
>> >> drivers/gpu/drm/i915/intel_device_info.h | 2 ++
>> >> 5 files changed, 42 insertions(+), 15 deletions(-)
>> >>
>> >> diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt.c
>> >b/drivers/gpu/drm/i915/gt/intel_ggtt.c
>> >> index eebd1190506f..66165b10256e 100644
>> >> --- a/drivers/gpu/drm/i915/gt/intel_ggtt.c
>> >> +++ b/drivers/gpu/drm/i915/gt/intel_ggtt.c
>> >> @@ -840,7 +840,6 @@ static int gen8_gmch_probe(struct i915_ggtt
>*ggtt)
>> >> struct pci_dev *pdev = i915->drm.pdev;
>> >> unsigned int size;
>> >> u16 snb_gmch_ctl;
>> >> - int err;
>> >>
>> >> /* TODO: We're not aware of mappable constraints on gen8 yet */
>> >> if (!IS_DGFX(i915)) {
>> >> @@ -848,13 +847,6 @@ static int gen8_gmch_probe(struct i915_ggtt
>*ggtt)
>> >> ggtt->mappable_end = resource_size(&ggtt->gmadr);
>> >> }
>> >>
>> >> - err = pci_set_dma_mask(pdev, DMA_BIT_MASK(39));
>> >> - if (!err)
>> >> - err = pci_set_consistent_dma_mask(pdev,
>DMA_BIT_MASK(39));
>> >> - if (err)
>> >> - drm_err(&i915->drm,
>> >> - "Can't set DMA mask/consistent mask (%d)\n", err);
>> >> -
>> >> pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
>> >> if (IS_CHERRYVIEW(i915))
>> >> size = chv_get_total_gtt_size(snb_gmch_ctl);
>> >> @@ -990,7 +982,6 @@ static int gen6_gmch_probe(struct i915_ggtt
>*ggtt)
>> >> struct pci_dev *pdev = i915->drm.pdev;
>> >> unsigned int size;
>> >> u16 snb_gmch_ctl;
>> >> - int err;
>> >>
>> >> ggtt->gmadr = pci_resource(pdev, 2);
>> >> ggtt->mappable_end = resource_size(&ggtt->gmadr);
>> >> @@ -1005,12 +996,6 @@ static int gen6_gmch_probe(struct i915_ggtt
>*ggtt)
>> >> return -ENXIO;
>> >> }
>> >>
>> >> - err = pci_set_dma_mask(pdev, DMA_BIT_MASK(40));
>> >> - if (!err)
>> >> - err = pci_set_consistent_dma_mask(pdev,
>DMA_BIT_MASK(40));
>> >> - if (err)
>> >> - drm_err(&i915->drm,
>> >> - "Can't set DMA mask/consistent mask (%d)\n", err);
>> >> pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
>> >>
>> >> size = gen6_get_total_gtt_size(snb_gmch_ctl);
>> >> diff --git a/drivers/gpu/drm/i915/i915_drv.c
>> >b/drivers/gpu/drm/i915/i915_drv.c
>> >> index 641f5e03b661..3c5654b5d321 100644
>> >> --- a/drivers/gpu/drm/i915/i915_drv.c
>> >> +++ b/drivers/gpu/drm/i915/i915_drv.c
>> >> @@ -566,6 +566,29 @@ static void intel_sanitize_options(struct
>> >drm_i915_private *dev_priv)
>> >> intel_gvt_sanitize_options(dev_priv);
>> >> }
>> >>
>> >> +/**
>> >> + * i915_set_dma_mask - set the dma mask as configured for the
>platform
>> >> + * @i915: valid i915 instance
>> >> + *
>> >> + * Set the dma device and coherent masks. This needs to occur before
>> >> + * i915_ggtt_probe_hw.
>> >> + *
>> >> + * NOTE: for devices < GEN(6), the dma_mask will also be set in
>> >> + * intel_gmch_probe() (i.e. it will be set a second time).
>> >> + */
>> >> +static void i915_set_dma_mask(struct drm_i915_private *i915)
>> >> +{
>> >> + struct pci_dev *pdev = i915->drm.pdev;
>> >> + unsigned int mask_size = INTEL_INFO(i915)->dma_mask_size;
>> >> + int err;
>> >> +
>> >> + GEM_BUG_ON(!mask_size);
>> >> +
>> >> + err = dma_set_mask_and_coherent(&pdev->dev,
>> >DMA_BIT_MASK(mask_size));
>> >> + if (err)
>> >> + DRM_ERROR("Can't set DMA mask/consistent mask (%d)\n",
>err);
>> >
>> >Which device again? How serious of an error is it exactly since it is
>> >ignored? Since it is being ignored, what's the impact to the user?
>> >Should they take any action, or can they ignore it? [If they can ignore
>> >it as well, this is barely anything to take note of.]
>>
>> I am keeping the "original" code path intact. The original locations spit
>> out an error, and then ignore it.
>
>You changed from drm_err() though :-p
Yeah, not sure why I did that....
>> A quick sampling of drivers shows that most drivers exit on this failure.
>>
>> I am not sure why the i915 does not. I am willing to change it. 😊
>
>If we cannot constrain the mask to be a subset of the device
>capabilities we probably should bail. I'm happy if you do propagate the
>error.
I will update.
>>
>> >> /**
>> >> * i915_driver_hw_probe - setup state requiring device access
>> >> * @dev_priv: device private
>> >> @@ -613,6 +636,8 @@ static int i915_driver_hw_probe(struct
>> >drm_i915_private *dev_priv)
>> >>
>> >> i915_perf_init(dev_priv);
>> >>
>> >> + i915_set_dma_mask(dev_priv);
>> >> +
>> >> ret = i915_ggtt_probe_hw(dev_priv);
>> >> if (ret)
>> >> goto err_perf;
>> >> diff --git a/drivers/gpu/drm/i915/i915_pci.c
>> >b/drivers/gpu/drm/i915/i915_pci.c
>> >> index 66738f2c4f28..2fc25ec12c3d 100644
>> >> --- a/drivers/gpu/drm/i915/i915_pci.c
>> >> +++ b/drivers/gpu/drm/i915/i915_pci.c
>> >> @@ -171,6 +171,7 @@
>> >> .engine_mask = BIT(RCS0), \
>> >> .has_snoop = true, \
>> >> .has_coherent_ggtt = false, \
>> >> + .dma_mask_size = 32, \
>> >> I9XX_PIPE_OFFSETS, \
>> >> I9XX_CURSOR_OFFSETS, \
>> >> I9XX_COLORS, \
>> >> @@ -190,6 +191,7 @@
>> >> .engine_mask = BIT(RCS0), \
>> >> .has_snoop = true, \
>> >> .has_coherent_ggtt = false, \
>> >> + .dma_mask_size = 32, \
>> >> I845_PIPE_OFFSETS, \
>> >> I845_CURSOR_OFFSETS, \
>> >> I9XX_COLORS, \
>> >> @@ -226,6 +228,7 @@ static const struct intel_device_info i865g_info = {
>> >> .engine_mask = BIT(RCS0), \
>> >> .has_snoop = true, \
>> >> .has_coherent_ggtt = true, \
>> >> + .dma_mask_size = 32, \
>> >
>> >gen2 is set to 30b?
>> >
>> >> I9XX_PIPE_OFFSETS, \
>> >> I9XX_CURSOR_OFFSETS, \
>> >> I9XX_COLORS, \
>> >> @@ -286,6 +289,7 @@ static const struct intel_device_info g33_info = {
>> >> PLATFORM(INTEL_G33),
>> >> .display.has_hotplug = 1,
>> >> .display.has_overlay = 1,
>> >> + .dma_mask_size = 36,
>> >> };
>> >>
>> >> static const struct intel_device_info pnv_g_info = {
>> >> @@ -293,6 +297,7 @@ static const struct intel_device_info pnv_g_info =
>{
>> >> PLATFORM(INTEL_PINEVIEW),
>> >> .display.has_hotplug = 1,
>> >> .display.has_overlay = 1,
>> >> + .dma_mask_size = 36,
>> >> };
>> >>
>> >> static const struct intel_device_info pnv_m_info = {
>> >> @@ -301,6 +306,7 @@ static const struct intel_device_info pnv_m_info =
>{
>> >> .is_mobile = 1,
>> >> .display.has_hotplug = 1,
>> >> .display.has_overlay = 1,
>> >> + .dma_mask_size = 36,
>> >> };
>> >>
>> >> #define GEN4_FEATURES \
>> >> @@ -313,6 +319,7 @@ static const struct intel_device_info pnv_m_info =
>{
>> >> .engine_mask = BIT(RCS0), \
>> >> .has_snoop = true, \
>> >> .has_coherent_ggtt = true, \
>> >> + .dma_mask_size = 36, \
>> >> I9XX_PIPE_OFFSETS, \
>> >> I9XX_CURSOR_OFFSETS, \
>> >> I965_COLORS, \
>> >
>> >I thought we had restricted i965g/i965gm to 32b.
>> >
>> >Hmm. dma_set_coherent_mask.
>> >
>> >Not much point tablifying one without the other?
>>
>> Since these were the only two, adding this to the table seemed like overkill.
>>
>> Gen2 (restricted to 30 bits), i965g and i965gm have the coherent mask set
>after
>> the i915_ggtt_enable_hw occurs (in i915_drv.c)
>>
>> I can move this code into the common location for setting the dma mask,
>but I
>> was not clear on the ramifications of this. Do you know if there is a reason
>for
>> the location of this workaround?
Ahh, I just remembered why I did not put the work arounds in the new
helper.
I discovered that the intel_gmch_probe() code is in the char/agp directory,
so the path is:
i915 set dma_mask
< gen5 set dma_mask
i915 < gen 5 work arounds
If I put the workarounds in the set dma mask, I lose the workaround.
Hmmm, intel_gmch_probe() has "gpu_pdev" to indicate that it is being
inited from i915. I could use this to skip the dma mask setting for this
path.
Is that reasonable?
Mike
>Tbh, I was surprised the pci_set_dma_mask() was being so late in ggtt
>probe :)
>
>But the only reason why the dma_set_coherent_mask() is being done much
>earlier is because that was historically where we were first handed the
>pci device and so where we configure the pci_dev (as opposed to thinking
>of operating on the drm_i915_device).
>
>There should not be a problem pulling them into the same location, and
>returning an error in case of failure. And if we do that we might as
>well do something like:
>
>i915_set_dma_mask {
> int dma_mask_size = INTEL_INFO(i915)->dma_mask_size;
>
> err = dma_set_mask(&i915->drm.dev,
>DMA_BIT_MASK(dma_mask_size));
> if (err)
> goto err;
>
> /* w/a overlay... */
> if (IS_GEN2)
> dma_mask_size = 30;
>
> /* w/a lots of fun restrictions */
> if (IS_I965G...)
> dma_mask_size = 32;
>
> err = dma_set_coherent_mask(&i915->drm.dev,
>DMA_BIT_MASK(dma_mask_size));
> if (err)
> goto err;
>
> return 0;
>
>err:
> drm_err(&i915->drm, "....");
> return err;
>}
>
>?
>-Chris
More information about the Intel-gfx
mailing list