Hey all, this is the Etnaviv DRM driver for Vivante embedded GPUs. It is heavily influenced by the MSM driver, as can be clearly seen with the first commits. The userspace interface does a look a lot like the MSM one, with some small differences: - Each GPU core is a pipe as with MSM, but Vivante doesn't have a strict separation of tasks between the pipes. On some SoCs like the i.MX6 each pipe feeds one rendering backend (2D, 3D, VG), but there are also SoCs out there where on core (pipe) houses more than one backend. So pipes on Etnaviv represent one core, that may be switched between multiple execution state through the command stream. To allow for proper separation between processes each process may specify the expected execution state on submit. - OR-ing and shifting of BO reloc addresses has been removed, as there is need for this on Vivante GPUs. The register interface is designed in a way that one always fills in complete 32bit addresses without any additional informations. - Presumption of BO addresses is not used right now, as the GPU MMU v1 can not quarantee full protection. There is a 2GB window into physical memory without any MMU translation in between, so we always have to process all relocs to guard against malicious userspace. I've left it in the interface though as MMU v2 seems to be able to give full protection and it might become useful at that point. Unfinished stuff: - GPU PM and context switching. This already works for the GPU 2D where there isn't much state to retain on the GPU itself. For full context switching and power down support on the GPU 3D the userspace needs to aid the kernel with a context restore buffer. This part isn't done yet. It's a rather long series. I already tried to squash some commits together, but wanted to retain the authorship of the individual people that worked on this driver for now. Maybe if everyone involved is okay with it we could squash some of the fixup commits a bit more. I've kept things in staging for now, as that's the place where Christian started this driver, but would really like to move it to DRM proper _before_ merging. So please review stuff with that in mind. Russell King has some experimental support in the xf86-video-armada driver to get some X accel running atop of this. I have a working libdrm/MESA stack that basically works for some simple applications, but needs a good deal more work to clean up. If you would like to look at this stuff as a git tree feel free to fetch: git://git.pengutronix.de/git/lst/linux.git etnaviv-for-upstream Regards, Lucas Christian Gmeiner (2): staging: etnaviv: add drm driver staging: etnaviv: quiten down kernel log output Lucas Stach (28): staging: etnaviv: add devicetree bindings staging: etnaviv: import new headers staging: etnaviv: remove IOMMUv2 stubs staging: etnaviv: allow to draw up to 256 rectangles in one draw call staging: etnaviv: align command stream size to 64 bit staging: etnaviv: correct instruction count for GC2000 and GC880 staging: etnaviv: reconfigure bus mapping on GC2000 staging: etnaviv: fix cache cleaning for uncached SHM buffers staging: etnaviv: properly flush all TLBs on MMUv1 staging: etnaviv: convert to_etnaviv_bo() to real function staging: etnaviv: take gpu instead of pipe as input to fence wait function staging: etnaviv: plug in fence waiting in cpu_prepare staging: etnaviv: allow to map buffer object into multiple address spaces staging: etnaviv: don't pretend to have a single MMU staging: etnaviv: use GPU device to construct MMU staging: etnaviv: flush MMU when switching context staging: etnaviv: add flag to force buffer through MMU staging: etnaviv: use more natural devicetree abstraction staging: etnaviv: don't override platform provided IRQ flags staging: etnaviv: separate GPU pipes from execution state staging: etnaviv: make sure to unlock DRM mutex when component bind fails staging: etnaviv: clean up public API staging: etnaviv: prune dumb buffer support staging: etnaviv: properly prefix all prime functions to etnaviv staging: etnaviv: rename last remaining bits from msm to etnaviv staging: etnaviv: add proper license header to all files staging: etnaviv: some final trivial changes to the module ARM: imx6: add Vivante GPU nodes Philipp Zabel (1): of: Add vendor prefix for Vivante Corporation Russell King (80): staging: etnaviv: fix oops on unbind staging: etnaviv: fix oops in timer subsystem caused by hangcheck timer staging: etnaviv: fix etnaviv_add_components() staging: etnaviv: fix etnaviv_hw_reset() staging: etnaviv: fix etnaviv gpu debugfs output staging: etnaviv: fix fence implementation staging: etnaviv: fix buffer dumping code staging: etnaviv: fix ring buffer overflow check staging: etnaviv: fix cleanup of imported dmabufs staging: etnaviv: fix printk formats staging: etnaviv: validation: ensure space for the LINK command staging: etnaviv: validation: improve command buffer size checks staging: etnaviv: validation: improve relocation validation staging: etnaviv: fix sparse warnings staging: etnaviv: use devm_ioremap_resource() staging: etnaviv: respect the submission command offset staging: etnaviv: add an offset for buffer dumping staging: etnaviv: quieten down submission debugging staging: etnaviv: fix multiple command buffer submission in etnaviv_buffer_queue() staging: etnaviv: package up events into etnaviv_event struct staging: etnaviv: track the last known GPU position staging: etnaviv: ensure that ring buffer wraps staging: etnaviv: fix checkpatch errors staging: etnaviv: fix checkpatch warnings staging: etnaviv: fix get_pages() failure path staging: etnaviv: add gem operations structure to etnaviv objects staging: etnaviv: convert prime import to use etnaviv_gem_ops staging: etnaviv: convert shmem release to use etnaviv_gem_ops staging: etnaviv: convert cmdbuf release to use etnaviv_gem_ops staging: etnaviv: move drm_gem_object_release() staging: etnaviv: ensure cleanup of reservation object staging: etnaviv: clean up etnaviv_gem_free_object() staging: etnaviv: provide etnaviv_gem_new_private() staging: etnaviv: move msm_gem_import() etc to etnaviv_gem_prime.c staging: etnaviv: clean up prime import staging: etnaviv: convert get_pages()/put_pages() to take etnaviv_obj staging: etnaviv: clean up etnaviv_gem_{get,put}_pages() staging: etnaviv: add gem get_pages() method staging: etnaviv: fix DMA API usage staging: etnaviv: add support to insert a MMU flush into GPU stream staging: etnaviv: move GPU memory management into MMU staging: etnaviv: publish and use mmu geometry staging: etnaviv: mmuv1: ensure we unmap all entries staging: etnaviv: move MMU setup and teardown code to etnaviv_mmu.c staging: etnaviv: hack: bypass iommu with contiguous buffers staging: etnaviv: implement round-robin GPU MMU allocation staging: etnaviv: fix etnaviv_iommu_map_gem() return paths staging: etnaviv: implement MMU reaping staging: etnaviv: move scatterlist creation to etnaviv_gem_get_pages() staging: etnaviv: add userptr mapping support staging: etnaviv: call the DRM device 'drm' staging: etnaviv: clean up printk()s etc staging: etnaviv: safely take down hangcheck staging: etnaviv: move hangcheck disable to separate function staging: etnaviv: stop the hangcheck timer mis-firing staging: etnaviv: ensure that we retire all pending events staging: etnaviv: ensure GPU reset times out staging: etnaviv: add workarounds for GC320 on iMX6 staging: etnaviv: increase iommu page table size to 512KiB staging: etnaviv: allow non-DT use staging: etnaviv: dump mmu allocations staging: etnaviv: use definitions for constants staging: etnaviv: fix fence wrapping for gem objects staging: etnaviv: move scatterlist map/unmap staging: etnaviv: remove presumption of BO addresses staging: etnaviv: clean up etnaviv mmu scatterlist code staging: etnaviv: "better" DMA API usage staging: etnaviv: iommu: add a poisoned bad page staging: etnaviv: validate user supplied command stream staging: etnaviv: allow get_param without auth staging: etnaviv: fix busy reporting staging: etnaviv: fix event allocation failure path staging: etnaviv: remove powerrail support staging: etnaviv: NULL out stale pointers at unbind time staging: etnaviv: move mutex around component_{un,}bind_all() staging: etnaviv: move PM calls into bind/unbind callbacks staging: etnaviv: separate out etnaviv gpu hardware initialisation staging: etnaviv: add support to shutdown and restore the front end staging: etnaviv: runtime PM: add initial support staging: etnaviv: add support for offset physical memory .../bindings/drm/etnaviv/etnaviv-drm.txt | 44 + .../devicetree/bindings/vendor-prefixes.txt | 1 + arch/arm/boot/dts/imx6dl.dtsi | 5 + arch/arm/boot/dts/imx6q.dtsi | 14 + arch/arm/boot/dts/imx6qdl.dtsi | 19 + drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/etnaviv/Kconfig | 20 + drivers/staging/etnaviv/Makefile | 18 + drivers/staging/etnaviv/cmdstream.xml.h | 218 ++++ drivers/staging/etnaviv/common.xml.h | 249 ++++ drivers/staging/etnaviv/etnaviv_buffer.c | 306 +++++ drivers/staging/etnaviv/etnaviv_cmd_parser.c | 121 ++ drivers/staging/etnaviv/etnaviv_drv.c | 675 +++++++++++ drivers/staging/etnaviv/etnaviv_drv.h | 143 +++ drivers/staging/etnaviv/etnaviv_gem.c | 904 ++++++++++++++ drivers/staging/etnaviv/etnaviv_gem.h | 137 +++ drivers/staging/etnaviv/etnaviv_gem_prime.c | 116 ++ drivers/staging/etnaviv/etnaviv_gem_submit.c | 427 +++++++ drivers/staging/etnaviv/etnaviv_gpu.c | 1255 ++++++++++++++++++++ drivers/staging/etnaviv/etnaviv_gpu.h | 159 +++ drivers/staging/etnaviv/etnaviv_iommu.c | 216 ++++ drivers/staging/etnaviv/etnaviv_iommu.h | 26 + drivers/staging/etnaviv/etnaviv_mmu.c | 269 +++++ drivers/staging/etnaviv/etnaviv_mmu.h | 53 + drivers/staging/etnaviv/state.xml.h | 351 ++++++ drivers/staging/etnaviv/state_hi.xml.h | 407 +++++++ include/uapi/drm/etnaviv_drm.h | 225 ++++ 28 files changed, 6381 insertions(+) create mode 100644 Documentation/devicetree/bindings/drm/etnaviv/etnaviv-drm.txt create mode 100644 drivers/staging/etnaviv/Kconfig create mode 100644 drivers/staging/etnaviv/Makefile create mode 100644 drivers/staging/etnaviv/cmdstream.xml.h create mode 100644 drivers/staging/etnaviv/common.xml.h create mode 100644 drivers/staging/etnaviv/etnaviv_buffer.c create mode 100644 drivers/staging/etnaviv/etnaviv_cmd_parser.c create mode 100644 drivers/staging/etnaviv/etnaviv_drv.c create mode 100644 drivers/staging/etnaviv/etnaviv_drv.h create mode 100644 drivers/staging/etnaviv/etnaviv_gem.c create mode 100644 drivers/staging/etnaviv/etnaviv_gem.h create mode 100644 drivers/staging/etnaviv/etnaviv_gem_prime.c create mode 100644 drivers/staging/etnaviv/etnaviv_gem_submit.c create mode 100644 drivers/staging/etnaviv/etnaviv_gpu.c create mode 100644 drivers/staging/etnaviv/etnaviv_gpu.h create mode 100644 drivers/staging/etnaviv/etnaviv_iommu.c create mode 100644 drivers/staging/etnaviv/etnaviv_iommu.h create mode 100644 drivers/staging/etnaviv/etnaviv_mmu.c create mode 100644 drivers/staging/etnaviv/etnaviv_mmu.h create mode 100644 drivers/staging/etnaviv/state.xml.h create mode 100644 drivers/staging/etnaviv/state_hi.xml.h create mode 100644 include/uapi/drm/etnaviv_drm.h -- 2.1.4 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel