aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAge
* drm/msm: add a3xx gpu supportRob Clark2013-08-24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Add initial support for a3xx 3d core. So far, with hardware that I've seen to date, we can have: + zero, one, or two z180 2d cores + a3xx or a2xx 3d core, which share a common CP (the firmware for the CP seems to implement some different PM4 packet types but the basics of cmdstream submission are the same) Which means that the eventual complete "class" hierarchy, once support for all past and present hw is in place, becomes: + msm_gpu + adreno_gpu + a3xx_gpu + a2xx_gpu + z180_gpu This commit splits out the parts that will eventually be common between a2xx/a3xx into adreno_gpu, and the parts that are even common to z180 into msm_gpu. Note that there is no cmdstream validation required. All memory access from the GPU is via IOMMU/MMU. So as long as you don't map silly things to the GPU, there isn't much damage that the GPU can do. Signed-off-by: Rob Clark <robdclark@gmail.com>
* drm/msm: add register definitions for gpuRob Clark2013-08-24
| | | | | | | | | | | Generated from rnndb files in: https://github.com/freedreno/envytools Keep this split out as a separate commit to make it easier to review the actual driver. Signed-off-by: Rob Clark <robdclark@gmail.com>
* drm/msm: basic KMS driver for snapdragonRob Clark2013-08-24
| | | | | | | | | | | | | | | | | | | | | | | | | The snapdragon chips have multiple different display controllers, depending on which chip variant/version. (As far as I can tell, current devices have either MDP3 or MDP4, and upcoming devices have MDSS.) And then external to the display controller are HDMI, DSI, etc. blocks which may be shared across devices which have different display controller blocks. To more easily add support for different display controller blocks, the display controller specific bits are split out into a "kms" module, which provides the kms plane/crtc/encoder objects. The external HDMI, DSI, etc. blocks are part encoder, and part connector currently. But I think I will pull in the drm_bridge patches from chromeos tree, and split them into a bridge+connector, with the registers that need to be set in modeset handled by the bridge. This would remove the 'msm_connector' base class. But some things need to be double checked to make sure I could get the correct ON/OFF sequencing.. This patch adds support for mdp4 crtc (including hw cursor), dtv encoder (part of MDP4 block), and hdmi. Signed-off-by: Rob Clark <robdclark@gmail.com>
* drm/msm: add register definitionsRob Clark2013-08-24
| | | | | | | | | | | Generated from rnndb files in: https://github.com/freedreno/envytools Keep this split out as a separate commit to make it easier to review the actual driver. Signed-off-by: Rob Clark <robdclark@gmail.com>
* Merge branch 'gma500-next' of git://github.com/patjak/drm-gma500 into drm-nextDave Airlie2013-08-21
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Here's some gma500 unifying and cleanups for drm-next. There is more stuff in the pipe for 3.12 but I'd like to get these out of the way first. * 'gma500-next' of git://github.com/patjak/drm-gma500: (35 commits) drm/gma500/cdv: Add and hook up chip op for disabling sr drm/gma500/cdv: Add and hook up chip op for watermarks drm/gma500: Rename psb_intel_encoder to gma_encoder drm/gma500: Rename psb_intel_connector to gma_connector drm/gma500: Rename psb_intel_crtc to gma_crtc drm/gma500/cdv: Convert to generic set_config() drm/gma500/psb: Convert to generic set_config() drm/gma500: Add generic set_config() function drm/gma500/cdv: Convert to generic save/restore drm/gma500/psb: Convert to generic save/restore drm/gma500: Add generic crtc save/restore funcs drm/gma500: Convert to generic encoder funcs drm/gma500: Add generic encoder functions drm/gma500/psb: Convert to generic cursor funcs drm/gma500/cdv: Convert to generic cursor funcs drm/gma500: Add generic cursor functions drm/gma500/psb: Convert to generic crtc->destroy drm/gma500/mdfld: Use identical generic crtc funcs drm/gma500/oak: Use identical generic crtc funcs drm/gma500/psb: Convert to gma_crtc_dpms() ...
| * drm/gma500/cdv: Add and hook up chip op for disabling srPatrik Jakobsson2013-08-14
| | | | | | | | | | | | | | Add a callback hook to the chip ops struct to allow chips to have their specific self-refresh function. Currently only used by cdv. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/cdv: Add and hook up chip op for watermarksPatrik Jakobsson2013-08-14
| | | | | | | | | | | | | | | | | | Add a callback hook to the chip ops struct to allow chips to have their specific fifo watermark update function. Currently only cdv actually tries to set wms based on crtc configuration but if/when the other chips needs it we can attach a callback for them as well. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Rename psb_intel_encoder to gma_encoderPatrik Jakobsson2013-07-23
| | | | | | | | | | | | The psb_intel_encoder is generic and should be named appropriately Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Rename psb_intel_connector to gma_connectorPatrik Jakobsson2013-07-23
| | | | | | | | | | | | The psb_intel_connector is generic and should be named appropriately Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Rename psb_intel_crtc to gma_crtcPatrik Jakobsson2013-07-23
| | | | | | | | | | | | The psb_intel_crtc is generic and should be named appropriately Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/cdv: Convert to generic set_config()Patrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/psb: Convert to generic set_config()Patrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Add generic set_config() functionPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/cdv: Convert to generic save/restorePatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/psb: Convert to generic save/restorePatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Add generic crtc save/restore funcsPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Convert to generic encoder funcsPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Add generic encoder functionsPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/psb: Convert to generic cursor funcsPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/cdv: Convert to generic cursor funcsPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Add generic cursor functionsPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/psb: Convert to generic crtc->destroyPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/mdfld: Use identical generic crtc funcsPatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | Use the generic gma functions instead of the medfield functions where they are identical. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/oak: Use identical generic crtc funcsPatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | Use the generic gma functions instead of the oaktrail functions where they are identical. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/psb: Convert to gma_crtc_dpms()Patrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Convert to generic gamma funcsPatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | | | This takes care of the remaining chips using the old generic code. We don't check if the pipe number is valid but the old code peeked in the register map before checking anyways so just ignore it. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/psb: Convert to gma_pipe_set_base()Patrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/cdv: Convert to generic gamma funcsPatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | | | There is a slight difference in how we pick the palette register in the generic function but we should be ok as long as psb_intel_crtc->pipe and the register map is sane. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/cdv: Convert to gma_crtc_dpms()Patrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Add IS_CDV() macroPatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | This macro is needed for Cedarview specific stuff in the generic gma functions. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/cdv: Convert to gma_pipe_set_base()Patrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/psb: Use identical generic crtc funcsPatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | This patch makes psb use the gma_xxx counterparts that are identical. I took them in one sweep as they should not cause any regressions. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Make all chips use gma_wait_for_vblankPatrik Jakobsson2013-07-23
| | | | | | | | | | | | Also remove the duplicated oaktrail function. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/cdv: Use identical generic crtc funcsPatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | This patch makes cdv use the gma_xxx counterparts that are identical. I took them in one sweep as they should not cause any regressions. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Add generic pipe/crtc functionsPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Remove the unused psb_intel_display.hPatrik Jakobsson2013-07-23
| | | | | | | | Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/psb: Make use of generic clock codePatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | Add chip specific callbacks for the generic and non-generic clock calculation code. Also remove as much dupilicated code as possible. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Make use of gma_pipe_has_type()Patrik Jakobsson2013-07-23
| | | | | | | | | | | | | | | | Replace any use of xxx_intel_pipe_has_type() with the generic gma_pipe_has_type() function. Poulsbo still use it but that will be removed when we rip out psb_intel_pipe_has_type(). Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500/cdv: Make use of the generic clock codePatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | Add chip specific callbacks for the generic and non-generic clock calculation code. Also remove as much dupilicated code as possible. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| * drm/gma500: Add generic code for clock calculationPatrik Jakobsson2013-07-23
| | | | | | | | | | | | | | | | This patch aims to unify the bits and pieces that are common (or similar enough) for pll clock calculations. Nothing makes use of this code yet That will come in later patches. Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
* | drm/prime: Always add exported buffers to the handle cacheDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ... not only when the dma-buf is freshly created. In contrived examples someone else could have exported/imported the dma-buf already and handed us the gem object with a flink name. If such on object gets reexported as a dma_buf we won't have it in the handle cache already, which breaks the guarantee that for dma-buf imports we always hand back an existing handle if there is one. This is exercised by igt/prime_self_import/with_one_bo_two_files Now if we extend the locked sections just a notch more we can also plug th racy buf/handle cache setup in handle_to_fd: If evil userspace races a concurrent gem close against a prime export operation we can end up tearing down the gem handle before the dma buf handle cache is set up. When handle_to_fd gets around to adding the handle to the cache there will be no one left to clean it up, effectily leaking the bo (and the dma-buf, since the handle cache holds a ref on the dma-buf): Thread A Thread B handle_to_fd: lookup gem object from handle creates new dma_buf gem_close on the same handle obj->dma_buf is set, but file priv buf handle cache has no entry obj->handle_count drops to 0 drm_prime_add_buf_handle sets up the handle cache -> We have a dma-buf reference in the handle cache, but since the handle_count of the gem object already dropped to 0 no on will clean it up. When closing the drm device fd we'll hit the WARN_ON in drm_prime_destroy_file_private. The important change is to extend the critical section of the filp->prime.lock to cover the gem handle lookup. This serializes with a concurrent gem handle close. This leak is exercised by igt/prime_self_import/export-vs-gem_close-race Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
* | drm/prime: make drm_prime_lookup_buf_handle staticDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | ... and move it to the top of the function to avoid a forward declaration. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
* | drm/prime: Simplify drm_gem_remove_prime_handlesDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | with the reworking semantics and locking of the obj->dma_buf pointer this pointer is always set as long as there's still a gem handle around and a dma_buf associated with this gem object. Also, the per file-priv lookup-cache for dma-buf importing is also unified between foreign and native objects. Hence we don't need to special case the clean any more and can simply drop the clause which only runs for foreing objects, i.e. with obj->import_attach set. Note that with this change (actually with the previous one to always set up obj->dma_buf even for foreign objects) it is no longer required to set obj->import_attach when importing a foreing object. So update comments accordingly, too. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
* | drm/prime: proper locking+refcounting for obj->dma_buf linkDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The export dma-buf cache is semantically similar to an flink name. So semantically it makes sense to treat it the same and remove the name (i.e. the dma_buf pointer) and its references when the last gem handle disappears. Again we need to be careful, but double so: Not just could someone race and export with a gem close ioctl (so we need to recheck obj->handle_count again when assigning the new name), but multiple exports can also race against each another. This is prevented by holding the dev->object_name_lock across the entire section which touches obj->dma_buf. With the new scheme we also need to reinstate the obj->dma_buf link at import time (in case the only reference userspace has held in-between was through the dma-buf fd and not through any native gem handle). For simplicity we don't check whether it's a native object but unconditionally set up that link - with the new scheme of removing the obj->dma_buf reference when the last handle disappears we can do that. To make it clear that this is not just for exported buffers anymore als rename it from export_dma_buf to dma_buf. To make sure that now one can race a fd_to_handle or handle_to_fd with gem_close we use the same tricks as in flink of extending the dev->object_name_locking critical section. With this change we finally have a guaranteed 1:1 relationship (at least for native objects) between gem objects and dma-bufs, even accounting for races (which can happen since the dma-buf itself holds a reference while in-flight). This prevent igt/prime_self_import/export-vs-gem_close-race from Oopsing the kernel. There is still a leak though since the per-file priv dma-buf/handle cache handling is racy. That will be fixed in a later patch. v2: Remove the bogus dma_buf_put from the export_and_register_object failure path if we've raced with the handle count dropping to 0. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
* | drm/gem: completely close gem_open vs. gem_close racesDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The gem flink name holds a reference onto the object itself, and this self-reference would prevent an flink'ed object from every being freed. To break that loop we remove the flink name when the last userspace handle disappears, i.e. when obj->handle_count reaches 0. Now in gem_open we drop the dev->object_name_lock between the flink name lookup and actually adding the handle. This means a concurrent gem_close of the last handle could result in the flink name getting reaped right inbetween, i.e. Thread 1 Thread 2 gem_open gem_close flink -> obj lookup handle_count drops to 0 remove flink name create_handle handle_count++ If someone now flinks this object again, we'll get a new flink name. We can close this race by removing the lock dropping and making the entire lookup+handle_create sequence atomic. Unfortunately to still be able to share the handle_create logic this requires a handle_create_tail function which drops the lock - we can't hold the object_name_lock while calling into a driver's ->gem_open callback. Note that for flink fixing this race isn't really important, since racing gem_open against gem_close is clearly a userspace bug. And no matter how the race ends, we won't leak any references. But with dma-buf where the userspace dma-buf fd itself is refcounted this is a valid sequence and hence we should fix it. Therefore this patch here is just a warm-up exercise (and for consistency between flink buffer sharing and dma-buf buffer sharing with self-imports). Also note that this extension of the critical section in gem_open protected by dev->object_name_lock only works because it's now a mutex: A spinlock would conflict with the potential memory allocation in idr_preload(). This is exercises by igt/gem_flink_race/flink_name. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
* | drm/gem: switch dev->object_name_lock to a mutexDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I want to wrap the creation of a dma-buf from a gem object in it, so that the obj->export_dma_buf cache can be atomically filled in. Instead of creating a new mutex just for that variable I've figured I can reuse the existing dev->object_name_lock, especially since the new semantics will exactly mirror the flink obj->name already protected by that lock. v2: idr_preload/idr_preload_end is now an atomic section, so need to move the mutex locking outside. [airlied: fix up conflict with patch to make debugfs use lock] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
* | drm/prime: clarify logic a bit in drm_gem_prime_fd_to_handleDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | | | if (!ret) implies that ret == 0, so no need to clear it again. And explicitly check for ret == 0 to indicate that we're checking an errno integer. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
* | drm/prime: shrink critical section protected by prime lockDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | | | | | | | | | | | When exporting a gem object as a dma-buf the critical section for the per-fd prime lock is just the adding (and in case of errors, removing) of the handle to the per-fd lookup cache. So restrict the critical section to just that part of the function. This simplifies later reordering. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
* | drm/prime: use proper pointer in drm_gem_prime_handle_to_fdDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | Part of the function uses the properly-typed dmabuf variable, the other an untyped void *buf. Kill the later. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
* | drm/gem: make drm_gem_object_handle_unreference_unlocked staticDaniel Vetter2013-08-20
| | | | | | | | | | | | | | | | | | No one outside of drm should use this, the official interfaces are drm_gem_handle_create and drm_gem_handle_delete. The handle refcounting is purely an implementation detail of gem. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>