[Intel-gfx] [PATCH 15/18] drm/i915: Add a new "remapped" gtt_view
Chris Wilson
chris at chris-wilson.co.uk
Thu Jul 19 19:46:54 UTC 2018
Quoting Ville Syrjälä (2018-07-19 20:33:57)
> On Thu, Jul 19, 2018 at 07:59:33PM +0100, Chris Wilson wrote:
> > Quoting Ville Syrjala (2018-07-19 19:22:11)
> > > +static struct scatterlist *
> > > +remap_pages(const dma_addr_t *in, unsigned int offset,
> > > + unsigned int width, unsigned int height,
> > > + unsigned int stride,
> > > + struct sg_table *st, struct scatterlist *sg)
> > > +{
> > > + unsigned int column, row;
> > > +
> > > + for (row = 0; row < height; row++) {
> > > + for (column = 0; column < width; column++) {
> > > + st->nents++;
> > > + /* We don't need the pages, but need to initialize
> > > + * the entries so the sg list can be happily traversed.
> > > + * The only thing we need are DMA addresses.
> > > + */
> > > + sg_set_page(sg, NULL, PAGE_SIZE, 0);
> > > + sg_dma_address(sg) = in[offset + column];
> > > + sg_dma_len(sg) = PAGE_SIZE;
> > > + sg = sg_next(sg);
> >
> > Ok. But should be I915_GTT_PAGE_SIZE?
>
> I suppose. And now I wonder what would happen on gen2 with its
> 2KiB gtt pages. Probably nothing good.
Pffifle. We call it 4KiB. It's just about the semantics, and here we
should be splitting the dma addresses by GTT_PAGE_SIZE rather than
system page size.
> > > +struct intel_remapped_info {
> > > + struct intel_remapped_plane_info {
> > > + /* tiles */
> > > + unsigned int width, height, stride, offset;
> > > + } plane[2];
> > > + unsigned int unused;
> >
> > Tag it as mbz, since we do use it inside the compare. Hmm, I wonder if
> > it actually is better if it doesn't exist if it isn't used, then it
> > should be zero.. Hmm, not sure if that's defined at all, might have to
> > say memset and don't rely on {} zeroing?
> >
> > Should work fine as a memcmp key for the rbtree.
>
> This whole thing is a bit questionale the way I did it. When populating
> the gtt_view I just poke at view->rotated and rely on matching layout
> for view->remapped. To make it less magic maybe I should embed one
> inside the other?
Hmm. If it's intentionally the same layout, then we should just use the
same struct for both. remapped/remap_info is generic enough to cover
rotation as well.
> > > +} __packed;
> > > +
> > > +static inline void assert_intel_remapped_info_is_packed(void)
> > > +{
> > > + BUILD_BUG_ON(sizeof(struct intel_remapped_info) != 10*sizeof(unsigned int));
> > > +}
> > > +
> > > struct intel_rotation_info {
> > > struct intel_rotation_plane_info {
> > > /* tiles */
> > > @@ -186,6 +199,7 @@ enum i915_ggtt_view_type {
> > > I915_GGTT_VIEW_NORMAL = 0,
> > > I915_GGTT_VIEW_ROTATED = sizeof(struct intel_rotation_info),
> > > I915_GGTT_VIEW_PARTIAL = sizeof(struct intel_partial_info),
> > > + I915_GGTT_VIEW_REMAPPED = sizeof(struct intel_remapped_info),
Oh, forgot about that trick. Yeah, they do need to differ in structs.
Hmm, so I think keep the remap_plane_info and reuse that?
struct intel_remapped_info {
struct intel_remapped_plane_info {
/* tiles */
unsigned int width, height, stride, offset;
} plane[2];
int unused_mbz;
};
struct intel_rotation_info {
struct intel_remmaped_plane_info plane[2];
};
static inline void assert_intel_rotation_matches_remapped_info(void)
{
/* Check that rotation/remapped shares offsets for simplicity */
BUILD_BUG_ON(offsetof(struct intel_remapped_info, plane[0]) !=
offsetof(struct intel_rotation_info, plane[0]));
BUILD_BUG_ON(offsetofend(struct intel_remapped_info, plane[1]) !=
offsetofend(struct intel_rotation_info, plane[1]));
}
-Chris
More information about the Intel-gfx
mailing list