A fix for a non-unique CEC adapter name registration in vc4, a
regression breaking the display in ssd130x, a signaling bit issue in dma-fence, a couple of fixes in nouveau for Turing and Ampere, and a disable fix for the boe-tv101wum-nl6 panel. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRcEzekXsqa64kGDp7j7w1vZxhRxQUCY9t63gAKCRDj7w1vZxhR xYAkAP91kAKmTF8ccPPTF7VD7bnsxMIP0b/RykZFMY7GKBYMDwD+Jd9ECcEwlwrl MD0PS/ajXAdC+oMFcj03PoYA/gzAjQs= =O5nH -----END PGP SIGNATURE----- Merge tag 'drm-misc-fixes-2023-02-02' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes A fix for a non-unique CEC adapter name registration in vc4, a regression breaking the display in ssd130x, a signaling bit issue in dma-fence, a couple of fixes in nouveau for Turing and Ampere, and a disable fix for the boe-tv101wum-nl6 panel. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <maxime@cerno.tech> Link: https://patchwork.freedesktop.org/patch/msgid/20230202085724.pz22m7bmei3wyuzp@houat
This commit is contained in:
commit
abf301e14e
@ -167,7 +167,7 @@ struct dma_fence *dma_fence_allocate_private_stub(void)
|
||||
0, 0);
|
||||
|
||||
set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
|
||||
&dma_fence_stub.flags);
|
||||
&fence->flags);
|
||||
|
||||
dma_fence_signal(fence);
|
||||
|
||||
|
@ -97,6 +97,7 @@ int gp100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct n
|
||||
int gp102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
|
||||
int gp10b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
|
||||
int gv100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
|
||||
int tu102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
|
||||
int ga100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
|
||||
int ga102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
|
||||
|
||||
|
@ -151,6 +151,9 @@ nvkm_firmware_mem_page(struct nvkm_memory *memory)
|
||||
static enum nvkm_memory_target
|
||||
nvkm_firmware_mem_target(struct nvkm_memory *memory)
|
||||
{
|
||||
if (nvkm_firmware_mem(memory)->device->func->tegra)
|
||||
return NVKM_MEM_TARGET_NCOH;
|
||||
|
||||
return NVKM_MEM_TARGET_HOST;
|
||||
}
|
||||
|
||||
|
@ -2405,7 +2405,7 @@ nv162_chipset = {
|
||||
.bus = { 0x00000001, gf100_bus_new },
|
||||
.devinit = { 0x00000001, tu102_devinit_new },
|
||||
.fault = { 0x00000001, tu102_fault_new },
|
||||
.fb = { 0x00000001, gv100_fb_new },
|
||||
.fb = { 0x00000001, tu102_fb_new },
|
||||
.fuse = { 0x00000001, gm107_fuse_new },
|
||||
.gpio = { 0x00000001, gk104_gpio_new },
|
||||
.gsp = { 0x00000001, gv100_gsp_new },
|
||||
@ -2440,7 +2440,7 @@ nv164_chipset = {
|
||||
.bus = { 0x00000001, gf100_bus_new },
|
||||
.devinit = { 0x00000001, tu102_devinit_new },
|
||||
.fault = { 0x00000001, tu102_fault_new },
|
||||
.fb = { 0x00000001, gv100_fb_new },
|
||||
.fb = { 0x00000001, tu102_fb_new },
|
||||
.fuse = { 0x00000001, gm107_fuse_new },
|
||||
.gpio = { 0x00000001, gk104_gpio_new },
|
||||
.gsp = { 0x00000001, gv100_gsp_new },
|
||||
@ -2475,7 +2475,7 @@ nv166_chipset = {
|
||||
.bus = { 0x00000001, gf100_bus_new },
|
||||
.devinit = { 0x00000001, tu102_devinit_new },
|
||||
.fault = { 0x00000001, tu102_fault_new },
|
||||
.fb = { 0x00000001, gv100_fb_new },
|
||||
.fb = { 0x00000001, tu102_fb_new },
|
||||
.fuse = { 0x00000001, gm107_fuse_new },
|
||||
.gpio = { 0x00000001, gk104_gpio_new },
|
||||
.gsp = { 0x00000001, gv100_gsp_new },
|
||||
@ -2510,7 +2510,7 @@ nv167_chipset = {
|
||||
.bus = { 0x00000001, gf100_bus_new },
|
||||
.devinit = { 0x00000001, tu102_devinit_new },
|
||||
.fault = { 0x00000001, tu102_fault_new },
|
||||
.fb = { 0x00000001, gv100_fb_new },
|
||||
.fb = { 0x00000001, tu102_fb_new },
|
||||
.fuse = { 0x00000001, gm107_fuse_new },
|
||||
.gpio = { 0x00000001, gk104_gpio_new },
|
||||
.gsp = { 0x00000001, gv100_gsp_new },
|
||||
@ -2545,7 +2545,7 @@ nv168_chipset = {
|
||||
.bus = { 0x00000001, gf100_bus_new },
|
||||
.devinit = { 0x00000001, tu102_devinit_new },
|
||||
.fault = { 0x00000001, tu102_fault_new },
|
||||
.fb = { 0x00000001, gv100_fb_new },
|
||||
.fb = { 0x00000001, tu102_fb_new },
|
||||
.fuse = { 0x00000001, gm107_fuse_new },
|
||||
.gpio = { 0x00000001, gk104_gpio_new },
|
||||
.gsp = { 0x00000001, gv100_gsp_new },
|
||||
|
@ -48,6 +48,16 @@ gm200_flcn_pio_dmem_rd(struct nvkm_falcon *falcon, u8 port, const u8 *img, int l
|
||||
img += 4;
|
||||
len -= 4;
|
||||
}
|
||||
|
||||
/* Sigh. Tegra PMU FW's init message... */
|
||||
if (len) {
|
||||
u32 data = nvkm_falcon_rd32(falcon, 0x1c4 + (port * 8));
|
||||
|
||||
while (len--) {
|
||||
*(u8 *)img++ = data & 0xff;
|
||||
data >>= 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -64,6 +74,8 @@ gm200_flcn_pio_dmem_wr(struct nvkm_falcon *falcon, u8 port, const u8 *img, int l
|
||||
img += 4;
|
||||
len -= 4;
|
||||
}
|
||||
|
||||
WARN_ON(len);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -74,7 +86,7 @@ gm200_flcn_pio_dmem_wr_init(struct nvkm_falcon *falcon, u8 port, bool sec, u32 d
|
||||
|
||||
const struct nvkm_falcon_func_pio
|
||||
gm200_flcn_dmem_pio = {
|
||||
.min = 4,
|
||||
.min = 1,
|
||||
.max = 0x100,
|
||||
.wr_init = gm200_flcn_pio_dmem_wr_init,
|
||||
.wr = gm200_flcn_pio_dmem_wr,
|
||||
|
@ -65,10 +65,33 @@ tu102_devinit_pll_set(struct nvkm_devinit *init, u32 type, u32 freq)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
tu102_devinit_wait(struct nvkm_device *device)
|
||||
{
|
||||
unsigned timeout = 50 + 2000;
|
||||
|
||||
do {
|
||||
if (nvkm_rd32(device, 0x118128) & 0x00000001) {
|
||||
if ((nvkm_rd32(device, 0x118234) & 0x000000ff) == 0xff)
|
||||
return 0;
|
||||
}
|
||||
|
||||
usleep_range(1000, 2000);
|
||||
} while (timeout--);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
int
|
||||
tu102_devinit_post(struct nvkm_devinit *base, bool post)
|
||||
{
|
||||
struct nv50_devinit *init = nv50_devinit(base);
|
||||
int ret;
|
||||
|
||||
ret = tu102_devinit_wait(init->base.subdev.device);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
gm200_devinit_preos(init, post);
|
||||
return 0;
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ nvkm-y += nvkm/subdev/fb/gp100.o
|
||||
nvkm-y += nvkm/subdev/fb/gp102.o
|
||||
nvkm-y += nvkm/subdev/fb/gp10b.o
|
||||
nvkm-y += nvkm/subdev/fb/gv100.o
|
||||
nvkm-y += nvkm/subdev/fb/tu102.o
|
||||
nvkm-y += nvkm/subdev/fb/ga100.o
|
||||
nvkm-y += nvkm/subdev/fb/ga102.o
|
||||
|
||||
|
@ -40,12 +40,6 @@ ga102_fb_vpr_scrub(struct nvkm_fb *fb)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool
|
||||
ga102_fb_vpr_scrub_required(struct nvkm_fb *fb)
|
||||
{
|
||||
return (nvkm_rd32(fb->subdev.device, 0x1fa80c) & 0x00000010) != 0;
|
||||
}
|
||||
|
||||
static const struct nvkm_fb_func
|
||||
ga102_fb = {
|
||||
.dtor = gf100_fb_dtor,
|
||||
@ -56,7 +50,7 @@ ga102_fb = {
|
||||
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
|
||||
.ram_new = ga102_ram_new,
|
||||
.default_bigpage = 16,
|
||||
.vpr.scrub_required = ga102_fb_vpr_scrub_required,
|
||||
.vpr.scrub_required = tu102_fb_vpr_scrub_required,
|
||||
.vpr.scrub = ga102_fb_vpr_scrub,
|
||||
};
|
||||
|
||||
|
@ -49,8 +49,3 @@ gv100_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, s
|
||||
}
|
||||
|
||||
MODULE_FIRMWARE("nvidia/gv100/nvdec/scrubber.bin");
|
||||
MODULE_FIRMWARE("nvidia/tu102/nvdec/scrubber.bin");
|
||||
MODULE_FIRMWARE("nvidia/tu104/nvdec/scrubber.bin");
|
||||
MODULE_FIRMWARE("nvidia/tu106/nvdec/scrubber.bin");
|
||||
MODULE_FIRMWARE("nvidia/tu116/nvdec/scrubber.bin");
|
||||
MODULE_FIRMWARE("nvidia/tu117/nvdec/scrubber.bin");
|
||||
|
@ -89,4 +89,6 @@ bool gp102_fb_vpr_scrub_required(struct nvkm_fb *);
|
||||
int gp102_fb_vpr_scrub(struct nvkm_fb *);
|
||||
|
||||
int gv100_fb_init_page(struct nvkm_fb *);
|
||||
|
||||
bool tu102_fb_vpr_scrub_required(struct nvkm_fb *);
|
||||
#endif
|
||||
|
55
drivers/gpu/drm/nouveau/nvkm/subdev/fb/tu102.c
Normal file
55
drivers/gpu/drm/nouveau/nvkm/subdev/fb/tu102.c
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 2018 Red Hat Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include "gf100.h"
|
||||
#include "ram.h"
|
||||
|
||||
bool
|
||||
tu102_fb_vpr_scrub_required(struct nvkm_fb *fb)
|
||||
{
|
||||
return (nvkm_rd32(fb->subdev.device, 0x1fa80c) & 0x00000010) != 0;
|
||||
}
|
||||
|
||||
static const struct nvkm_fb_func
|
||||
tu102_fb = {
|
||||
.dtor = gf100_fb_dtor,
|
||||
.oneinit = gf100_fb_oneinit,
|
||||
.init = gm200_fb_init,
|
||||
.init_page = gv100_fb_init_page,
|
||||
.init_unkn = gp100_fb_init_unkn,
|
||||
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
|
||||
.vpr.scrub_required = tu102_fb_vpr_scrub_required,
|
||||
.vpr.scrub = gp102_fb_vpr_scrub,
|
||||
.ram_new = gp100_ram_new,
|
||||
.default_bigpage = 16,
|
||||
};
|
||||
|
||||
int
|
||||
tu102_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
|
||||
{
|
||||
return gp102_fb_new_(&tu102_fb, device, type, inst, pfb);
|
||||
}
|
||||
|
||||
MODULE_FIRMWARE("nvidia/tu102/nvdec/scrubber.bin");
|
||||
MODULE_FIRMWARE("nvidia/tu104/nvdec/scrubber.bin");
|
||||
MODULE_FIRMWARE("nvidia/tu106/nvdec/scrubber.bin");
|
||||
MODULE_FIRMWARE("nvidia/tu116/nvdec/scrubber.bin");
|
||||
MODULE_FIRMWARE("nvidia/tu117/nvdec/scrubber.bin");
|
@ -225,7 +225,7 @@ gm20b_pmu_init(struct nvkm_pmu *pmu)
|
||||
|
||||
pmu->initmsg_received = false;
|
||||
|
||||
nvkm_falcon_load_dmem(falcon, &args, addr_args, sizeof(args), 0);
|
||||
nvkm_falcon_pio_wr(falcon, (u8 *)&args, 0, 0, DMEM, addr_args, sizeof(args), 0, false);
|
||||
nvkm_falcon_start(falcon);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1193,14 +1193,11 @@ static int boe_panel_enter_sleep_mode(struct boe_panel *boe)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int boe_panel_unprepare(struct drm_panel *panel)
|
||||
static int boe_panel_disable(struct drm_panel *panel)
|
||||
{
|
||||
struct boe_panel *boe = to_boe_panel(panel);
|
||||
int ret;
|
||||
|
||||
if (!boe->prepared)
|
||||
return 0;
|
||||
|
||||
ret = boe_panel_enter_sleep_mode(boe);
|
||||
if (ret < 0) {
|
||||
dev_err(panel->dev, "failed to set panel off: %d\n", ret);
|
||||
@ -1209,6 +1206,16 @@ static int boe_panel_unprepare(struct drm_panel *panel)
|
||||
|
||||
msleep(150);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int boe_panel_unprepare(struct drm_panel *panel)
|
||||
{
|
||||
struct boe_panel *boe = to_boe_panel(panel);
|
||||
|
||||
if (!boe->prepared)
|
||||
return 0;
|
||||
|
||||
if (boe->desc->discharge_on_disable) {
|
||||
regulator_disable(boe->avee);
|
||||
regulator_disable(boe->avdd);
|
||||
@ -1528,6 +1535,7 @@ static enum drm_panel_orientation boe_panel_get_orientation(struct drm_panel *pa
|
||||
}
|
||||
|
||||
static const struct drm_panel_funcs boe_panel_funcs = {
|
||||
.disable = boe_panel_disable,
|
||||
.unprepare = boe_panel_unprepare,
|
||||
.prepare = boe_panel_prepare,
|
||||
.enable = boe_panel_enable,
|
||||
|
@ -656,18 +656,8 @@ static const struct drm_crtc_helper_funcs ssd130x_crtc_helper_funcs = {
|
||||
.atomic_check = drm_crtc_helper_atomic_check,
|
||||
};
|
||||
|
||||
static void ssd130x_crtc_reset(struct drm_crtc *crtc)
|
||||
{
|
||||
struct drm_device *drm = crtc->dev;
|
||||
struct ssd130x_device *ssd130x = drm_to_ssd130x(drm);
|
||||
|
||||
ssd130x_init(ssd130x);
|
||||
|
||||
drm_atomic_helper_crtc_reset(crtc);
|
||||
}
|
||||
|
||||
static const struct drm_crtc_funcs ssd130x_crtc_funcs = {
|
||||
.reset = ssd130x_crtc_reset,
|
||||
.reset = drm_atomic_helper_crtc_reset,
|
||||
.destroy = drm_crtc_cleanup,
|
||||
.set_config = drm_atomic_helper_set_config,
|
||||
.page_flip = drm_atomic_helper_page_flip,
|
||||
@ -686,6 +676,12 @@ static void ssd130x_encoder_helper_atomic_enable(struct drm_encoder *encoder,
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
ret = ssd130x_init(ssd130x);
|
||||
if (ret) {
|
||||
ssd130x_power_off(ssd130x);
|
||||
return;
|
||||
}
|
||||
|
||||
ssd130x_write_cmd(ssd130x, 1, SSD130X_DISPLAY_ON);
|
||||
|
||||
backlight_enable(ssd130x->bl_dev);
|
||||
|
@ -3018,7 +3018,8 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
|
||||
}
|
||||
|
||||
vc4_hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops,
|
||||
vc4_hdmi, "vc4",
|
||||
vc4_hdmi,
|
||||
vc4_hdmi->variant->card_name,
|
||||
CEC_CAP_DEFAULTS |
|
||||
CEC_CAP_CONNECTOR_INFO, 1);
|
||||
ret = PTR_ERR_OR_ZERO(vc4_hdmi->cec_adap);
|
||||
|
Loading…
x
Reference in New Issue
Block a user