mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
Merge 0dfc70818a ("Merge tag 'drm-misc-next-2021-09-16' of git://anongit.freedesktop.org/drm/drm-misc into drm-next") into android-mainline
Steps on the way to 5.16-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I272d0d7715f18a76620785eb5f2ec0591cd07a6c
This commit is contained in:
@@ -45,11 +45,12 @@ struct dma_heap_attachment {
|
||||
bool uncached;
|
||||
};
|
||||
|
||||
#define LOW_ORDER_GFP (GFP_HIGHUSER | __GFP_ZERO | __GFP_COMP)
|
||||
#define MID_ORDER_GFP (LOW_ORDER_GFP | __GFP_NOWARN)
|
||||
#define HIGH_ORDER_GFP (((GFP_HIGHUSER | __GFP_ZERO | __GFP_NOWARN \
|
||||
| __GFP_NORETRY) & ~__GFP_RECLAIM) \
|
||||
| __GFP_COMP)
|
||||
#define LOW_ORDER_GFP (GFP_HIGHUSER | __GFP_ZERO | __GFP_COMP)
|
||||
static gfp_t order_flags[] = {HIGH_ORDER_GFP, LOW_ORDER_GFP, LOW_ORDER_GFP};
|
||||
static gfp_t order_flags[] = {HIGH_ORDER_GFP, MID_ORDER_GFP, LOW_ORDER_GFP};
|
||||
/*
|
||||
* The selection of the orders used for allocation (1MB, 64K, 4K) is designed
|
||||
* to match with the sizes often found in IOMMUs. Using order 4 pages instead
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <drm/drm_atomic_state_helper.h>
|
||||
#include <drm/drm_bridge.h>
|
||||
#include <drm/drm_encoder.h>
|
||||
#include <drm/drm_of.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include "drm_crtc_internal.h"
|
||||
@@ -51,10 +52,8 @@
|
||||
*
|
||||
* Display drivers are responsible for linking encoders with the first bridge
|
||||
* in the chains. This is done by acquiring the appropriate bridge with
|
||||
* of_drm_find_bridge() or drm_of_find_panel_or_bridge(), or creating it for a
|
||||
* panel with drm_panel_bridge_add_typed() (or the managed version
|
||||
* devm_drm_panel_bridge_add_typed()). Once acquired, the bridge shall be
|
||||
* attached to the encoder with a call to drm_bridge_attach().
|
||||
* devm_drm_of_get_bridge(). Once acquired, the bridge shall be attached to the
|
||||
* encoder with a call to drm_bridge_attach().
|
||||
*
|
||||
* Bridges are responsible for linking themselves with the next bridge in the
|
||||
* chain, if any. This is done the same way as for encoders, with the call to
|
||||
@@ -1233,6 +1232,40 @@ struct drm_bridge *of_drm_find_bridge(struct device_node *np)
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(of_drm_find_bridge);
|
||||
|
||||
/**
|
||||
* devm_drm_of_get_bridge - Return next bridge in the chain
|
||||
* @dev: device to tie the bridge lifetime to
|
||||
* @np: device tree node containing encoder output ports
|
||||
* @port: port in the device tree node
|
||||
* @endpoint: endpoint in the device tree node
|
||||
*
|
||||
* Given a DT node's port and endpoint number, finds the connected node
|
||||
* and returns the associated bridge if any, or creates and returns a
|
||||
* drm panel bridge instance if a panel is connected.
|
||||
*
|
||||
* Returns a pointer to the bridge if successful, or an error pointer
|
||||
* otherwise.
|
||||
*/
|
||||
struct drm_bridge *devm_drm_of_get_bridge(struct device *dev,
|
||||
struct device_node *np,
|
||||
u32 port, u32 endpoint)
|
||||
{
|
||||
struct drm_bridge *bridge;
|
||||
struct drm_panel *panel;
|
||||
int ret;
|
||||
|
||||
ret = drm_of_find_panel_or_bridge(np, port, endpoint,
|
||||
&panel, &bridge);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
if (panel)
|
||||
bridge = devm_drm_panel_bridge_add(dev, panel);
|
||||
|
||||
return bridge;
|
||||
}
|
||||
EXPORT_SYMBOL(devm_drm_of_get_bridge);
|
||||
#endif
|
||||
|
||||
MODULE_AUTHOR("Ajay Kumar <ajaykumar.rs@samsung.com>");
|
||||
|
||||
@@ -231,6 +231,9 @@ EXPORT_SYMBOL_GPL(drm_of_encoder_active_endpoint);
|
||||
* return either the associated struct drm_panel or drm_bridge device. Either
|
||||
* @panel or @bridge must not be NULL.
|
||||
*
|
||||
* This function is deprecated and should not be used in new drivers. Use
|
||||
* devm_drm_of_get_bridge() instead.
|
||||
*
|
||||
* Returns zero if successful, or one of the standard error codes if it fails.
|
||||
*/
|
||||
int drm_of_find_panel_or_bridge(const struct device_node *np,
|
||||
|
||||
@@ -36,10 +36,10 @@
|
||||
/* manage releaseables */
|
||||
/* stack them 16 high for now -drawable object is 191 */
|
||||
#define RELEASE_SIZE 256
|
||||
#define RELEASES_PER_BO (4096 / RELEASE_SIZE)
|
||||
#define RELEASES_PER_BO (PAGE_SIZE / RELEASE_SIZE)
|
||||
/* put an alloc/dealloc surface cmd into one bo and round up to 128 */
|
||||
#define SURFACE_RELEASE_SIZE 128
|
||||
#define SURFACE_RELEASES_PER_BO (4096 / SURFACE_RELEASE_SIZE)
|
||||
#define SURFACE_RELEASES_PER_BO (PAGE_SIZE / SURFACE_RELEASE_SIZE)
|
||||
|
||||
static const int release_size_per_bo[] = { RELEASE_SIZE, SURFACE_RELEASE_SIZE, RELEASE_SIZE };
|
||||
static const int releases_per_bo[] = { RELEASES_PER_BO, SURFACE_RELEASES_PER_BO, RELEASES_PER_BO };
|
||||
|
||||
@@ -827,15 +827,6 @@ drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched)
|
||||
{
|
||||
struct drm_sched_job *job, *next;
|
||||
|
||||
/*
|
||||
* Don't destroy jobs while the timeout worker is running OR thread
|
||||
* is being parked and hence assumed to not touch pending_list
|
||||
*/
|
||||
if ((sched->timeout != MAX_SCHEDULE_TIMEOUT &&
|
||||
!cancel_delayed_work(&sched->work_tdr)) ||
|
||||
kthread_should_park())
|
||||
return NULL;
|
||||
|
||||
spin_lock(&sched->job_list_lock);
|
||||
|
||||
job = list_first_entry_or_null(&sched->pending_list,
|
||||
@@ -844,17 +835,21 @@ drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched)
|
||||
if (job && dma_fence_is_signaled(&job->s_fence->finished)) {
|
||||
/* remove job from pending_list */
|
||||
list_del_init(&job->list);
|
||||
|
||||
/* cancel this job's TO timer */
|
||||
cancel_delayed_work(&sched->work_tdr);
|
||||
/* make the scheduled timestamp more accurate */
|
||||
next = list_first_entry_or_null(&sched->pending_list,
|
||||
typeof(*next), list);
|
||||
if (next)
|
||||
|
||||
if (next) {
|
||||
next->s_fence->scheduled.timestamp =
|
||||
job->s_fence->finished.timestamp;
|
||||
|
||||
/* start TO timer for next job */
|
||||
drm_sched_start_timeout(sched);
|
||||
}
|
||||
} else {
|
||||
job = NULL;
|
||||
/* queue timeout for next job */
|
||||
drm_sched_start_timeout(sched);
|
||||
}
|
||||
|
||||
spin_unlock(&sched->job_list_lock);
|
||||
@@ -942,11 +937,8 @@ static int drm_sched_main(void *param)
|
||||
(entity = drm_sched_select_entity(sched))) ||
|
||||
kthread_should_stop());
|
||||
|
||||
if (cleanup_job) {
|
||||
if (cleanup_job)
|
||||
sched->ops->free_job(cleanup_job);
|
||||
/* queue timeout for next job */
|
||||
drm_sched_start_timeout(sched);
|
||||
}
|
||||
|
||||
if (!entity)
|
||||
continue;
|
||||
|
||||
@@ -63,6 +63,7 @@ MODULE_PARM_DESC(defy, "default y resolution");
|
||||
|
||||
enum bochs_types {
|
||||
BOCHS_QEMU_STDVGA,
|
||||
BOCHS_SIMICS,
|
||||
BOCHS_UNKNOWN,
|
||||
};
|
||||
|
||||
@@ -695,6 +696,13 @@ static const struct pci_device_id bochs_pci_tbl[] = {
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.driver_data = BOCHS_UNKNOWN,
|
||||
},
|
||||
{
|
||||
.vendor = 0x4321,
|
||||
.device = 0x1111,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.driver_data = BOCHS_SIMICS,
|
||||
},
|
||||
{ /* end of list */ }
|
||||
};
|
||||
|
||||
|
||||
@@ -197,8 +197,8 @@ v3d_clean_caches(struct v3d_dev *v3d)
|
||||
|
||||
V3D_CORE_WRITE(core, V3D_CTL_L2TCACTL, V3D_L2TCACTL_TMUWCF);
|
||||
if (wait_for(!(V3D_CORE_READ(core, V3D_CTL_L2TCACTL) &
|
||||
V3D_L2TCACTL_L2TFLS), 100)) {
|
||||
DRM_ERROR("Timeout waiting for L1T write combiner flush\n");
|
||||
V3D_L2TCACTL_TMUWCF), 100)) {
|
||||
DRM_ERROR("Timeout waiting for TMU write combiner flush\n");
|
||||
}
|
||||
|
||||
mutex_lock(&v3d->cache_clean_lock);
|
||||
|
||||
@@ -229,26 +229,19 @@ static const struct of_device_id vc4_dpi_dt_match[] = {
|
||||
static int vc4_dpi_init_bridge(struct vc4_dpi *dpi)
|
||||
{
|
||||
struct device *dev = &dpi->pdev->dev;
|
||||
struct drm_panel *panel;
|
||||
struct drm_bridge *bridge;
|
||||
int ret;
|
||||
|
||||
ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0,
|
||||
&panel, &bridge);
|
||||
if (ret) {
|
||||
bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
|
||||
if (IS_ERR(bridge)) {
|
||||
/* If nothing was connected in the DT, that's not an
|
||||
* error.
|
||||
*/
|
||||
if (ret == -ENODEV)
|
||||
if (PTR_ERR(bridge) == -ENODEV)
|
||||
return 0;
|
||||
else
|
||||
return ret;
|
||||
return PTR_ERR(bridge);
|
||||
}
|
||||
|
||||
if (panel)
|
||||
bridge = drm_panel_bridge_add_typed(panel,
|
||||
DRM_MODE_CONNECTOR_DPI);
|
||||
|
||||
return drm_bridge_attach(dpi->encoder, bridge, NULL, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1497,7 +1497,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
|
||||
struct drm_device *drm = dev_get_drvdata(master);
|
||||
struct vc4_dsi *dsi = dev_get_drvdata(dev);
|
||||
struct vc4_dsi_encoder *vc4_dsi_encoder;
|
||||
struct drm_panel *panel;
|
||||
const struct of_device_id *match;
|
||||
dma_cap_mask_t dma_mask;
|
||||
int ret;
|
||||
@@ -1609,27 +1608,9 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0,
|
||||
&panel, &dsi->bridge);
|
||||
if (ret) {
|
||||
/* If the bridge or panel pointed by dev->of_node is not
|
||||
* enabled, just return 0 here so that we don't prevent the DRM
|
||||
* dev from being registered. Of course that means the DSI
|
||||
* encoder won't be exposed, but that's not a problem since
|
||||
* nothing is connected to it.
|
||||
*/
|
||||
if (ret == -ENODEV)
|
||||
return 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (panel) {
|
||||
dsi->bridge = devm_drm_panel_bridge_add_typed(dev, panel,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
if (IS_ERR(dsi->bridge))
|
||||
return PTR_ERR(dsi->bridge);
|
||||
}
|
||||
dsi->bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
|
||||
if (IS_ERR(dsi->bridge))
|
||||
return PTR_ERR(dsi->bridge);
|
||||
|
||||
/* The esc clock rate is supposed to always be 100Mhz. */
|
||||
ret = clk_set_rate(dsi->escape_clock, 100 * 1000000);
|
||||
@@ -1667,8 +1648,7 @@ static void vc4_dsi_unbind(struct device *dev, struct device *master,
|
||||
{
|
||||
struct vc4_dsi *dsi = dev_get_drvdata(dev);
|
||||
|
||||
if (dsi->bridge)
|
||||
pm_runtime_disable(dev);
|
||||
pm_runtime_disable(dev);
|
||||
|
||||
/*
|
||||
* Restore the bridge_chain so the bridge detach procedure can happen
|
||||
|
||||
@@ -911,6 +911,8 @@ struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
|
||||
struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev,
|
||||
struct drm_panel *panel,
|
||||
u32 connector_type);
|
||||
struct drm_bridge *devm_drm_of_get_bridge(struct device *dev, struct device_node *node,
|
||||
u32 port, u32 endpoint);
|
||||
struct drm_connector *drm_panel_bridge_connector(struct drm_bridge *bridge);
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user