diff --git a/tests/intel-ci/README b/tests/intel-ci/README
index dc7e5c8..314b343 100644
--- a/tests/intel-ci/README
+++ b/tests/intel-ci/README
@@ -32,3 +32,9 @@ test per feature.
 
 The string "basic" in a test name means the test probably belongs in
 this list.
+
+======================
+generic.testlist
+======================
+
+Generic is the testlist for GPU-agnostic tests.
\ No newline at end of file
diff --git a/tests/intel-ci/generic.testlist b/tests/intel-ci/generic.testlist
new file mode 100644
index 0000000..433acdf
--- /dev/null
+++ b/tests/intel-ci/generic.testlist
@@ -0,0 +1,125 @@
+igt@core_auth@many-magics
+igt@core_auth@basic-auth
+igt@core_getclient
+igt@core_get_client_auth@master-drop
+igt@core_get_client_auth@simple
+igt@core_getstats
+igt@core_getversion
+igt@core_prop_blob@invalid-get-prop
+igt@core_prop_blob@blob-prop-lifetime
+igt@core_prop_blob@invalid-set-prop-any
+igt@core_prop_blob@invalid-set-prop
+igt@core_prop_blob@blob-prop-validate
+igt@core_prop_blob@blob-multiple
+igt@core_prop_blob@blob-prop-core
+igt@core_prop_blob@basic
+igt@core_prop_blob@invalid-get-prop-any
+igt@core_setmaster_vs_auth
+igt@drm_read@empty-nonblock
+igt@drm_read@short-buffer-block
+igt@drm_read@empty-block
+igt@drm_read@invalid-buffer
+igt@drm_read@short-buffer-nonblock
+igt@drm_read@fault-buffer
+igt@kms_addfb_basic@no-handle
+igt@kms_addfb_basic@bad-pitch-32
+igt@kms_addfb_basic@bad-pitch-999
+igt@kms_addfb_basic@invalid-set-prop-any
+igt@kms_addfb_basic@bad-pitch-0
+igt@kms_addfb_basic@bad-pitch-1024
+igt@kms_addfb_basic@bad-pitch-256
+igt@kms_addfb_basic@too-wide
+igt@kms_addfb_basic@small-bo
+igt@kms_addfb_basic@invalid-get-prop
+igt@kms_addfb_basic@basic
+igt@kms_addfb_basic@size-max
+igt@kms_addfb_basic@bad-pitch-128
+igt@kms_addfb_basic@invalid-get-prop-any
+igt@kms_addfb_basic@invalid-set-prop
+igt@kms_addfb_basic@bad-pitch-63
+igt@kms_render@direct-render
+igt@kms_setmode@invalid-clone-single-crtc-stealing
+igt@testdisplay
+igt@vgem_basic@mmap
+igt@vgem_basic@dmabuf-mmap
+igt@vgem_basic@dmabuf-fence-before
+igt@vgem_basic@dmabuf-export
+igt@vgem_basic@debugfs
+igt@vgem_basic@dmabuf-fence
+igt@vgem_basic@second-client
+igt@vgem_basic@sysfs
+igt@vgem_basic@unload
+igt@vgem_basic@create
+igt@kms_flip@wf_vblank-interruptible
+igt@kms_flip@flip-vs-dpms-off-vs-modeset
+igt@kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset-interruptible
+igt@kms_flip@2x-wf_vblank-ts-check
+igt@kms_flip@absolute-wf_vblank
+igt@kms_flip@nonexisting-fb-interruptible
+igt@kms_flip@2x-flip-vs-rmfb-interruptible
+igt@kms_flip@2x-plain-flip-ts-check
+igt@kms_flip@2x-blocking-absolute-wf_vblank-interruptible
+igt@kms_flip@modeset-vs-vblank-race
+igt@kms_flip@2x-plain-flip-interruptible
+igt@kms_flip@2x-vblank-vs-dpms-suspend
+igt@kms_flip@nonexisting-fb
+igt@kms_flip@dpms-vs-vblank-race-interruptible
+igt@kms_flip@2x-flip-vs-blocking-wf-vblank
+igt@kms_flip@2x-modeset-vs-vblank-race-interruptible
+igt@kms_flip@2x-plain-flip
+igt@kms_flip@wf_vblank-ts-check
+igt@kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset
+igt@kms_flip@2x-flip-vs-modeset
+igt@kms_flip@2x-absolute-wf_vblank-interruptible
+igt@kms_flip@absolute-wf_vblank-interruptible
+igt@kms_flip@blocking-absolute-wf_vblank
+igt@kms_flip@dpms-off-confusion-interruptible
+igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset
+igt@kms_flip@flip-vs-expired-vblank-interruptible
+igt@kms_flip@2x-wf_vblank
+igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible
+igt@kms_flip@vblank-vs-dpms-suspend-interruptible
+igt@kms_flip@flip-vs-modeset-interruptible
+igt@kms_flip@dpms-vs-vblank-race
+igt@kms_flip@2x-wf_vblank-interruptible
+igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset-interruptible
+igt@kms_flip@basic-flip-vs-wf_vblank
+igt@kms_flip@basic-flip-vs-modeset
+igt@kms_flip@blocking-absolute-wf_vblank-interruptible
+igt@kms_flip@2x-flip-vs-modeset-interruptible
+igt@kms_flip@2x-flip-vs-panning-interruptible
+igt@kms_flip@flip-vs-blocking-wf-vblank
+igt@kms_flip@2x-dpms-vs-vblank-race-interruptible
+igt@kms_flip@flip-vs-panning-interruptible
+igt@kms_flip@vblank-vs-dpms-suspend
+igt@kms_flip@2x-flip-vs-expired-vblank-interruptible
+igt@kms_flip@2x-dpms-vs-vblank-race
+igt@kms_flip@2x-flip-vs-rmfb
+igt@kms_flip@2x-nonexisting-fb
+igt@kms_flip@blocking-wf_vblank
+igt@kms_flip@dpms-off-confusion
+igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset
+igt@kms_flip@flip-vs-panning
+igt@kms_flip@modeset-vs-vblank-race-interruptible
+igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible
+igt@kms_flip@flip-vs-expired-vblank
+igt@kms_flip@flip-vs-absolute-wf_vblank
+igt@kms_flip@plain-flip-interruptible
+igt@kms_flip@2x-modeset-vs-vblank-race
+igt@kms_flip@2x-vblank-vs-dpms-suspend-interruptible
+igt@kms_flip@basic-plain-flip
+igt@kms_flip@2x-plain-flip-fb-recreate
+igt@kms_flip@2x-nonexisting-fb-interruptible
+igt@kms_flip@2x-absolute-wf_vblank
+igt@kms_flip@2x-blocking-wf_vblank
+igt@kms_flip@2x-flip-vs-absolute-wf_vblank
+igt@kms_flip@2x-flip-vs-wf_vblank
+igt@kms_flip@flip-vs-rmfb-interruptible
+igt@kms_flip@2x-flip-vs-expired-vblank
+igt@kms_flip@plain-flip-fb-recreate
+igt@kms_flip@wf_vblank
+igt@kms_flip@plain-flip-ts-check
+igt@kms_flip@nonblocking-read
+igt@kms_flip@flip-vs-rmfb
+igt@kms_flip@2x-blocking-absolute-wf_vblank
+igt@kms_flip@2x-flip-vs-panning
