Multiple fixes for nouveau around memory safety and DisplayPort, one fix
to reduce the log level of rockchip, a power state fix for the it6505 bridge, a timing fix for the lt9611 bridge, a cache maintenance fix for ivpu and one to reset vma->vm_ops on mmap for shmem-helper. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRcEzekXsqa64kGDp7j7w1vZxhRxQUCZNSJGAAKCRDj7w1vZxhR xRFgAQDA3tLyItU/xoh1RcwBXS4YjqA6357uh1/atYg65juGogEArrrUWQtDArZj 3AgmsDfwyUC/LOmPpnQ8+ePRw5WUjwE= =Yoaj -----END PGP SIGNATURE----- Merge tag 'drm-misc-fixes-2023-08-10' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes Multiple fixes for nouveau around memory safety and DisplayPort, one fix to reduce the log level of rockchip, a power state fix for the it6505 bridge, a timing fix for the lt9611 bridge, a cache maintenance fix for ivpu and one to reset vma->vm_ops on mmap for shmem-helper. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <mripard@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/fwed6gzdtkse5ocrgd37elhyw7qirfptsvfp5mqqverdzifhxj@4da3vesxcqp2
This commit is contained in:
commit
8ba371c778
|
@ -173,6 +173,9 @@ static void internal_free_pages_locked(struct ivpu_bo *bo)
|
|||
{
|
||||
unsigned int i, npages = bo->base.size >> PAGE_SHIFT;
|
||||
|
||||
if (ivpu_bo_cache_mode(bo) != DRM_IVPU_BO_CACHED)
|
||||
set_pages_array_wb(bo->pages, bo->base.size >> PAGE_SHIFT);
|
||||
|
||||
for (i = 0; i < npages; i++)
|
||||
put_page(bo->pages[i]);
|
||||
|
||||
|
@ -587,6 +590,11 @@ ivpu_bo_alloc_internal(struct ivpu_device *vdev, u64 vpu_addr, u64 size, u32 fla
|
|||
if (ivpu_bo_cache_mode(bo) != DRM_IVPU_BO_CACHED)
|
||||
drm_clflush_pages(bo->pages, bo->base.size >> PAGE_SHIFT);
|
||||
|
||||
if (bo->flags & DRM_IVPU_BO_WC)
|
||||
set_pages_array_wc(bo->pages, bo->base.size >> PAGE_SHIFT);
|
||||
else if (bo->flags & DRM_IVPU_BO_UNCACHED)
|
||||
set_pages_array_uc(bo->pages, bo->base.size >> PAGE_SHIFT);
|
||||
|
||||
prot = ivpu_bo_pgprot(bo, PAGE_KERNEL);
|
||||
bo->kvaddr = vmap(bo->pages, bo->base.size >> PAGE_SHIFT, VM_MAP, prot);
|
||||
if (!bo->kvaddr) {
|
||||
|
|
|
@ -2517,9 +2517,11 @@ static irqreturn_t it6505_int_threaded_handler(int unused, void *data)
|
|||
};
|
||||
int int_status[3], i;
|
||||
|
||||
if (it6505->enable_drv_hold || pm_runtime_get_if_in_use(dev) <= 0)
|
||||
if (it6505->enable_drv_hold || !it6505->powered)
|
||||
return IRQ_HANDLED;
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
int_status[0] = it6505_read(it6505, INT_STATUS_01);
|
||||
int_status[1] = it6505_read(it6505, INT_STATUS_02);
|
||||
int_status[2] = it6505_read(it6505, INT_STATUS_03);
|
||||
|
|
|
@ -774,9 +774,7 @@ static struct mipi_dsi_device *lt9611_attach_dsi(struct lt9611 *lt9611,
|
|||
dsi->lanes = 4;
|
||||
dsi->format = MIPI_DSI_FMT_RGB888;
|
||||
dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
|
||||
MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO_NO_HSA |
|
||||
MIPI_DSI_MODE_VIDEO_NO_HFP | MIPI_DSI_MODE_VIDEO_NO_HBP |
|
||||
MIPI_DSI_MODE_NO_EOT_PACKET;
|
||||
MIPI_DSI_MODE_VIDEO_HSE;
|
||||
|
||||
ret = devm_mipi_dsi_attach(dev, dsi);
|
||||
if (ret < 0) {
|
||||
|
|
|
@ -623,7 +623,13 @@ int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct
|
|||
int ret;
|
||||
|
||||
if (obj->import_attach) {
|
||||
/* Reset both vm_ops and vm_private_data, so we don't end up with
|
||||
* vm_ops pointing to our implementation if the dma-buf backend
|
||||
* doesn't set those fields.
|
||||
*/
|
||||
vma->vm_private_data = NULL;
|
||||
vma->vm_ops = NULL;
|
||||
|
||||
ret = dma_buf_mmap(obj->dma_buf, vma, 0);
|
||||
|
||||
/* Drop the reference drm_gem_mmap_obj() acquired.*/
|
||||
|
|
|
@ -967,7 +967,7 @@ nouveau_connector_get_modes(struct drm_connector *connector)
|
|||
/* Determine display colour depth for everything except LVDS now,
|
||||
* DP requires this before mode_valid() is called.
|
||||
*/
|
||||
if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS && nv_connector->native_mode)
|
||||
if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS)
|
||||
nouveau_connector_detect_depth(connector);
|
||||
|
||||
/* Find the native mode if this is a digital panel, if we didn't
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
#include "head.h"
|
||||
#include "ior.h"
|
||||
|
||||
#include <drm/display/drm_dp.h>
|
||||
|
||||
#include <subdev/bios.h>
|
||||
#include <subdev/bios/init.h>
|
||||
#include <subdev/gpio.h>
|
||||
|
@ -634,6 +636,50 @@ nvkm_dp_enable_supported_link_rates(struct nvkm_outp *outp)
|
|||
return outp->dp.rates != 0;
|
||||
}
|
||||
|
||||
/* XXX: This is a big fat hack, and this is just drm_dp_read_dpcd_caps()
|
||||
* converted to work inside nvkm. This is a temporary holdover until we start
|
||||
* passing the drm_dp_aux device through NVKM
|
||||
*/
|
||||
static int
|
||||
nvkm_dp_read_dpcd_caps(struct nvkm_outp *outp)
|
||||
{
|
||||
struct nvkm_i2c_aux *aux = outp->dp.aux;
|
||||
u8 dpcd_ext[DP_RECEIVER_CAP_SIZE];
|
||||
int ret;
|
||||
|
||||
ret = nvkm_rdaux(aux, DPCD_RC00_DPCD_REV, outp->dp.dpcd, DP_RECEIVER_CAP_SIZE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Prior to DP1.3 the bit represented by
|
||||
* DP_EXTENDED_RECEIVER_CAP_FIELD_PRESENT was reserved.
|
||||
* If it is set DP_DPCD_REV at 0000h could be at a value less than
|
||||
* the true capability of the panel. The only way to check is to
|
||||
* then compare 0000h and 2200h.
|
||||
*/
|
||||
if (!(outp->dp.dpcd[DP_TRAINING_AUX_RD_INTERVAL] &
|
||||
DP_EXTENDED_RECEIVER_CAP_FIELD_PRESENT))
|
||||
return 0;
|
||||
|
||||
ret = nvkm_rdaux(aux, DP_DP13_DPCD_REV, dpcd_ext, sizeof(dpcd_ext));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (outp->dp.dpcd[DP_DPCD_REV] > dpcd_ext[DP_DPCD_REV]) {
|
||||
OUTP_DBG(outp, "Extended DPCD rev less than base DPCD rev (%d > %d)\n",
|
||||
outp->dp.dpcd[DP_DPCD_REV], dpcd_ext[DP_DPCD_REV]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!memcmp(outp->dp.dpcd, dpcd_ext, sizeof(dpcd_ext)))
|
||||
return 0;
|
||||
|
||||
memcpy(outp->dp.dpcd, dpcd_ext, sizeof(dpcd_ext));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_dp_enable(struct nvkm_outp *outp, bool auxpwr)
|
||||
{
|
||||
|
@ -689,7 +735,7 @@ nvkm_dp_enable(struct nvkm_outp *outp, bool auxpwr)
|
|||
memset(outp->dp.lttpr, 0x00, sizeof(outp->dp.lttpr));
|
||||
}
|
||||
|
||||
if (!nvkm_rdaux(aux, DPCD_RC00_DPCD_REV, outp->dp.dpcd, sizeof(outp->dp.dpcd))) {
|
||||
if (!nvkm_dp_read_dpcd_caps(outp)) {
|
||||
const u8 rates[] = { 0x1e, 0x14, 0x0a, 0x06, 0 };
|
||||
const u8 *rate;
|
||||
int rate_max;
|
||||
|
|
|
@ -117,6 +117,7 @@ void gk104_grctx_generate_r418800(struct gf100_gr *);
|
|||
|
||||
extern const struct gf100_grctx_func gk110_grctx;
|
||||
void gk110_grctx_generate_r419eb0(struct gf100_gr *);
|
||||
void gk110_grctx_generate_r419f78(struct gf100_gr *);
|
||||
|
||||
extern const struct gf100_grctx_func gk110b_grctx;
|
||||
extern const struct gf100_grctx_func gk208_grctx;
|
||||
|
|
|
@ -906,7 +906,9 @@ static void
|
|||
gk104_grctx_generate_r419f78(struct gf100_gr *gr)
|
||||
{
|
||||
struct nvkm_device *device = gr->base.engine.subdev.device;
|
||||
nvkm_mask(device, 0x419f78, 0x00000001, 0x00000000);
|
||||
|
||||
/* bit 3 set disables loads in fp helper invocations, we need it enabled */
|
||||
nvkm_mask(device, 0x419f78, 0x00000009, 0x00000000);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -820,6 +820,15 @@ gk110_grctx_generate_r419eb0(struct gf100_gr *gr)
|
|||
nvkm_mask(device, 0x419eb0, 0x00001000, 0x00001000);
|
||||
}
|
||||
|
||||
void
|
||||
gk110_grctx_generate_r419f78(struct gf100_gr *gr)
|
||||
{
|
||||
struct nvkm_device *device = gr->base.engine.subdev.device;
|
||||
|
||||
/* bit 3 set disables loads in fp helper invocations, we need it enabled */
|
||||
nvkm_mask(device, 0x419f78, 0x00000008, 0x00000000);
|
||||
}
|
||||
|
||||
const struct gf100_grctx_func
|
||||
gk110_grctx = {
|
||||
.main = gf100_grctx_generate_main,
|
||||
|
@ -854,4 +863,5 @@ gk110_grctx = {
|
|||
.gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr,
|
||||
.r418800 = gk104_grctx_generate_r418800,
|
||||
.r419eb0 = gk110_grctx_generate_r419eb0,
|
||||
.r419f78 = gk110_grctx_generate_r419f78,
|
||||
};
|
||||
|
|
|
@ -103,4 +103,5 @@ gk110b_grctx = {
|
|||
.gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr,
|
||||
.r418800 = gk104_grctx_generate_r418800,
|
||||
.r419eb0 = gk110_grctx_generate_r419eb0,
|
||||
.r419f78 = gk110_grctx_generate_r419f78,
|
||||
};
|
||||
|
|
|
@ -568,4 +568,5 @@ gk208_grctx = {
|
|||
.dist_skip_table = gf117_grctx_generate_dist_skip_table,
|
||||
.gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr,
|
||||
.r418800 = gk104_grctx_generate_r418800,
|
||||
.r419f78 = gk110_grctx_generate_r419f78,
|
||||
};
|
||||
|
|
|
@ -988,4 +988,5 @@ gm107_grctx = {
|
|||
.r406500 = gm107_grctx_generate_r406500,
|
||||
.gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr,
|
||||
.r419e00 = gm107_grctx_generate_r419e00,
|
||||
.r419f78 = gk110_grctx_generate_r419f78,
|
||||
};
|
||||
|
|
|
@ -206,19 +206,6 @@ tu102_gr_av_to_init_veid(struct nvkm_blob *blob, struct gf100_gr_pack **ppack)
|
|||
return gk20a_gr_av_to_init_(blob, 64, 0x00100000, ppack);
|
||||
}
|
||||
|
||||
int
|
||||
tu102_gr_load(struct gf100_gr *gr, int ver, const struct gf100_gr_fwif *fwif)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gm200_gr_load(gr, ver, fwif);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return gk20a_gr_load_net(gr, "gr/", "sw_veid_bundle_init", ver, tu102_gr_av_to_init_veid,
|
||||
&gr->bundle_veid);
|
||||
}
|
||||
|
||||
static const struct gf100_gr_fwif
|
||||
tu102_gr_fwif[] = {
|
||||
{ 0, gm200_gr_load, &tu102_gr, &gp108_gr_fecs_acr, &gp108_gr_gpccs_acr },
|
||||
|
|
|
@ -833,12 +833,12 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
|
|||
* need align with 2 pixel.
|
||||
*/
|
||||
if (fb->format->is_yuv && ((new_plane_state->src.x1 >> 16) % 2)) {
|
||||
DRM_ERROR("Invalid Source: Yuv format not support odd xpos\n");
|
||||
DRM_DEBUG_KMS("Invalid Source: Yuv format not support odd xpos\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (fb->format->is_yuv && new_plane_state->rotation & DRM_MODE_REFLECT_Y) {
|
||||
DRM_ERROR("Invalid Source: Yuv format does not support this rotation\n");
|
||||
DRM_DEBUG_KMS("Invalid Source: Yuv format does not support this rotation\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -846,7 +846,7 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
|
|||
struct vop *vop = to_vop(crtc);
|
||||
|
||||
if (!vop->data->afbc) {
|
||||
DRM_ERROR("vop does not support AFBC\n");
|
||||
DRM_DEBUG_KMS("vop does not support AFBC\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -855,15 +855,16 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
|
|||
return ret;
|
||||
|
||||
if (new_plane_state->src.x1 || new_plane_state->src.y1) {
|
||||
DRM_ERROR("AFBC does not support offset display, xpos=%d, ypos=%d, offset=%d\n",
|
||||
new_plane_state->src.x1,
|
||||
new_plane_state->src.y1, fb->offsets[0]);
|
||||
DRM_DEBUG_KMS("AFBC does not support offset display, " \
|
||||
"xpos=%d, ypos=%d, offset=%d\n",
|
||||
new_plane_state->src.x1, new_plane_state->src.y1,
|
||||
fb->offsets[0]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (new_plane_state->rotation && new_plane_state->rotation != DRM_MODE_ROTATE_0) {
|
||||
DRM_ERROR("No rotation support in AFBC, rotation=%d\n",
|
||||
new_plane_state->rotation);
|
||||
DRM_DEBUG_KMS("No rotation support in AFBC, rotation=%d\n",
|
||||
new_plane_state->rotation);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue