On Wed, Sep 17, 2014 at 04:43:12PM +0900, Michel Dänzer wrote:
> On 12.09.2014 03:39, Tom Stellard wrote:
> >On Thu, Sep 11, 2014 at 05:24:03PM +0900, Michel Dänzer wrote:
> >>On 10.09.2014 22:59, Tom Stellard wrote:
> >>>
> >>>+          /* Always use the default config when all backends are enabled. 
> >>>*/
> >>>+          if (rb_mask && util_bitcount(rb_mask) < max_backends) {
> >>>+                  /* XXX: I can't figure out what the *_XSEL and *_YSEL
> >>>+                   * fields are for, so I'm leaving them as their default
> >>>+                   * values. */
> >>>+                  unsigned pkr_mask = (sh_per_se | 0x1);
> >>>+                  unsigned se0_pkr0 = rb_mask & pkr_mask;
> >>>+                  unsigned se0_pkr1 = (rb_mask >>= sh_per_se) & pkr_mask;
> >>>+                  unsigned se1_pkr0 = (rb_mask >>= sh_per_se) & pkr_mask;
> >>>+                  unsigned se1_pkr1 = (rb_mask >>= sh_per_se) & pkr_mask;
> >>>+                  unsigned se_map = 0;
> >>>+                  unsigned se0_pkr_map = 0;
> >>>+                  unsigned se1_pkr_map = 0;
> >>>+                  unsigned se0_pkr0_rb_map = 0;
> >>>+                  unsigned se0_pkr1_rb_map = 0;
> >>>+                  unsigned se1_pkr0_rb_map = 0;
> >>>+                  unsigned se1_pkr1_rb_map = 0;
> >>>+                  if (!se0_pkr0 && !se0_pkr1) {
> >>>+                          /* se0 disabled */
> >>>+                          se_map |= 0x1;
> >>>+                  }
> >>>+                  if (se1_pkr0 || se1_pkr1) {
> >>>+                          /* se1 enabled */
> >>>+                          se_map |= 0x2;
> >>>+                  }
> >>>+                  if (!se0_pkr0) {
> >>>+                          /* se0 pkr0 disabled */
> >>>+                          se0_pkr_map |= 0x1;
> >>>+                  }
> >>>+                  if (se0_pkr1) {
> >>>+                          /* se0 pkr1 enabled */
> >>>+                          se0_pkr_map |= 0x2;
> >>>+                  }
> >>>+                  if (!se1_pkr0) {
> >>>+                          /* se1 pkr0 disabled */
> >>>+                          se1_pkr_map |= 0x1;
> >>>+                  }
> >>>+                  if (se1_pkr1) {
> >>>+                          /* se1 pkr1 enabled */
> >>>+                          se1_pkr_map |= 0x2;
> >>>+                  }
> >>>+
> >>>+                  se0_pkr0_rb_map = pkr_mask_to_map(se0_pkr0);
> >>>+                  se0_pkr1_rb_map = pkr_mask_to_map(se0_pkr1);
> >>>+                  se1_pkr0_rb_map = pkr_mask_to_map(se1_pkr0);
> >>>+                  se1_pkr1_rb_map = pkr_mask_to_map(se1_pkr1);
> >>>+
> >>>+                  assert(!se0_pkr0 || !se1_pkr0 || (se0_pkr0_rb_map == 
> >>>se1_pkr0_rb_map));
> >>>+                  assert(!se0_pkr1 || !se1_pkr1 || (se0_pkr1_rb_map == 
> >>>se1_pkr1_rb_map));
> >>>+                  raster_config &= C_028350_RB_MAP_PKR0;
> >>>+                  raster_config |= S_028350_RB_MAP_PKR0(se0_pkr0_rb_map);
> >>>+                  raster_config &= C_028350_RB_MAP_PKR1;
> >>>+                  raster_config |= S_028350_RB_MAP_PKR1(se0_pkr1_rb_map);
> >>>+                  raster_config &= C_028350_PKR_MAP;
> >>>+                  raster_config |= S_028350_PKR_MAP(se0_pkr_map);
> >>>+                  raster_config &= C_028350_SE_MAP;
> >>>+                  raster_config |= S_028350_SE_MAP(se_map);
> >>>+          }
> >>
> >>Taking a closer look again at the kernel code and register spec, I'm
> >>afraid this logic is too static. I came up with the attached
> >>incremental patch. It tries to only modify raster_config as
> >>necessary, i.e. only if there are two SEs / packers per SE / RBs per
> >>packer but one of them is disabled. The result may be different
> >>between SEs.
> >
> >Does this mean that different values of R_028350_PA_SC_RASTER_CONFIG will
> >be written depending on the SE?
> 
> Yes.
> 
> >My understanding was that this register stored the information for both
> >SEs, so the same value would be used for> SE0 and SE1.
> 
> The PKR_MAP and RB_MAP_PKR0/1 fields could only be the same for both
> SEs if the pattern of disabled RBs is always symmetric between the
> SEs (is it?), and the description of PKR_MAP in the register spec
> explicitly says 'This can be unique per SE'.
> 
> The SE_MAP field value is the same for both SEs though.
> 

Thanks for explaining, I think I understand now.  I will try to test this
out on some harvested GPUs that I have.

-Tom
> 
> -- 
> Earthling Michel Dänzer            |                  http://www.amd.com
> Libre software enthusiast          |                Mesa and X developer
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to