[Intel-gfx] [Mesa-dev] [PATCH] i965: Revert absolute mode for constant buffer pointers.
Joonas Lahtinen
joonas.lahtinen at linux.intel.com
Fri Nov 3 12:21:50 UTC 2017
Hi,
After some brainstorming, we decided to go big and grab all the
hardware provided defaults for all registers. That's for the sake of
not having to decide which registers are important.
This will also allow us not to be concerned of any context registers
possibly containing 'secure' information to be leaked, which we
currently don't expect from any known userspace. But you never know
what somebody could be doing with unused-for-them registers :)
The fix is not quite stable material, containing changes to the
hardware initialization ordering and being rather invasive in nature.
We're currently discussing the uAPI to expose to userspace, please stay
tuned. It'll likely be a bitmask of engine classes, which will shortly
be introduced from the PMU work.
Regards, Joonas
On Wed, 2017-10-25 at 10:53 -0700, Jason Ekstrand wrote:
> On Wed, Oct 25, 2017 at 10:31 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> > On Wednesday, October 25, 2017 7:33:41 AM PDT Jason Ekstrand wrote:
> > > On October 25, 2017 06:05:16 Joonas Lahtinen wrote:
> > [snip]
> > > > There indeed seems to be quite a lot of missing registers from the i915
> > > > driver where the context is initialized. (Psst. You can read that as:
> > > > "all the 33 non-privileged registers we could quickly list, are
> > > > missing").
> > >
> > > We probably don't need *all* of them initialized. For instance, the
> > > initial values of the ALU registers or the indirect draw parameter
> > > registers will probably never matter. However, if you want to just
> > > initialized them all, that's fine.
> >
> > I agree - I think we can cut down the list substantially, if you like.
> > Here's my breakdown of Skylake's non-privileged register list:
> >
> > Cache_Mode_0 0x7000
> > Cache_Mode_1 0x7004
> > GT_MODE 0x7008
> > L3_Config 0x7034
> > TD_CTL 0xE400
> > TD_CTL2 0xE404
> > L3SQCREG4 0xB118
> > NOPID 0x2094
> > INSTPM 0x20C0
> >
> > Should be initialized by the kernel. Several of these can severely
> > break unsuspecting userspace, and we'd like to be able to rely on a
> > default value.
> >
> > IA_VERTICES_COUNT 0x2310
> > IA_PRIMITIVES_COUNT 0x2318
> > VS_INVOCATION_COUNT 0x2320
> > HS_INVOCATION_COUNT 0x2300
> > DS_INVOCATION_COUNT 0x2308
> > GS_INVOCATION_COUNT 0x2328
> > GS_PRIMITIVES_COUNT 0x2330
> > SO_NUM_PRIMS_WRITTEN0 0x5200
> > SO_NUM_PRIMS_WRITTEN1 0x5208
> > SO_NUM_PRIMS_WRITTEN2 0x5210
> > SO_NUM_PRIMS_WRITTEN3 0x5218
> > SO_PRIM_STORAGE_NEEDED0 0x5240
> > SO_PRIM_STORAGE_NEEDED1 0x5248
> > SO_PRIM_STORAGE_NEEDED2 0x5250
> > SO_PRIM_STORAGE_NEEDED3 0x5258
> > CL_INVOCATION_COUNT 0x2338
> > CL_PRIMITIVES_COUNT 0x2340
> > PS_INVOCATION_COUNT_0 0x22C8
> > PS_DEPTH_COUNT_0 0x22D8
> > PS_INVOCATION_COUNT_1 0x22F0
> > PS_DEPTH_COUNT_1 0x22F8
> > PS_INVOCATION_COUNT_2 0x2448
> > PS_DEPTH_COUNT_2 0x2450
> > GPGPU_THREADS_DISPATCHED 0x2290
> >
> > The kernel can skip these if you like. Statistics registers just count
> > things, and userspace always calculates (end counter - start counter)
> > deltas, so the initial value doesn't really matter.
> >
> > SO_WRITE_OFFSET0 0x5280
> > SO_WRITE_OFFSET1 0x5284
> > SO_WRITE_OFFSET2 0x5288
> > SO_WRITE_OFFSET3 0x528C
> > GPUGPU_DISPATCHDIMX 0x2500
> > GPUGPU_DISPATCHDIMY 0x2504
> > GPUGPU_DISPATCHDIMZ 0x2508
> > MI_PREDICATE_SRC0 0x2400
> > MI_PREDICATE_SRC0 0x2404
> > MI_PREDICATE_SRC1 0x2408
> > MI_PREDICATE_SRC1 0x240C
> > MI_PREDICATE_DATA 0x2410
> > MI_PREDICATE_DATA 0x2414
> > MI_PREDICATE_RESULT 0x2418
> > MI_PREDICATE_RESULT_1 0x241C
> > MI_PREDICATE_RESULT_2 0x23BC
> > 3DPRIM_END_OFFSET 0x2420
> > 3DPRIM_START_VERTEX 0x2430
> > 3DPRIM_VERTEX_COUNT 0x2434
> > 3DPRIM_INSTANCE_COUNT 0x2438
> > 3DPRIM_START_INSTANCE 0x243C
> > 3DPRIM_BASE_VERTEX 0x2440
> >
> > The kernel can skip these if you like, IMO. These registers are only
> > used when enabling an optional feature - stream out (SO_WRITE_*),
> > indirect compute dispatch (GPGPU_*), predicated draws (MI_PREDICATE_*),
> > indirect draws (3DPRIM_*). Userspace has to explicitly opt in to each
> > of these features by enabling a flag, so there isn't a cross-context
> > contamination problem. If userspace opts in to these features, it can
> > be responsible for programming the registers correctly.
> >
> > CS_GPR (1-16) 0x2600
> >
> > The kernel can skip these if you like. They're temporary storage when
> > using the MI_MATH instruction. Example usage: load values into CS_GPR1
> > and CS_GPR2, add them, store the result in CS_GPR3. Store to memory.
> >
> > Nobody should be doing math on register values without setting them.
> > That's clearly a userspace bug.
> >
> > BB_OFFSET 0x2158
>
> This is used for indirect BATCH_BUFFER_START which is a thing on SKL+ I believe (I didn't look at the docs).
>
> > OA_CTX_CONTROL 0x2360
> > OACTXID 0x2364
> > OA CONTROL 0x2B00
> > PERF_CNT_1_DW0 0x91b8
> > PERF_CNT_1_DW1 0x91bc
> > PERF_CNT_2_DW0 0x91c0
> > PERF_CNT_2_DW1 0x91c4
> >
> > I don't know about these.
>
>
--
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
More information about the Intel-gfx
mailing list