mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 22:23:14 -04:00
drm pull for 4.20-rc1
-----BEGIN PGP SIGNATURE-----
iQIcBAABAgAGBQJbz8FfAAoJEAx081l5xIa+t8AQAJ6KaMM7rYlRDzIr1Vuh0++2
kFmfEQnSZnOWxO+zpyQpCJQr+/1aAHQ6+QzWq+/fX/bwH01H1Q4+z6t+4QoPqYlw
rUYXZYRxnqGVPYx8hwNLmRbJcsXMVKly1SemBXIoabKkEtPNX5AZ4FXCR2WEbsV3
/YLxsYQv2KMd8aoeC9Hupa07Jj9GfOtEo0a9B1hKmo+XiF9HqPadxaofqOpQ6MCh
54itBgP7Kj4mwwr8KxG2JCNJagG5aG8q3yiEwaU5b0KzWya4o1wrOAJcBaEAIxpj
JAgPde+f2L6w9dQbBBWeVFYKNn0jJqJdmbPs5Ek3i/NNFyx01Mn/3vlTZoRUqJN7
TGXwOI/BWz1iTaHyFPqVH6RPQAoUUDeCwgHkXonogFxvQLpiFG+dRNqxue0XVUMX
9tDSdZefWPoH3n9J/gDhwbV2Qbw/2n6yzCRYCb8HkqX1Y1JTmdYVgKvcnOwyYwsJ
QzcVkWUJ31UAaZcTLCEW6SVqcUR0mso3LJAPSKp2NJiVLL8mSd/ViUTUbxRNkkXf
H0abVGDjWAAZaT5uqNVqg4kV1Vc4Kj+/9QtspW4ktGezOz9DsctwJtfhTgOmT8Fx
zlEwWmAbf1iJP9UgqI7r4+Nq24saqUYmIX0bowEasLIRO+l14Pf9mQJjgKRcMs/j
SK4W5EreSFosKsxtQU4H
=3yxi
-----END PGP SIGNATURE-----
Merge tag 'drm-next-2018-10-24' of git://anongit.freedesktop.org/drm/drm
Pull drm updates from Dave Airlie:
"This is going to rebuild more than drm as it adds a new helper to
list.h for doing bulk updates. Seemed like a reasonable addition to
me.
Otherwise the usual merge window stuff lots of i915 and amdgpu, not so
much nouveau, and piles of everything else.
Core:
- Adds a new list.h helper for doing bulk list updates for TTM.
- Don't leak fb address in smem_start to userspace (comes with EXPORT
workaround for people using mali out of tree hacks)
- udmabuf device to turn memfd regions into dma-buf
- Per-plane blend mode property
- ref/unref replacements with get/put
- fbdev conflicting framebuffers code cleaned up
- host-endian format variants
- panel orientation quirk for Acer One 10
bridge:
- TI SN65DSI86 chip support
vkms:
- GEM support.
- Cursor support
amdgpu:
- Merge amdkfd and amdgpu into one module
- CEC over DP AUX support
- Picasso APU support + VCN dynamic powergating
- Raven2 APU support
- Vega20 enablement + kfd support
- ACP powergating improvements
- ABGR/XBGR display support
- VCN jpeg support
- xGMI support
- DC i2c/aux cleanup
- Ycbcr 4:2:0 support
- GPUVM improvements
- Powerplay and powerplay endian fixes
- Display underflow fixes
vmwgfx:
- Move vmwgfx specific TTM code to vmwgfx
- Split out vmwgfx buffer/resource validation code
- Atomic operation rework
bochs:
- use more helpers
- format/byteorder improvements
qxl:
- use more helpers
i915:
- GGTT coherency getparam
- Turn off resource streamer API
- More Icelake enablement + DMC firmware
- Full PPGTT for Ivybridge, Haswell and Valleyview
- DDB distribution based on resolution
- Limited range DP display support
nouveau:
- CEC over DP AUX support
- Initial HDMI 2.0 support
virtio-gpu:
- vmap support for PRIME objects
tegra:
- Initial Tegra194 support
- DMA/IOMMU integration fixes
msm:
- a6xx perf improvements + clock prefix
- GPU preemption optimisations
- a6xx devfreq support
- cursor support
rockchip:
- PX30 support
- rgb output interface support
mediatek:
- HDMI output support on mt2701 and mt7623
rcar-du:
- Interlaced modes on Gen3
- LVDS on R8A77980
- D3 and E3 SoC support
hisilicon:
- misc fixes
mxsfb:
- runtime pm support
sun4i:
- R40 TCON support
- Allwinner A64 support
- R40 HDMI support
omapdrm:
- Driver rework changing display pipeline ordering to use common code
- DMM memory barrier and irq fixes
- Errata workarounds
exynos:
- out-bridge support for LVDS bridge driver
- Samsung 16x16 tiled format support
- Plane alpha and pixel blend mode support
tilcdc:
- suspend/resume update
mali-dp:
- misc updates"
* tag 'drm-next-2018-10-24' of git://anongit.freedesktop.org/drm/drm: (1382 commits)
firmware/dmc/icl: Add missing MODULE_FIRMWARE() for Icelake.
drm/i915/icl: Fix signal_levels
drm/i915/icl: Fix DDI/TC port clk_off bits
drm/i915/icl: create function to identify combophy port
drm/i915/gen9+: Fix initial readout for Y tiled framebuffers
drm/i915: Large page offsets for pread/pwrite
drm/i915/selftests: Disable shrinker across mmap-exhaustion
drm/i915/dp: Link train Fallback on eDP only if fallback link BW can fit panel's native mode
drm/i915: Fix intel_dp_mst_best_encoder()
drm/i915: Skip vcpi allocation for MSTB ports that are gone
drm/i915: Don't unset intel_connector->mst_port
drm/i915: Only reset seqno if actually idle
drm/i915: Use the correct crtc when sanitizing plane mapping
drm/i915: Restore vblank interrupts earlier
drm/i915: Check fb stride against plane max stride
drm/amdgpu/vcn:Fix uninitialized symbol error
drm: panel-orientation-quirks: Add quirk for Acer One 10 (S1003)
drm/amd/amdgpu: Fix debugfs error handling
drm/amdgpu: Update gc_9_0 golden settings.
drm/amd/powerplay: update PPtable with DC BTC and Tvr SocLimit fields
...
This commit is contained in:
commit
53b3b6bbfd
893 changed files with 107740 additions and 25645 deletions
|
|
@ -110,7 +110,4 @@ static inline bool drm_can_sleep(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
/* helper for handling conditionals in various for_each macros */
|
||||
#define for_each_if(condition) if (!(condition)) {} else
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#define DRM_ATOMIC_H_
|
||||
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_util.h>
|
||||
|
||||
/**
|
||||
* struct drm_crtc_commit - track modeset commits on a CRTC
|
||||
|
|
@ -384,9 +385,6 @@ void drm_atomic_state_default_release(struct drm_atomic_state *state);
|
|||
struct drm_crtc_state * __must_check
|
||||
drm_atomic_get_crtc_state(struct drm_atomic_state *state,
|
||||
struct drm_crtc *crtc);
|
||||
int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state, struct drm_property *property,
|
||||
uint64_t val);
|
||||
struct drm_plane_state * __must_check
|
||||
drm_atomic_get_plane_state(struct drm_atomic_state *state,
|
||||
struct drm_plane *plane);
|
||||
|
|
@ -597,25 +595,6 @@ __drm_atomic_get_current_plane_state(struct drm_atomic_state *state,
|
|||
return plane->state;
|
||||
}
|
||||
|
||||
int __must_check
|
||||
drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,
|
||||
const struct drm_display_mode *mode);
|
||||
int __must_check
|
||||
drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,
|
||||
struct drm_property_blob *blob);
|
||||
int __must_check
|
||||
drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,
|
||||
struct drm_crtc *crtc);
|
||||
void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,
|
||||
struct drm_framebuffer *fb);
|
||||
void drm_atomic_set_fence_for_plane(struct drm_plane_state *plane_state,
|
||||
struct dma_fence *fence);
|
||||
int __must_check
|
||||
drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
|
||||
struct drm_crtc *crtc);
|
||||
int drm_atomic_set_writeback_fb_for_connector(
|
||||
struct drm_connector_state *conn_state,
|
||||
struct drm_framebuffer *fb);
|
||||
int __must_check
|
||||
drm_atomic_add_affected_connectors(struct drm_atomic_state *state,
|
||||
struct drm_crtc *crtc);
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_modeset_helper_vtables.h>
|
||||
#include <drm/drm_modeset_helper.h>
|
||||
#include <drm/drm_util.h>
|
||||
|
||||
struct drm_atomic_state;
|
||||
struct drm_private_obj;
|
||||
|
|
@ -156,6 +157,8 @@ void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state);
|
|||
void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state);
|
||||
|
||||
void __drm_atomic_helper_plane_reset(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
void drm_atomic_helper_plane_reset(struct drm_plane *plane);
|
||||
void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
|
|
|
|||
58
include/drm/drm_atomic_uapi.h
Normal file
58
include/drm/drm_atomic_uapi.h
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Red Hat
|
||||
* Copyright (C) 2014 Intel Corp.
|
||||
* Copyright (C) 2018 Intel Corp.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Rob Clark <robdclark@gmail.com>
|
||||
* Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
*/
|
||||
|
||||
#ifndef DRM_ATOMIC_UAPI_H_
|
||||
#define DRM_ATOMIC_UAPI_H_
|
||||
|
||||
struct drm_crtc_state;
|
||||
struct drm_display_mode;
|
||||
struct drm_property_blob;
|
||||
struct drm_plane_state;
|
||||
struct drm_crtc;
|
||||
struct drm_connector_state;
|
||||
struct dma_fence;
|
||||
struct drm_framebuffer;
|
||||
|
||||
int __must_check
|
||||
drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,
|
||||
const struct drm_display_mode *mode);
|
||||
int __must_check
|
||||
drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,
|
||||
struct drm_property_blob *blob);
|
||||
int __must_check
|
||||
drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,
|
||||
struct drm_crtc *crtc);
|
||||
void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,
|
||||
struct drm_framebuffer *fb);
|
||||
void drm_atomic_set_fence_for_plane(struct drm_plane_state *plane_state,
|
||||
struct dma_fence *fence);
|
||||
int __must_check
|
||||
drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
|
||||
struct drm_crtc *crtc);
|
||||
|
||||
#endif
|
||||
|
|
@ -27,6 +27,10 @@
|
|||
#include <linux/ctype.h>
|
||||
#include <drm/drm_mode.h>
|
||||
|
||||
#define DRM_MODE_BLEND_PREMULTI 0
|
||||
#define DRM_MODE_BLEND_COVERAGE 1
|
||||
#define DRM_MODE_BLEND_PIXEL_NONE 2
|
||||
|
||||
struct drm_device;
|
||||
struct drm_atomic_state;
|
||||
struct drm_plane;
|
||||
|
|
@ -52,4 +56,6 @@ int drm_plane_create_zpos_immutable_property(struct drm_plane *plane,
|
|||
unsigned int zpos);
|
||||
int drm_atomic_normalize_zpos(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
int drm_plane_create_blend_mode_property(struct drm_plane *plane,
|
||||
unsigned int supported_modes);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#define __DRM_COLOR_MGMT_H__
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <drm/drm_property.h>
|
||||
|
||||
struct drm_crtc;
|
||||
struct drm_plane;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/ctype.h>
|
||||
#include <linux/hdmi.h>
|
||||
#include <drm/drm_mode_object.h>
|
||||
#include <drm/drm_util.h>
|
||||
|
||||
#include <uapi/drm/drm_mode.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -744,8 +744,45 @@ struct drm_crtc_funcs {
|
|||
*
|
||||
* 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int (*set_crc_source)(struct drm_crtc *crtc, const char *source,
|
||||
size_t *values_cnt);
|
||||
int (*set_crc_source)(struct drm_crtc *crtc, const char *source);
|
||||
/**
|
||||
* @verify_crc_source:
|
||||
*
|
||||
* verifies the source of CRC checksums of frames before setting the
|
||||
* source for CRC and during crc open. Source parameter can be NULL
|
||||
* while disabling crc source.
|
||||
*
|
||||
* This callback is optional if the driver does not support any CRC
|
||||
* generation functionality.
|
||||
*
|
||||
* RETURNS:
|
||||
*
|
||||
* 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int (*verify_crc_source)(struct drm_crtc *crtc, const char *source,
|
||||
size_t *values_cnt);
|
||||
/**
|
||||
* @get_crc_sources:
|
||||
*
|
||||
* Driver callback for getting a list of all the available sources for
|
||||
* CRC generation. This callback depends upon verify_crc_source, So
|
||||
* verify_crc_source callback should be implemented before implementing
|
||||
* this. Driver can pass full list of available crc sources, this
|
||||
* callback does the verification on each crc-source before passing it
|
||||
* to userspace.
|
||||
*
|
||||
* This callback is optional if the driver does not support exporting of
|
||||
* possible CRC sources list.
|
||||
*
|
||||
* RETURNS:
|
||||
*
|
||||
* a constant character pointer to the list of all the available CRC
|
||||
* sources. On failure driver should return NULL. count should be
|
||||
* updated with number of sources in list. if zero we don't process any
|
||||
* source from the list.
|
||||
*/
|
||||
const char *const *(*get_crc_sources)(struct drm_crtc *crtc,
|
||||
size_t *count);
|
||||
|
||||
/**
|
||||
* @atomic_print_state:
|
||||
|
|
|
|||
|
|
@ -45,6 +45,16 @@ struct drm_device {
|
|||
/* currently active master for this device. Protected by master_mutex */
|
||||
struct drm_master *master;
|
||||
|
||||
/**
|
||||
* @driver_features: per-device driver features
|
||||
*
|
||||
* Drivers can clear specific flags here to disallow
|
||||
* certain features on a per-device basis while still
|
||||
* sharing a single &struct drm_driver instance across
|
||||
* all devices.
|
||||
*/
|
||||
u32 driver_features;
|
||||
|
||||
/**
|
||||
* @unplugged:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -123,8 +123,9 @@
|
|||
# define DP_FRAMING_CHANGE_CAP (1 << 1)
|
||||
# define DP_DPCD_DISPLAY_CONTROL_CAPABLE (1 << 3) /* edp v1.2 or higher */
|
||||
|
||||
#define DP_TRAINING_AUX_RD_INTERVAL 0x00e /* XXX 1.2? */
|
||||
# define DP_TRAINING_AUX_RD_MASK 0x7F /* XXX 1.2? */
|
||||
#define DP_TRAINING_AUX_RD_INTERVAL 0x00e /* XXX 1.2? */
|
||||
# define DP_TRAINING_AUX_RD_MASK 0x7F /* DP 1.3 */
|
||||
# define DP_EXTENDED_RECEIVER_CAP_FIELD_PRESENT (1 << 7) /* DP 1.3 */
|
||||
|
||||
#define DP_ADAPTER_CAP 0x00f /* 1.2 */
|
||||
# define DP_FORCE_LOAD_SENSE_CAP (1 << 0)
|
||||
|
|
@ -1260,12 +1261,12 @@ int drm_dp_read_desc(struct drm_dp_aux *aux, struct drm_dp_desc *desc,
|
|||
*/
|
||||
enum drm_dp_quirk {
|
||||
/**
|
||||
* @DP_DPCD_QUIRK_LIMITED_M_N:
|
||||
* @DP_DPCD_QUIRK_CONSTANT_N:
|
||||
*
|
||||
* The device requires main link attributes Mvid and Nvid to be limited
|
||||
* to 16 bits.
|
||||
* to 16 bits. So will give a constant value (0x8000) for compatability.
|
||||
*/
|
||||
DP_DPCD_QUIRK_LIMITED_M_N,
|
||||
DP_DPCD_QUIRK_CONSTANT_N,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -56,7 +56,6 @@ struct drm_printer;
|
|||
#define DRIVER_ATOMIC 0x10000
|
||||
#define DRIVER_KMS_LEGACY_CONTEXT 0x20000
|
||||
#define DRIVER_SYNCOBJ 0x40000
|
||||
#define DRIVER_PREFER_XBGR_30BPP 0x80000
|
||||
|
||||
/**
|
||||
* struct drm_driver - DRM driver structure
|
||||
|
|
@ -654,14 +653,14 @@ static inline bool drm_dev_is_unplugged(struct drm_device *dev)
|
|||
* @dev: DRM device to check
|
||||
* @feature: feature flag
|
||||
*
|
||||
* This checks @dev for driver features, see &drm_driver.driver_features and the
|
||||
* various DRIVER_\* flags.
|
||||
* This checks @dev for driver features, see &drm_driver.driver_features,
|
||||
* &drm_device.driver_features, and the various DRIVER_\* flags.
|
||||
*
|
||||
* Returns true if the @feature is supported, false otherwise.
|
||||
*/
|
||||
static inline bool drm_core_check_feature(struct drm_device *dev, int feature)
|
||||
static inline bool drm_core_check_feature(struct drm_device *dev, u32 feature)
|
||||
{
|
||||
return dev->driver->driver_features & feature;
|
||||
return dev->driver->driver_features & dev->driver_features & feature;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_mode.h>
|
||||
#include <drm/drm_mode_object.h>
|
||||
#include <drm/drm_util.h>
|
||||
|
||||
struct drm_encoder;
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ void drm_fbdev_cma_fini(struct drm_fbdev_cma *fbdev_cma);
|
|||
|
||||
void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);
|
||||
void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);
|
||||
void drm_fbdev_cma_set_suspend(struct drm_fbdev_cma *fbdev_cma, bool state);
|
||||
void drm_fbdev_cma_set_suspend_unlocked(struct drm_fbdev_cma *fbdev_cma,
|
||||
bool state);
|
||||
|
||||
|
|
|
|||
|
|
@ -604,6 +604,16 @@ drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
|
|||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* drm_fb_helper_remove_conflicting_framebuffers - remove firmware-configured framebuffers
|
||||
* @a: memory range, users of which are to be removed
|
||||
* @name: requesting driver name
|
||||
* @primary: also kick vga16fb if present
|
||||
*
|
||||
* This function removes framebuffer devices (initialized by firmware/bootloader)
|
||||
* which use memory range described by @a. If @a is NULL all such devices are
|
||||
* removed.
|
||||
*/
|
||||
static inline int
|
||||
drm_fb_helper_remove_conflicting_framebuffers(struct apertures_struct *a,
|
||||
const char *name, bool primary)
|
||||
|
|
@ -615,4 +625,28 @@ drm_fb_helper_remove_conflicting_framebuffers(struct apertures_struct *a,
|
|||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_fb_helper_remove_conflicting_pci_framebuffers - remove firmware-configured framebuffers for PCI devices
|
||||
* @pdev: PCI device
|
||||
* @resource_id: index of PCI BAR configuring framebuffer memory
|
||||
* @name: requesting driver name
|
||||
*
|
||||
* This function removes framebuffer devices (eg. initialized by firmware)
|
||||
* using memory range configured for @pdev's BAR @resource_id.
|
||||
*
|
||||
* The function assumes that PCI device with shadowed ROM drives a primary
|
||||
* display and so kicks out vga16fb.
|
||||
*/
|
||||
static inline int
|
||||
drm_fb_helper_remove_conflicting_pci_framebuffers(struct pci_dev *pdev,
|
||||
int resource_id,
|
||||
const char *name)
|
||||
{
|
||||
#if IS_REACHABLE(CONFIG_FB)
|
||||
return remove_conflicting_pci_framebuffers(pdev, resource_id, name);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -25,6 +25,28 @@
|
|||
#include <linux/types.h>
|
||||
#include <uapi/drm/drm_fourcc.h>
|
||||
|
||||
/*
|
||||
* DRM formats are little endian. Define host endian variants for the
|
||||
* most common formats here, to reduce the #ifdefs needed in drivers.
|
||||
*
|
||||
* Note that the DRM_FORMAT_BIG_ENDIAN flag should only be used in
|
||||
* case the format can't be specified otherwise, so we don't end up
|
||||
* with two values describing the same format.
|
||||
*/
|
||||
#ifdef __BIG_ENDIAN
|
||||
# define DRM_FORMAT_HOST_XRGB1555 (DRM_FORMAT_XRGB1555 | \
|
||||
DRM_FORMAT_BIG_ENDIAN)
|
||||
# define DRM_FORMAT_HOST_RGB565 (DRM_FORMAT_RGB565 | \
|
||||
DRM_FORMAT_BIG_ENDIAN)
|
||||
# define DRM_FORMAT_HOST_XRGB8888 DRM_FORMAT_BGRX8888
|
||||
# define DRM_FORMAT_HOST_ARGB8888 DRM_FORMAT_BGRA8888
|
||||
#else
|
||||
# define DRM_FORMAT_HOST_XRGB1555 DRM_FORMAT_XRGB1555
|
||||
# define DRM_FORMAT_HOST_RGB565 DRM_FORMAT_RGB565
|
||||
# define DRM_FORMAT_HOST_XRGB8888 DRM_FORMAT_XRGB8888
|
||||
# define DRM_FORMAT_HOST_ARGB8888 DRM_FORMAT_ARGB8888
|
||||
#endif
|
||||
|
||||
struct drm_device;
|
||||
struct drm_mode_fb_cmd2;
|
||||
|
||||
|
|
@ -66,6 +88,8 @@ const struct drm_format_info *
|
|||
drm_get_format_info(struct drm_device *dev,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
|
||||
uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
|
||||
uint32_t bpp, uint32_t depth);
|
||||
int drm_format_num_planes(uint32_t format);
|
||||
int drm_format_plane_cpp(uint32_t format, int plane);
|
||||
int drm_format_horz_chroma_subsampling(uint32_t format);
|
||||
|
|
|
|||
|
|
@ -809,6 +809,21 @@ struct drm_mode_config {
|
|||
|
||||
/* dumb ioctl parameters */
|
||||
uint32_t preferred_depth, prefer_shadow;
|
||||
bool quirk_addfb_prefer_xbgr_30bpp;
|
||||
|
||||
/**
|
||||
* @quirk_addfb_prefer_host_byte_order:
|
||||
*
|
||||
* When set to true drm_mode_addfb() will pick host byte order
|
||||
* pixel_format when calling drm_mode_addfb2(). This is how
|
||||
* drm_mode_addfb() should have worked from day one. It
|
||||
* didn't though, so we ended up with quirks in both kernel
|
||||
* and userspace drivers to deal with the broken behavior.
|
||||
* Simply fixing drm_mode_addfb() unconditionally would break
|
||||
* these drivers, so add a quirk bit here to allow drivers
|
||||
* opt-in.
|
||||
*/
|
||||
bool quirk_addfb_prefer_host_byte_order;
|
||||
|
||||
/**
|
||||
* @async_page_flip: Does this device support async flips on the primary
|
||||
|
|
|
|||
|
|
@ -82,6 +82,7 @@ struct drm_panel_funcs {
|
|||
* @drm: DRM device owning the panel
|
||||
* @connector: DRM connector that the panel is attached to
|
||||
* @dev: parent device of the panel
|
||||
* @link: link from panel device (supplier) to DRM device (consumer)
|
||||
* @funcs: operations that can be performed on the panel
|
||||
* @list: panel entry in registry
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#define radeon_PCI_IDS \
|
||||
{0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x1305, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
|
|
|
|||
|
|
@ -27,6 +27,9 @@
|
|||
#include <linux/ctype.h>
|
||||
#include <drm/drm_mode_object.h>
|
||||
#include <drm/drm_color_mgmt.h>
|
||||
#include <drm/drm_rect.h>
|
||||
#include <drm/drm_modeset_lock.h>
|
||||
#include <drm/drm_util.h>
|
||||
|
||||
struct drm_crtc;
|
||||
struct drm_printer;
|
||||
|
|
@ -118,6 +121,14 @@ struct drm_plane_state {
|
|||
*/
|
||||
u16 alpha;
|
||||
|
||||
/**
|
||||
* @pixel_blend_mode:
|
||||
* The alpha blending equation selection, describing how the pixels from
|
||||
* the current plane are composited with the background. Value can be
|
||||
* one of DRM_MODE_BLEND_*
|
||||
*/
|
||||
uint16_t pixel_blend_mode;
|
||||
|
||||
/**
|
||||
* @rotation:
|
||||
* Rotation of the plane. See drm_plane_create_rotation_property() for
|
||||
|
|
@ -659,6 +670,14 @@ struct drm_plane {
|
|||
* drm_plane_create_rotation_property().
|
||||
*/
|
||||
struct drm_property *rotation_property;
|
||||
/**
|
||||
* @blend_mode_property:
|
||||
* Optional "pixel blend mode" enum property for this plane.
|
||||
* Blend mode property represents the alpha blending equation selection,
|
||||
* describing how the pixels from the current plane are composited with
|
||||
* the background.
|
||||
*/
|
||||
struct drm_property *blend_mode_property;
|
||||
|
||||
/**
|
||||
* @color_encoding_property:
|
||||
|
|
|
|||
|
|
@ -381,7 +381,7 @@ void drm_err(const char *format, ...);
|
|||
|
||||
#define DRM_DEV_DEBUG_DP(dev, fmt, ...) \
|
||||
drm_dev_dbg(dev, DRM_UT_DP, fmt, ## __VA_ARGS__)
|
||||
#define DRM_DEBUG_DP(dev, fmt, ...) \
|
||||
#define DRM_DEBUG_DP(fmt, ...) \
|
||||
drm_dbg(DRM_UT_DP, fmt, ## __VA_ARGS__)
|
||||
|
||||
#define _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, category, fmt, ...) \
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
#include <linux/ctype.h>
|
||||
#include <drm/drm_mode_object.h>
|
||||
|
||||
#include <uapi/drm/drm_mode.h>
|
||||
|
||||
/**
|
||||
* struct drm_property_enum - symbolic values for enumerations
|
||||
* @value: numeric property value for this enum entry
|
||||
|
|
|
|||
|
|
@ -131,15 +131,10 @@ drm_syncobj_fence_get(struct drm_syncobj *syncobj)
|
|||
|
||||
struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private,
|
||||
u32 handle);
|
||||
void drm_syncobj_add_callback(struct drm_syncobj *syncobj,
|
||||
struct drm_syncobj_cb *cb,
|
||||
drm_syncobj_func_t func);
|
||||
void drm_syncobj_remove_callback(struct drm_syncobj *syncobj,
|
||||
struct drm_syncobj_cb *cb);
|
||||
void drm_syncobj_replace_fence(struct drm_syncobj *syncobj,
|
||||
void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, u64 point,
|
||||
struct dma_fence *fence);
|
||||
int drm_syncobj_find_fence(struct drm_file *file_private,
|
||||
u32 handle,
|
||||
u32 handle, u64 point,
|
||||
struct dma_fence **fence);
|
||||
void drm_syncobj_free(struct kref *kref);
|
||||
int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
|
||||
|
|
|
|||
32
include/drm/drm_util.h
Normal file
32
include/drm/drm_util.h
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Internal Header for the Direct Rendering Manager
|
||||
*
|
||||
* Copyright 2018 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _DRM_UTIL_H_
|
||||
#define _DRM_UTIL_H_
|
||||
|
||||
/* helper for handling conditionals in various for_each macros */
|
||||
#define for_each_if(condition) if (!(condition)) {} else
|
||||
|
||||
#endif
|
||||
|
|
@ -50,7 +50,10 @@ enum drm_sched_priority {
|
|||
*
|
||||
* @list: used to append this struct to the list of entities in the
|
||||
* runqueue.
|
||||
* @rq: runqueue to which this entity belongs.
|
||||
* @rq: runqueue on which this entity is currently scheduled.
|
||||
* @rq_list: a list of run queues on which jobs from this entity can
|
||||
* be scheduled
|
||||
* @num_rq_list: number of run queues in the rq_list
|
||||
* @rq_lock: lock to modify the runqueue to which this entity belongs.
|
||||
* @job_queue: the list of jobs of this entity.
|
||||
* @fence_seq: a linearly increasing seqno incremented with each
|
||||
|
|
@ -67,6 +70,7 @@ enum drm_sched_priority {
|
|||
* @fini_status: contains the exit status in case the process was signalled.
|
||||
* @last_scheduled: points to the finished fence of the last scheduled job.
|
||||
* @last_user: last group leader pushing a job into the entity.
|
||||
* @stopped: Marks the enity as removed from rq and destined for termination.
|
||||
*
|
||||
* Entities will emit jobs in order to their corresponding hardware
|
||||
* ring, and the scheduler will alternate between entities based on
|
||||
|
|
@ -75,6 +79,8 @@ enum drm_sched_priority {
|
|||
struct drm_sched_entity {
|
||||
struct list_head list;
|
||||
struct drm_sched_rq *rq;
|
||||
struct drm_sched_rq **rq_list;
|
||||
unsigned int num_rq_list;
|
||||
spinlock_t rq_lock;
|
||||
|
||||
struct spsc_queue job_queue;
|
||||
|
|
@ -87,6 +93,7 @@ struct drm_sched_entity {
|
|||
atomic_t *guilty;
|
||||
struct dma_fence *last_scheduled;
|
||||
struct task_struct *last_user;
|
||||
bool stopped;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -168,8 +175,6 @@ struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f);
|
|||
* finished to remove the job from the
|
||||
* @drm_gpu_scheduler.ring_mirror_list.
|
||||
* @node: used to append this struct to the @drm_gpu_scheduler.ring_mirror_list.
|
||||
* @work_tdr: schedules a delayed call to @drm_sched_job_timedout after the timeout
|
||||
* interval is over.
|
||||
* @id: a unique id assigned to each job scheduled on the scheduler.
|
||||
* @karma: increment on every hang caused by this job. If this exceeds the hang
|
||||
* limit of the scheduler then the job is marked guilty and will not
|
||||
|
|
@ -188,7 +193,6 @@ struct drm_sched_job {
|
|||
struct dma_fence_cb finish_cb;
|
||||
struct work_struct finish_work;
|
||||
struct list_head node;
|
||||
struct delayed_work work_tdr;
|
||||
uint64_t id;
|
||||
atomic_t karma;
|
||||
enum drm_sched_priority s_priority;
|
||||
|
|
@ -252,11 +256,14 @@ struct drm_sched_backend_ops {
|
|||
* finished.
|
||||
* @hw_rq_count: the number of jobs currently in the hardware queue.
|
||||
* @job_id_count: used to assign unique id to the each job.
|
||||
* @work_tdr: schedules a delayed call to @drm_sched_job_timedout after the
|
||||
* timeout interval is over.
|
||||
* @thread: the kthread on which the scheduler which run.
|
||||
* @ring_mirror_list: the list of jobs which are currently in the job queue.
|
||||
* @job_list_lock: lock to protect the ring_mirror_list.
|
||||
* @hang_limit: once the hangs by a job crosses this limit then it is marked
|
||||
* guilty and it will be considered for scheduling further.
|
||||
* @num_jobs: the number of jobs in queue in the scheduler
|
||||
*
|
||||
* One scheduler is implemented for each hardware ring.
|
||||
*/
|
||||
|
|
@ -270,10 +277,12 @@ struct drm_gpu_scheduler {
|
|||
wait_queue_head_t job_scheduled;
|
||||
atomic_t hw_rq_count;
|
||||
atomic64_t job_id_count;
|
||||
struct delayed_work work_tdr;
|
||||
struct task_struct *thread;
|
||||
struct list_head ring_mirror_list;
|
||||
spinlock_t job_list_lock;
|
||||
int hang_limit;
|
||||
atomic_t num_jobs;
|
||||
};
|
||||
|
||||
int drm_sched_init(struct drm_gpu_scheduler *sched,
|
||||
|
|
@ -281,6 +290,21 @@ int drm_sched_init(struct drm_gpu_scheduler *sched,
|
|||
uint32_t hw_submission, unsigned hang_limit, long timeout,
|
||||
const char *name);
|
||||
void drm_sched_fini(struct drm_gpu_scheduler *sched);
|
||||
int drm_sched_job_init(struct drm_sched_job *job,
|
||||
struct drm_sched_entity *entity,
|
||||
void *owner);
|
||||
void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
|
||||
void drm_sched_hw_job_reset(struct drm_gpu_scheduler *sched,
|
||||
struct drm_sched_job *job);
|
||||
void drm_sched_job_recovery(struct drm_gpu_scheduler *sched);
|
||||
bool drm_sched_dependency_optimized(struct dma_fence* fence,
|
||||
struct drm_sched_entity *entity);
|
||||
void drm_sched_job_kickout(struct drm_sched_job *s_job);
|
||||
|
||||
void drm_sched_rq_add_entity(struct drm_sched_rq *rq,
|
||||
struct drm_sched_entity *entity);
|
||||
void drm_sched_rq_remove_entity(struct drm_sched_rq *rq,
|
||||
struct drm_sched_entity *entity);
|
||||
|
||||
int drm_sched_entity_init(struct drm_sched_entity *entity,
|
||||
struct drm_sched_rq **rq_list,
|
||||
|
|
@ -289,23 +313,17 @@ int drm_sched_entity_init(struct drm_sched_entity *entity,
|
|||
long drm_sched_entity_flush(struct drm_sched_entity *entity, long timeout);
|
||||
void drm_sched_entity_fini(struct drm_sched_entity *entity);
|
||||
void drm_sched_entity_destroy(struct drm_sched_entity *entity);
|
||||
void drm_sched_entity_select_rq(struct drm_sched_entity *entity);
|
||||
struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity);
|
||||
void drm_sched_entity_push_job(struct drm_sched_job *sched_job,
|
||||
struct drm_sched_entity *entity);
|
||||
void drm_sched_entity_set_rq(struct drm_sched_entity *entity,
|
||||
struct drm_sched_rq *rq);
|
||||
void drm_sched_entity_set_priority(struct drm_sched_entity *entity,
|
||||
enum drm_sched_priority priority);
|
||||
bool drm_sched_entity_is_ready(struct drm_sched_entity *entity);
|
||||
|
||||
struct drm_sched_fence *drm_sched_fence_create(
|
||||
struct drm_sched_entity *s_entity, void *owner);
|
||||
void drm_sched_fence_scheduled(struct drm_sched_fence *fence);
|
||||
void drm_sched_fence_finished(struct drm_sched_fence *fence);
|
||||
int drm_sched_job_init(struct drm_sched_job *job,
|
||||
struct drm_sched_entity *entity,
|
||||
void *owner);
|
||||
void drm_sched_hw_job_reset(struct drm_gpu_scheduler *sched,
|
||||
struct drm_sched_job *job);
|
||||
void drm_sched_job_recovery(struct drm_gpu_scheduler *sched);
|
||||
bool drm_sched_dependency_optimized(struct dma_fence* fence,
|
||||
struct drm_sched_entity *entity);
|
||||
void drm_sched_job_kickout(struct drm_sched_job *s_job);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -386,6 +386,7 @@
|
|||
INTEL_VGA_DEVICE(0x3E91, info), /* SRV GT2 */ \
|
||||
INTEL_VGA_DEVICE(0x3E92, info), /* SRV GT2 */ \
|
||||
INTEL_VGA_DEVICE(0x3E96, info), /* SRV GT2 */ \
|
||||
INTEL_VGA_DEVICE(0x3E98, info), /* SRV GT2 */ \
|
||||
INTEL_VGA_DEVICE(0x3E9A, info) /* SRV GT2 */
|
||||
|
||||
/* CFL H */
|
||||
|
|
|
|||
|
|
@ -51,6 +51,8 @@ struct ttm_placement;
|
|||
|
||||
struct ttm_place;
|
||||
|
||||
struct ttm_lru_bulk_move;
|
||||
|
||||
/**
|
||||
* struct ttm_bus_placement
|
||||
*
|
||||
|
|
@ -310,6 +312,24 @@ ttm_bo_reference(struct ttm_buffer_object *bo)
|
|||
return bo;
|
||||
}
|
||||
|
||||
/**
|
||||
* ttm_bo_get_unless_zero - reference a struct ttm_buffer_object unless
|
||||
* its refcount has already reached zero.
|
||||
* @bo: The buffer object.
|
||||
*
|
||||
* Used to reference a TTM buffer object in lookups where the object is removed
|
||||
* from the lookup structure during the destructor and for RCU lookups.
|
||||
*
|
||||
* Returns: @bo if the referencing was successful, NULL otherwise.
|
||||
*/
|
||||
static inline __must_check struct ttm_buffer_object *
|
||||
ttm_bo_get_unless_zero(struct ttm_buffer_object *bo)
|
||||
{
|
||||
if (!kref_get_unless_zero(&bo->kref))
|
||||
return NULL;
|
||||
return bo;
|
||||
}
|
||||
|
||||
/**
|
||||
* ttm_bo_wait - wait for buffer idle.
|
||||
*
|
||||
|
|
@ -405,12 +425,24 @@ void ttm_bo_del_from_lru(struct ttm_buffer_object *bo);
|
|||
* ttm_bo_move_to_lru_tail
|
||||
*
|
||||
* @bo: The buffer object.
|
||||
* @bulk: optional bulk move structure to remember BO positions
|
||||
*
|
||||
* Move this BO to the tail of all lru lists used to lookup and reserve an
|
||||
* object. This function must be called with struct ttm_bo_global::lru_lock
|
||||
* held, and is used to make a BO less likely to be considered for eviction.
|
||||
*/
|
||||
void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo);
|
||||
void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo,
|
||||
struct ttm_lru_bulk_move *bulk);
|
||||
|
||||
/**
|
||||
* ttm_bo_bulk_move_lru_tail
|
||||
*
|
||||
* @bulk: bulk move structure
|
||||
*
|
||||
* Bulk move BOs to the LRU tail, only valid to use when driver makes sure that
|
||||
* BO order never changes. Should be called with ttm_bo_global::lru_lock held.
|
||||
*/
|
||||
void ttm_bo_bulk_move_lru_tail(struct ttm_lru_bulk_move *bulk);
|
||||
|
||||
/**
|
||||
* ttm_bo_lock_delayed_workqueue
|
||||
|
|
|
|||
|
|
@ -490,6 +490,34 @@ struct ttm_bo_device {
|
|||
bool no_retry;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ttm_lru_bulk_move_pos
|
||||
*
|
||||
* @first: first BO in the bulk move range
|
||||
* @last: last BO in the bulk move range
|
||||
*
|
||||
* Positions for a lru bulk move.
|
||||
*/
|
||||
struct ttm_lru_bulk_move_pos {
|
||||
struct ttm_buffer_object *first;
|
||||
struct ttm_buffer_object *last;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ttm_lru_bulk_move
|
||||
*
|
||||
* @tt: first/last lru entry for BOs in the TT domain
|
||||
* @vram: first/last lru entry for BOs in the VRAM domain
|
||||
* @swap: first/last lru entry for BOs on the swap list
|
||||
*
|
||||
* Helper structure for bulk moves on the LRU list.
|
||||
*/
|
||||
struct ttm_lru_bulk_move {
|
||||
struct ttm_lru_bulk_move_pos tt[TTM_MAX_BO_PRIORITY];
|
||||
struct ttm_lru_bulk_move_pos vram[TTM_MAX_BO_PRIORITY];
|
||||
struct ttm_lru_bulk_move_pos swap[TTM_MAX_BO_PRIORITY];
|
||||
};
|
||||
|
||||
/**
|
||||
* ttm_flag_masked
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1,248 +0,0 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright (c) 2007-2009 VMware, Inc., Palo Alto, CA., USA
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
/*
|
||||
* Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
|
||||
*/
|
||||
|
||||
/** @file ttm_lock.h
|
||||
* This file implements a simple replacement for the buffer manager use
|
||||
* of the DRM heavyweight hardware lock.
|
||||
* The lock is a read-write lock. Taking it in read mode and write mode
|
||||
* is relatively fast, and intended for in-kernel use only.
|
||||
*
|
||||
* The vt mode is used only when there is a need to block all
|
||||
* user-space processes from validating buffers.
|
||||
* It's allowed to leave kernel space with the vt lock held.
|
||||
* If a user-space process dies while having the vt-lock,
|
||||
* it will be released during the file descriptor release. The vt lock
|
||||
* excludes write lock and read lock.
|
||||
*
|
||||
* The suspend mode is used to lock out all TTM users when preparing for
|
||||
* and executing suspend operations.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _TTM_LOCK_H_
|
||||
#define _TTM_LOCK_H_
|
||||
|
||||
#include <linux/wait.h>
|
||||
#include <linux/atomic.h>
|
||||
|
||||
#include "ttm_object.h"
|
||||
|
||||
/**
|
||||
* struct ttm_lock
|
||||
*
|
||||
* @base: ttm base object used solely to release the lock if the client
|
||||
* holding the lock dies.
|
||||
* @queue: Queue for processes waiting for lock change-of-status.
|
||||
* @lock: Spinlock protecting some lock members.
|
||||
* @rw: Read-write lock counter. Protected by @lock.
|
||||
* @flags: Lock state. Protected by @lock.
|
||||
* @kill_takers: Boolean whether to kill takers of the lock.
|
||||
* @signal: Signal to send when kill_takers is true.
|
||||
*/
|
||||
|
||||
struct ttm_lock {
|
||||
struct ttm_base_object base;
|
||||
wait_queue_head_t queue;
|
||||
spinlock_t lock;
|
||||
int32_t rw;
|
||||
uint32_t flags;
|
||||
bool kill_takers;
|
||||
int signal;
|
||||
struct ttm_object_file *vt_holder;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* ttm_lock_init
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
* Initializes the lock.
|
||||
*/
|
||||
extern void ttm_lock_init(struct ttm_lock *lock);
|
||||
|
||||
/**
|
||||
* ttm_read_unlock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
*
|
||||
* Releases a read lock.
|
||||
*/
|
||||
extern void ttm_read_unlock(struct ttm_lock *lock);
|
||||
|
||||
/**
|
||||
* ttm_read_lock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
* @interruptible: Interruptible sleeping while waiting for a lock.
|
||||
*
|
||||
* Takes the lock in read mode.
|
||||
* Returns:
|
||||
* -ERESTARTSYS If interrupted by a signal and interruptible is true.
|
||||
*/
|
||||
extern int ttm_read_lock(struct ttm_lock *lock, bool interruptible);
|
||||
|
||||
/**
|
||||
* ttm_read_trylock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
* @interruptible: Interruptible sleeping while waiting for a lock.
|
||||
*
|
||||
* Tries to take the lock in read mode. If the lock is already held
|
||||
* in write mode, the function will return -EBUSY. If the lock is held
|
||||
* in vt or suspend mode, the function will sleep until these modes
|
||||
* are unlocked.
|
||||
*
|
||||
* Returns:
|
||||
* -EBUSY The lock was already held in write mode.
|
||||
* -ERESTARTSYS If interrupted by a signal and interruptible is true.
|
||||
*/
|
||||
extern int ttm_read_trylock(struct ttm_lock *lock, bool interruptible);
|
||||
|
||||
/**
|
||||
* ttm_write_unlock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
*
|
||||
* Releases a write lock.
|
||||
*/
|
||||
extern void ttm_write_unlock(struct ttm_lock *lock);
|
||||
|
||||
/**
|
||||
* ttm_write_lock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
* @interruptible: Interruptible sleeping while waiting for a lock.
|
||||
*
|
||||
* Takes the lock in write mode.
|
||||
* Returns:
|
||||
* -ERESTARTSYS If interrupted by a signal and interruptible is true.
|
||||
*/
|
||||
extern int ttm_write_lock(struct ttm_lock *lock, bool interruptible);
|
||||
|
||||
/**
|
||||
* ttm_lock_downgrade
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
*
|
||||
* Downgrades a write lock to a read lock.
|
||||
*/
|
||||
extern void ttm_lock_downgrade(struct ttm_lock *lock);
|
||||
|
||||
/**
|
||||
* ttm_suspend_lock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
*
|
||||
* Takes the lock in suspend mode. Excludes read and write mode.
|
||||
*/
|
||||
extern void ttm_suspend_lock(struct ttm_lock *lock);
|
||||
|
||||
/**
|
||||
* ttm_suspend_unlock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
*
|
||||
* Releases a suspend lock
|
||||
*/
|
||||
extern void ttm_suspend_unlock(struct ttm_lock *lock);
|
||||
|
||||
/**
|
||||
* ttm_vt_lock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
* @interruptible: Interruptible sleeping while waiting for a lock.
|
||||
* @tfile: Pointer to a struct ttm_object_file to register the lock with.
|
||||
*
|
||||
* Takes the lock in vt mode.
|
||||
* Returns:
|
||||
* -ERESTARTSYS If interrupted by a signal and interruptible is true.
|
||||
* -ENOMEM: Out of memory when locking.
|
||||
*/
|
||||
extern int ttm_vt_lock(struct ttm_lock *lock, bool interruptible,
|
||||
struct ttm_object_file *tfile);
|
||||
|
||||
/**
|
||||
* ttm_vt_unlock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
*
|
||||
* Releases a vt lock.
|
||||
* Returns:
|
||||
* -EINVAL If the lock was not held.
|
||||
*/
|
||||
extern int ttm_vt_unlock(struct ttm_lock *lock);
|
||||
|
||||
/**
|
||||
* ttm_write_unlock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
*
|
||||
* Releases a write lock.
|
||||
*/
|
||||
extern void ttm_write_unlock(struct ttm_lock *lock);
|
||||
|
||||
/**
|
||||
* ttm_write_lock
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
* @interruptible: Interruptible sleeping while waiting for a lock.
|
||||
*
|
||||
* Takes the lock in write mode.
|
||||
* Returns:
|
||||
* -ERESTARTSYS If interrupted by a signal and interruptible is true.
|
||||
*/
|
||||
extern int ttm_write_lock(struct ttm_lock *lock, bool interruptible);
|
||||
|
||||
/**
|
||||
* ttm_lock_set_kill
|
||||
*
|
||||
* @lock: Pointer to a struct ttm_lock
|
||||
* @val: Boolean whether to kill processes taking the lock.
|
||||
* @signal: Signal to send to the process taking the lock.
|
||||
*
|
||||
* The kill-when-taking-lock functionality is used to kill processes that keep
|
||||
* on using the TTM functionality when its resources has been taken down, for
|
||||
* example when the X server exits. A typical sequence would look like this:
|
||||
* - X server takes lock in write mode.
|
||||
* - ttm_lock_set_kill() is called with @val set to true.
|
||||
* - As part of X server exit, TTM resources are taken down.
|
||||
* - X server releases the lock on file release.
|
||||
* - Another dri client wants to render, takes the lock and is killed.
|
||||
*
|
||||
*/
|
||||
static inline void ttm_lock_set_kill(struct ttm_lock *lock, bool val,
|
||||
int signal)
|
||||
{
|
||||
lock->kill_takers = val;
|
||||
if (val)
|
||||
lock->signal = signal;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1,354 +0,0 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright (c) 2006-2009 VMware, Inc., Palo Alto, CA., USA
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
/*
|
||||
* Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
|
||||
*/
|
||||
/** @file ttm_object.h
|
||||
*
|
||||
* Base- and reference object implementation for the various
|
||||
* ttm objects. Implements reference counting, minimal security checks
|
||||
* and release on file close.
|
||||
*/
|
||||
|
||||
#ifndef _TTM_OBJECT_H_
|
||||
#define _TTM_OBJECT_H_
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <drm/drm_hashtab.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/dma-buf.h>
|
||||
|
||||
#include "ttm_memory.h"
|
||||
|
||||
/**
|
||||
* enum ttm_ref_type
|
||||
*
|
||||
* Describes what type of reference a ref object holds.
|
||||
*
|
||||
* TTM_REF_USAGE is a simple refcount on a base object.
|
||||
*
|
||||
* TTM_REF_SYNCCPU_READ is a SYNCCPU_READ reference on a
|
||||
* buffer object.
|
||||
*
|
||||
* TTM_REF_SYNCCPU_WRITE is a SYNCCPU_WRITE reference on a
|
||||
* buffer object.
|
||||
*
|
||||
*/
|
||||
|
||||
enum ttm_ref_type {
|
||||
TTM_REF_USAGE,
|
||||
TTM_REF_SYNCCPU_READ,
|
||||
TTM_REF_SYNCCPU_WRITE,
|
||||
TTM_REF_NUM
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ttm_object_type
|
||||
*
|
||||
* One entry per ttm object type.
|
||||
* Device-specific types should use the
|
||||
* ttm_driver_typex types.
|
||||
*/
|
||||
|
||||
enum ttm_object_type {
|
||||
ttm_fence_type,
|
||||
ttm_buffer_type,
|
||||
ttm_lock_type,
|
||||
ttm_prime_type,
|
||||
ttm_driver_type0 = 256,
|
||||
ttm_driver_type1,
|
||||
ttm_driver_type2,
|
||||
ttm_driver_type3,
|
||||
ttm_driver_type4,
|
||||
ttm_driver_type5
|
||||
};
|
||||
|
||||
struct ttm_object_file;
|
||||
struct ttm_object_device;
|
||||
|
||||
/**
|
||||
* struct ttm_base_object
|
||||
*
|
||||
* @hash: hash entry for the per-device object hash.
|
||||
* @type: derived type this object is base class for.
|
||||
* @shareable: Other ttm_object_files can access this object.
|
||||
*
|
||||
* @tfile: Pointer to ttm_object_file of the creator.
|
||||
* NULL if the object was not created by a user request.
|
||||
* (kernel object).
|
||||
*
|
||||
* @refcount: Number of references to this object, not
|
||||
* including the hash entry. A reference to a base object can
|
||||
* only be held by a ref object.
|
||||
*
|
||||
* @refcount_release: A function to be called when there are
|
||||
* no more references to this object. This function should
|
||||
* destroy the object (or make sure destruction eventually happens),
|
||||
* and when it is called, the object has
|
||||
* already been taken out of the per-device hash. The parameter
|
||||
* "base" should be set to NULL by the function.
|
||||
*
|
||||
* @ref_obj_release: A function to be called when a reference object
|
||||
* with another ttm_ref_type than TTM_REF_USAGE is deleted.
|
||||
* This function may, for example, release a lock held by a user-space
|
||||
* process.
|
||||
*
|
||||
* This struct is intended to be used as a base struct for objects that
|
||||
* are visible to user-space. It provides a global name, race-safe
|
||||
* access and refcounting, minimal access contol and hooks for unref actions.
|
||||
*/
|
||||
|
||||
struct ttm_base_object {
|
||||
struct rcu_head rhead;
|
||||
struct drm_hash_item hash;
|
||||
enum ttm_object_type object_type;
|
||||
bool shareable;
|
||||
struct ttm_object_file *tfile;
|
||||
struct kref refcount;
|
||||
void (*refcount_release) (struct ttm_base_object **base);
|
||||
void (*ref_obj_release) (struct ttm_base_object *base,
|
||||
enum ttm_ref_type ref_type);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* struct ttm_prime_object - Modified base object that is prime-aware
|
||||
*
|
||||
* @base: struct ttm_base_object that we derive from
|
||||
* @mutex: Mutex protecting the @dma_buf member.
|
||||
* @size: Size of the dma_buf associated with this object
|
||||
* @real_type: Type of the underlying object. Needed since we're setting
|
||||
* the value of @base::object_type to ttm_prime_type
|
||||
* @dma_buf: Non ref-coutned pointer to a struct dma_buf created from this
|
||||
* object.
|
||||
* @refcount_release: The underlying object's release method. Needed since
|
||||
* we set @base::refcount_release to our own release method.
|
||||
*/
|
||||
|
||||
struct ttm_prime_object {
|
||||
struct ttm_base_object base;
|
||||
struct mutex mutex;
|
||||
size_t size;
|
||||
enum ttm_object_type real_type;
|
||||
struct dma_buf *dma_buf;
|
||||
void (*refcount_release) (struct ttm_base_object **);
|
||||
};
|
||||
|
||||
/**
|
||||
* ttm_base_object_init
|
||||
*
|
||||
* @tfile: Pointer to a struct ttm_object_file.
|
||||
* @base: The struct ttm_base_object to initialize.
|
||||
* @shareable: This object is shareable with other applcations.
|
||||
* (different @tfile pointers.)
|
||||
* @type: The object type.
|
||||
* @refcount_release: See the struct ttm_base_object description.
|
||||
* @ref_obj_release: See the struct ttm_base_object description.
|
||||
*
|
||||
* Initializes a struct ttm_base_object.
|
||||
*/
|
||||
|
||||
extern int ttm_base_object_init(struct ttm_object_file *tfile,
|
||||
struct ttm_base_object *base,
|
||||
bool shareable,
|
||||
enum ttm_object_type type,
|
||||
void (*refcount_release) (struct ttm_base_object
|
||||
**),
|
||||
void (*ref_obj_release) (struct ttm_base_object
|
||||
*,
|
||||
enum ttm_ref_type
|
||||
ref_type));
|
||||
|
||||
/**
|
||||
* ttm_base_object_lookup
|
||||
*
|
||||
* @tfile: Pointer to a struct ttm_object_file.
|
||||
* @key: Hash key
|
||||
*
|
||||
* Looks up a struct ttm_base_object with the key @key.
|
||||
*/
|
||||
|
||||
extern struct ttm_base_object *ttm_base_object_lookup(struct ttm_object_file
|
||||
*tfile, uint32_t key);
|
||||
|
||||
/**
|
||||
* ttm_base_object_lookup_for_ref
|
||||
*
|
||||
* @tdev: Pointer to a struct ttm_object_device.
|
||||
* @key: Hash key
|
||||
*
|
||||
* Looks up a struct ttm_base_object with the key @key.
|
||||
* This function should only be used when the struct tfile associated with the
|
||||
* caller doesn't yet have a reference to the base object.
|
||||
*/
|
||||
|
||||
extern struct ttm_base_object *
|
||||
ttm_base_object_lookup_for_ref(struct ttm_object_device *tdev, uint32_t key);
|
||||
|
||||
/**
|
||||
* ttm_base_object_unref
|
||||
*
|
||||
* @p_base: Pointer to a pointer referencing a struct ttm_base_object.
|
||||
*
|
||||
* Decrements the base object refcount and clears the pointer pointed to by
|
||||
* p_base.
|
||||
*/
|
||||
|
||||
extern void ttm_base_object_unref(struct ttm_base_object **p_base);
|
||||
|
||||
/**
|
||||
* ttm_ref_object_add.
|
||||
*
|
||||
* @tfile: A struct ttm_object_file representing the application owning the
|
||||
* ref_object.
|
||||
* @base: The base object to reference.
|
||||
* @ref_type: The type of reference.
|
||||
* @existed: Upon completion, indicates that an identical reference object
|
||||
* already existed, and the refcount was upped on that object instead.
|
||||
* @require_existed: Fail with -EPERM if an identical ref object didn't
|
||||
* already exist.
|
||||
*
|
||||
* Checks that the base object is shareable and adds a ref object to it.
|
||||
*
|
||||
* Adding a ref object to a base object is basically like referencing the
|
||||
* base object, but a user-space application holds the reference. When the
|
||||
* file corresponding to @tfile is closed, all its reference objects are
|
||||
* deleted. A reference object can have different types depending on what
|
||||
* it's intended for. It can be refcounting to prevent object destruction,
|
||||
* When user-space takes a lock, it can add a ref object to that lock to
|
||||
* make sure the lock is released if the application dies. A ref object
|
||||
* will hold a single reference on a base object.
|
||||
*/
|
||||
extern int ttm_ref_object_add(struct ttm_object_file *tfile,
|
||||
struct ttm_base_object *base,
|
||||
enum ttm_ref_type ref_type, bool *existed,
|
||||
bool require_existed);
|
||||
|
||||
extern bool ttm_ref_object_exists(struct ttm_object_file *tfile,
|
||||
struct ttm_base_object *base);
|
||||
|
||||
/**
|
||||
* ttm_ref_object_base_unref
|
||||
*
|
||||
* @key: Key representing the base object.
|
||||
* @ref_type: Ref type of the ref object to be dereferenced.
|
||||
*
|
||||
* Unreference a ref object with type @ref_type
|
||||
* on the base object identified by @key. If there are no duplicate
|
||||
* references, the ref object will be destroyed and the base object
|
||||
* will be unreferenced.
|
||||
*/
|
||||
extern int ttm_ref_object_base_unref(struct ttm_object_file *tfile,
|
||||
unsigned long key,
|
||||
enum ttm_ref_type ref_type);
|
||||
|
||||
/**
|
||||
* ttm_object_file_init - initialize a struct ttm_object file
|
||||
*
|
||||
* @tdev: A struct ttm_object device this file is initialized on.
|
||||
* @hash_order: Order of the hash table used to hold the reference objects.
|
||||
*
|
||||
* This is typically called by the file_ops::open function.
|
||||
*/
|
||||
|
||||
extern struct ttm_object_file *ttm_object_file_init(struct ttm_object_device
|
||||
*tdev,
|
||||
unsigned int hash_order);
|
||||
|
||||
/**
|
||||
* ttm_object_file_release - release data held by a ttm_object_file
|
||||
*
|
||||
* @p_tfile: Pointer to pointer to the ttm_object_file object to release.
|
||||
* *p_tfile will be set to NULL by this function.
|
||||
*
|
||||
* Releases all data associated by a ttm_object_file.
|
||||
* Typically called from file_ops::release. The caller must
|
||||
* ensure that there are no concurrent users of tfile.
|
||||
*/
|
||||
|
||||
extern void ttm_object_file_release(struct ttm_object_file **p_tfile);
|
||||
|
||||
/**
|
||||
* ttm_object device init - initialize a struct ttm_object_device
|
||||
*
|
||||
* @mem_glob: struct ttm_mem_global for memory accounting.
|
||||
* @hash_order: Order of hash table used to hash the base objects.
|
||||
* @ops: DMA buf ops for prime objects of this device.
|
||||
*
|
||||
* This function is typically called on device initialization to prepare
|
||||
* data structures needed for ttm base and ref objects.
|
||||
*/
|
||||
|
||||
extern struct ttm_object_device *
|
||||
ttm_object_device_init(struct ttm_mem_global *mem_glob,
|
||||
unsigned int hash_order,
|
||||
const struct dma_buf_ops *ops);
|
||||
|
||||
/**
|
||||
* ttm_object_device_release - release data held by a ttm_object_device
|
||||
*
|
||||
* @p_tdev: Pointer to pointer to the ttm_object_device object to release.
|
||||
* *p_tdev will be set to NULL by this function.
|
||||
*
|
||||
* Releases all data associated by a ttm_object_device.
|
||||
* Typically called from driver::unload before the destruction of the
|
||||
* device private data structure.
|
||||
*/
|
||||
|
||||
extern void ttm_object_device_release(struct ttm_object_device **p_tdev);
|
||||
|
||||
#define ttm_base_object_kfree(__object, __base)\
|
||||
kfree_rcu(__object, __base.rhead)
|
||||
|
||||
extern int ttm_prime_object_init(struct ttm_object_file *tfile,
|
||||
size_t size,
|
||||
struct ttm_prime_object *prime,
|
||||
bool shareable,
|
||||
enum ttm_object_type type,
|
||||
void (*refcount_release)
|
||||
(struct ttm_base_object **),
|
||||
void (*ref_obj_release)
|
||||
(struct ttm_base_object *,
|
||||
enum ttm_ref_type ref_type));
|
||||
|
||||
static inline enum ttm_object_type
|
||||
ttm_base_object_type(struct ttm_base_object *base)
|
||||
{
|
||||
return (base->object_type == ttm_prime_type) ?
|
||||
container_of(base, struct ttm_prime_object, base)->real_type :
|
||||
base->object_type;
|
||||
}
|
||||
extern int ttm_prime_fd_to_handle(struct ttm_object_file *tfile,
|
||||
int fd, u32 *handle);
|
||||
extern int ttm_prime_handle_to_fd(struct ttm_object_file *tfile,
|
||||
uint32_t handle, uint32_t flags,
|
||||
int *prime_fd);
|
||||
|
||||
#define ttm_prime_object_kfree(__obj, __prime) \
|
||||
kfree_rcu(__obj, __prime.base.rhead)
|
||||
#endif
|
||||
Loading…
Reference in a new issue