Module Name: src
Committed By: riastradh
Date: Sun Dec 19 11:00:47 UTC 2021
Modified Files:
src/sys/arch/arm/rockchip: rk_anxdp.c rk_drm.c rk_dwhdmi.c rk_fb.c
rk_vop.c
src/sys/arch/arm/sunxi: sunxi_drm.c sunxi_dwhdmi.c sunxi_fb.c
sunxi_hdmiphy.h sunxi_lcdc.c sunxi_mixer.c
src/sys/dev/fdt: fdt_panel.c hdmi_connector.c
src/sys/dev/i2c: anxedp.c
src/sys/dev/ic: anx_dp.c anx_dp.h dw_hdmi.c dw_hdmi.h dw_hdmi_phy.c
src/sys/external/bsd/dwc2: dwc2.h
Log Message:
Get drm to build on arm64 again.
Author: Jared McNeill <jmcne...@netbsd.org>
Committer: Taylor R Campbell <riastr...@netbsd.org>
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/rockchip/rk_anxdp.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/rockchip/rk_drm.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/rockchip/rk_dwhdmi.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/rk_fb.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/rockchip/rk_vop.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/sunxi/sunxi_drm.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/sunxi/sunxi_dwhdmi.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/sunxi/sunxi_fb.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/sunxi/sunxi_hdmiphy.h
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/sunxi/sunxi_lcdc.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/sunxi/sunxi_mixer.c
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/fdt/fdt_panel.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/fdt/hdmi_connector.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/i2c/anxedp.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ic/anx_dp.c src/sys/dev/ic/anx_dp.h \
src/sys/dev/ic/dw_hdmi_phy.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/ic/dw_hdmi.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/ic/dw_hdmi.h
cvs rdiff -u -r1.10 -r1.11 src/sys/external/bsd/dwc2/dwc2.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/rockchip/rk_anxdp.c
diff -u src/sys/arch/arm/rockchip/rk_anxdp.c:1.4 src/sys/arch/arm/rockchip/rk_anxdp.c:1.5
--- src/sys/arch/arm/rockchip/rk_anxdp.c:1.4 Sun Jul 25 11:14:15 2021
+++ src/sys/arch/arm/rockchip/rk_anxdp.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rk_anxdp.c,v 1.4 2021/07/25 11:14:15 jmcneill Exp $ */
+/* $NetBSD: rk_anxdp.c,v 1.5 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jonathan A. Kollasch <jakll...@kollasch.net>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rk_anxdp.c,v 1.4 2021/07/25 11:14:15 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rk_anxdp.c,v 1.5 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -37,7 +37,7 @@ __KERNEL_RCSID(0, "$NetBSD: rk_anxdp.c,v
#include <sys/kernel.h>
#include <sys/conf.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_crtc_helper.h>
#include <dev/fdt/fdtvar.h>
@@ -174,7 +174,7 @@ rk_anxdp_ep_activate(device_t dev, struc
sc->sc_encoder.possible_crtcs = 0x2; /* VOPB only */
drm_encoder_init(crtc->dev, &sc->sc_encoder, &rk_anxdp_encoder_funcs,
- DRM_MODE_ENCODER_TMDS);
+ DRM_MODE_ENCODER_TMDS, NULL);
drm_encoder_helper_add(&sc->sc_encoder, &rk_anxdp_encoder_helper_funcs);
out_ep = fdt_endpoint_get_from_index(&sc->sc_ports, ANXDP_PORT_OUTPUT, 0);
Index: src/sys/arch/arm/rockchip/rk_drm.c
diff -u src/sys/arch/arm/rockchip/rk_drm.c:1.7 src/sys/arch/arm/rockchip/rk_drm.c:1.8
--- src/sys/arch/arm/rockchip/rk_drm.c:1.7 Sat Aug 7 16:18:45 2021
+++ src/sys/arch/arm/rockchip/rk_drm.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rk_drm.c,v 1.7 2021/08/07 16:18:45 thorpej Exp $ */
+/* $NetBSD: rk_drm.c,v 1.8 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rk_drm.c,v 1.7 2021/08/07 16:18:45 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rk_drm.c,v 1.8 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -41,9 +41,12 @@ __KERNEL_RCSID(0, "$NetBSD: rk_drm.c,v 1
#include <uvm/uvm_object.h>
#include <uvm/uvm_device.h>
-#include <drm/drmP.h>
+#include <drm/drm_auth.h>
+#include <drm/drm_drv.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_vblank.h>
#include <dev/fdt/fdtvar.h>
#include <dev/fdt/fdt_port.h>
@@ -79,10 +82,10 @@ static int rk_drm_enable_vblank(struct d
static void rk_drm_disable_vblank(struct drm_device *, unsigned int);
static int rk_drm_load(struct drm_device *, unsigned long);
-static int rk_drm_unload(struct drm_device *);
+static void rk_drm_unload(struct drm_device *);
static struct drm_driver rk_drm_driver = {
- .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME,
+ .driver_features = DRIVER_MODESET | DRIVER_GEM,
.dev_priv_size = 0,
.load = rk_drm_load,
.unload = rk_drm_unload,
@@ -92,7 +95,6 @@ static struct drm_driver rk_drm_driver =
.gem_uvm_ops = &drm_gem_cma_uvm_ops,
.dumb_create = drm_gem_cma_dumb_create,
- .dumb_map_offset = drm_gem_cma_dumb_map_offset,
.dumb_destroy = drm_gem_dumb_destroy,
.get_vblank_counter = rk_drm_get_vblank_counter,
@@ -168,7 +170,6 @@ rk_drm_init(device_t dev)
error = -drm_dev_register(sc->sc_ddev, 0);
if (error) {
- drm_dev_unref(sc->sc_ddev);
aprint_error_dev(dev, "couldn't register DRM device: %d\n",
error);
return;
@@ -230,7 +231,7 @@ rk_drm_fb_destroy(struct drm_framebuffer
struct rk_drm_framebuffer *sfb = to_rk_drm_framebuffer(fb);
drm_framebuffer_cleanup(fb);
- drm_gem_object_unreference_unlocked(&sfb->obj->base);
+ drm_gem_object_put_unlocked(&sfb->obj->base);
kmem_free(sfb, sizeof(*sfb));
}
@@ -241,7 +242,7 @@ static const struct drm_framebuffer_func
static struct drm_framebuffer *
rk_drm_fb_create(struct drm_device *ddev, struct drm_file *file,
- struct drm_mode_fb_cmd2 *cmd)
+ const struct drm_mode_fb_cmd2 *cmd)
{
struct rk_drm_framebuffer *fb;
struct drm_gem_object *gem_obj;
@@ -250,7 +251,7 @@ rk_drm_fb_create(struct drm_device *ddev
if (cmd->flags)
return NULL;
- gem_obj = drm_gem_object_lookup(ddev, file, cmd->handles[0]);
+ gem_obj = drm_gem_object_lookup(file, cmd->handles[0]);
if (gem_obj == NULL)
return NULL;
@@ -264,17 +265,7 @@ rk_drm_fb_create(struct drm_device *ddev
fb->base.offsets[2] = cmd->offsets[1];
fb->base.width = cmd->width;
fb->base.height = cmd->height;
- fb->base.pixel_format = cmd->pixel_format;
- fb->base.bits_per_pixel = drm_format_plane_cpp(fb->base.pixel_format, 0) * 8;
-
- switch (fb->base.pixel_format) {
- case DRM_FORMAT_XRGB8888:
- case DRM_FORMAT_ARGB8888:
- fb->base.depth = 32;
- break;
- default:
- break;
- }
+ fb->base.format = drm_format_info(cmd->pixel_format);
error = drm_framebuffer_init(ddev, &fb->base, &rk_drm_framebuffer_funcs);
if (error != 0)
@@ -285,7 +276,7 @@ rk_drm_fb_create(struct drm_device *ddev
dealloc:
drm_framebuffer_cleanup(&fb->base);
kmem_free(fb, sizeof(*fb));
- drm_gem_object_unreference_unlocked(gem_obj);
+ drm_gem_object_put_unlocked(gem_obj);
return NULL;
}
@@ -331,11 +322,10 @@ rk_drm_fb_probe(struct drm_fb_helper *he
fb->width = width;
fb->height = height;
#ifdef __ARM_BIG_ENDIAN
- fb->pixel_format = DRM_FORMAT_BGRX8888;
+ fb->format = drm_format_info(DRM_FORMAT_BGRX8888);
#else
- fb->pixel_format = DRM_FORMAT_XRGB8888;
+ fb->format = drm_format_info(DRM_FORMAT_XRGB8888);
#endif
- drm_fb_get_bpp_depth(fb->pixel_format, &fb->depth, &fb->bits_per_pixel);
error = drm_framebuffer_init(ddev, fb, &rk_drm_framebuffer_funcs);
if (error != 0) {
@@ -414,7 +404,7 @@ rk_drm_load(struct drm_device *ddev, uns
drm_fb_helper_prepare(ddev, &fbdev->helper, &rk_drm_fb_helper_funcs);
- error = drm_fb_helper_init(ddev, &fbdev->helper, num_crtc, num_crtc);
+ error = drm_fb_helper_init(ddev, &fbdev->helper, num_crtc);
if (error)
goto allocerr;
@@ -484,12 +474,10 @@ rk_drm_disable_vblank(struct drm_device
sc->sc_vbl[crtc].disable_vblank(sc->sc_vbl[crtc].priv);
}
-static int
+static void
rk_drm_unload(struct drm_device *ddev)
{
drm_mode_config_cleanup(ddev);
-
- return 0;
}
int
Index: src/sys/arch/arm/rockchip/rk_dwhdmi.c
diff -u src/sys/arch/arm/rockchip/rk_dwhdmi.c:1.5 src/sys/arch/arm/rockchip/rk_dwhdmi.c:1.6
--- src/sys/arch/arm/rockchip/rk_dwhdmi.c:1.5 Wed Jan 27 03:10:19 2021
+++ src/sys/arch/arm/rockchip/rk_dwhdmi.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rk_dwhdmi.c,v 1.5 2021/01/27 03:10:19 thorpej Exp $ */
+/* $NetBSD: rk_dwhdmi.c,v 1.6 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rk_dwhdmi.c,v 1.5 2021/01/27 03:10:19 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rk_dwhdmi.c,v 1.6 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -37,7 +37,7 @@ __KERNEL_RCSID(0, "$NetBSD: rk_dwhdmi.c,
#include <sys/kernel.h>
#include <sys/conf.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_crtc_helper.h>
#include <dev/fdt/fdtvar.h>
@@ -189,7 +189,7 @@ rk_dwhdmi_ep_activate(device_t dev, stru
sc->sc_encoder.possible_crtcs = 3; // 1U << drm_crtc_index(crtc); /* XXX */
drm_encoder_init(crtc->dev, &sc->sc_encoder, &rk_dwhdmi_encoder_funcs,
- DRM_MODE_ENCODER_TMDS);
+ DRM_MODE_ENCODER_TMDS, NULL);
drm_encoder_helper_add(&sc->sc_encoder, &rk_dwhdmi_encoder_helper_funcs);
sc->sc_base.sc_connector.base.connector_type = DRM_MODE_CONNECTOR_HDMIA;
@@ -230,7 +230,7 @@ rk_dwhdmi_enable(struct dwhdmi_softc *ds
static void
rk_dwhdmi_mode_set(struct dwhdmi_softc *dsc,
- struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode)
+ const struct drm_display_mode *mode, const struct drm_display_mode *adjusted_mode)
{
struct rk_dwhdmi_softc * const sc = to_rk_dwhdmi_softc(dsc);
int error;
Index: src/sys/arch/arm/rockchip/rk_fb.c
diff -u src/sys/arch/arm/rockchip/rk_fb.c:1.2 src/sys/arch/arm/rockchip/rk_fb.c:1.3
--- src/sys/arch/arm/rockchip/rk_fb.c:1.2 Fri May 21 09:33:27 2021
+++ src/sys/arch/arm/rockchip/rk_fb.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rk_fb.c,v 1.2 2021/05/21 09:33:27 jmcneill Exp $ */
+/* $NetBSD: rk_fb.c,v 1.3 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2015-2019 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
#include "opt_wsdisplay_compat.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rk_fb.c,v 1.2 2021/05/21 09:33:27 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rk_fb.c,v 1.3 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -37,7 +37,7 @@ __KERNEL_RCSID(0, "$NetBSD: rk_fb.c,v 1.
#include <dev/fdt/fdtvar.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drmfb.h>
#include <arm/rockchip/rk_drm.h>
Index: src/sys/arch/arm/rockchip/rk_vop.c
diff -u src/sys/arch/arm/rockchip/rk_vop.c:1.10 src/sys/arch/arm/rockchip/rk_vop.c:1.11
--- src/sys/arch/arm/rockchip/rk_vop.c:1.10 Wed Jan 27 03:10:19 2021
+++ src/sys/arch/arm/rockchip/rk_vop.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rk_vop.c,v 1.10 2021/01/27 03:10:19 thorpej Exp $ */
+/* $NetBSD: rk_vop.c,v 1.11 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rk_vop.c,v 1.10 2021/01/27 03:10:19 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rk_vop.c,v 1.11 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -38,9 +38,10 @@ __KERNEL_RCSID(0, "$NetBSD: rk_vop.c,v 1
#include <sys/conf.h>
#include <sys/sysctl.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_fourcc.h>
#include <drm/drm_plane_helper.h>
#include <dev/fdt/fdtvar.h>
@@ -241,7 +242,7 @@ rk_vop_mode_do_set_base(struct drm_crtc
paddr += y * sfb->base.pitches[0];
- paddr += x * drm_format_plane_cpp(sfb->base.pixel_format, 0);
+ paddr += x * sfb->base.format->cpp[0];
KASSERT((paddr & ~0xffffffff) == 0);
@@ -311,7 +312,8 @@ rk_vop_mode_set(struct drm_crtc *crtc, s
int error;
u_int pol;
int connector_type = 0;
- struct drm_connector * connector;
+ struct drm_connector *connector;
+ struct drm_connector_list_iter conn_iter;
const u_int hactive = adjusted_mode->hdisplay;
const u_int hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start;
@@ -363,14 +365,16 @@ rk_vop_mode_set(struct drm_crtc *crtc, s
if ((adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) != 0)
pol |= DSP_VSYNC_POL;
- drm_for_each_connector(connector, crtc->dev) {
- if ((connector->encoder) == NULL)
+ drm_connector_list_iter_begin(crtc->dev, &conn_iter);
+ drm_for_each_connector_iter(connector, &conn_iter) {
+ if (connector->encoder == NULL)
continue;
if (connector->encoder->crtc == crtc) {
connector_type = connector->connector_type;
break;
}
}
+ drm_connector_list_iter_end(&conn_iter);
switch (connector_type) {
case DRM_MODE_CONNECTOR_HDMIA:
Index: src/sys/arch/arm/sunxi/sunxi_drm.c
diff -u src/sys/arch/arm/sunxi/sunxi_drm.c:1.15 src/sys/arch/arm/sunxi/sunxi_drm.c:1.16
--- src/sys/arch/arm/sunxi/sunxi_drm.c:1.15 Sat Aug 7 16:18:45 2021
+++ src/sys/arch/arm/sunxi/sunxi_drm.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_drm.c,v 1.15 2021/08/07 16:18:45 thorpej Exp $ */
+/* $NetBSD: sunxi_drm.c,v 1.16 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_drm.c,v 1.15 2021/08/07 16:18:45 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_drm.c,v 1.16 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -41,9 +41,12 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_drm.c,
#include <uvm/uvm_object.h>
#include <uvm/uvm_device.h>
-#include <drm/drmP.h>
+#include <drm/drm_auth.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
#include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_vblank.h>
#include <dev/fdt/fdtvar.h>
#include <dev/fdt/fdt_port.h>
@@ -88,10 +91,10 @@ static int sunxi_drm_enable_vblank(struc
static void sunxi_drm_disable_vblank(struct drm_device *, unsigned int);
static int sunxi_drm_load(struct drm_device *, unsigned long);
-static int sunxi_drm_unload(struct drm_device *);
+static void sunxi_drm_unload(struct drm_device *);
static struct drm_driver sunxi_drm_driver = {
- .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME,
+ .driver_features = DRIVER_MODESET | DRIVER_GEM,
.dev_priv_size = 0,
.load = sunxi_drm_load,
.unload = sunxi_drm_unload,
@@ -101,7 +104,6 @@ static struct drm_driver sunxi_drm_drive
.gem_uvm_ops = &drm_gem_cma_uvm_ops,
.dumb_create = drm_gem_cma_dumb_create,
- .dumb_map_offset = drm_gem_cma_dumb_map_offset,
.dumb_destroy = drm_gem_dumb_destroy,
.get_vblank_counter = sunxi_drm_get_vblank_counter,
@@ -177,7 +179,6 @@ sunxi_drm_init(device_t dev)
error = -drm_dev_register(sc->sc_ddev, 0);
if (error) {
- drm_dev_unref(sc->sc_ddev);
aprint_error_dev(dev, "couldn't register DRM device: %d\n",
error);
return;
@@ -239,7 +240,7 @@ sunxi_drm_fb_destroy(struct drm_framebuf
struct sunxi_drm_framebuffer *sfb = to_sunxi_drm_framebuffer(fb);
drm_framebuffer_cleanup(fb);
- drm_gem_object_unreference_unlocked(&sfb->obj->base);
+ drm_gem_object_put_unlocked(&sfb->obj->base);
kmem_free(sfb, sizeof(*sfb));
}
@@ -250,7 +251,7 @@ static const struct drm_framebuffer_func
static struct drm_framebuffer *
sunxi_drm_fb_create(struct drm_device *ddev, struct drm_file *file,
- struct drm_mode_fb_cmd2 *cmd)
+ const struct drm_mode_fb_cmd2 *cmd)
{
struct sunxi_drm_framebuffer *fb;
struct drm_gem_object *gem_obj;
@@ -259,7 +260,7 @@ sunxi_drm_fb_create(struct drm_device *d
if (cmd->flags)
return NULL;
- gem_obj = drm_gem_object_lookup(ddev, file, cmd->handles[0]);
+ gem_obj = drm_gem_object_lookup(file, cmd->handles[0]);
if (gem_obj == NULL)
return NULL;
@@ -273,17 +274,7 @@ sunxi_drm_fb_create(struct drm_device *d
fb->base.offsets[2] = cmd->offsets[1];
fb->base.width = cmd->width;
fb->base.height = cmd->height;
- fb->base.pixel_format = cmd->pixel_format;
- fb->base.bits_per_pixel = drm_format_plane_cpp(fb->base.pixel_format, 0) * 8;
-
- switch (fb->base.pixel_format) {
- case DRM_FORMAT_XRGB8888:
- case DRM_FORMAT_ARGB8888:
- fb->base.depth = 32;
- break;
- default:
- break;
- }
+ fb->base.format = drm_format_info(cmd->pixel_format);
error = drm_framebuffer_init(ddev, &fb->base, &sunxi_drm_framebuffer_funcs);
if (error != 0)
@@ -294,7 +285,7 @@ sunxi_drm_fb_create(struct drm_device *d
dealloc:
drm_framebuffer_cleanup(&fb->base);
kmem_free(fb, sizeof(*fb));
- drm_gem_object_unreference_unlocked(gem_obj);
+ drm_gem_object_put_unlocked(gem_obj);
return NULL;
}
@@ -391,8 +382,7 @@ sunxi_drm_fb_probe(struct drm_fb_helper
fb->offsets[0] = 0;
fb->width = width;
fb->height = height;
- fb->pixel_format = DRM_FORMAT_XRGB8888;
- drm_fb_get_bpp_depth(fb->pixel_format, &fb->depth, &fb->bits_per_pixel);
+ fb->format = drm_format_info(DRM_FORMAT_XRGB8888);
error = drm_framebuffer_init(ddev, fb, &sunxi_drm_framebuffer_funcs);
if (error != 0) {
@@ -469,7 +459,7 @@ sunxi_drm_load(struct drm_device *ddev,
drm_fb_helper_prepare(ddev, &fbdev->helper, &sunxi_drm_fb_helper_funcs);
- error = drm_fb_helper_init(ddev, &fbdev->helper, num_crtc, num_crtc);
+ error = drm_fb_helper_init(ddev, &fbdev->helper, num_crtc);
if (error)
goto allocerr;
@@ -539,12 +529,10 @@ sunxi_drm_disable_vblank(struct drm_devi
sc->sc_vbl[crtc].disable_vblank(sc->sc_vbl[crtc].priv);
}
-static int
+static void
sunxi_drm_unload(struct drm_device *ddev)
{
drm_mode_config_cleanup(ddev);
-
- return 0;
}
int
Index: src/sys/arch/arm/sunxi/sunxi_dwhdmi.c
diff -u src/sys/arch/arm/sunxi/sunxi_dwhdmi.c:1.9 src/sys/arch/arm/sunxi/sunxi_dwhdmi.c:1.10
--- src/sys/arch/arm/sunxi/sunxi_dwhdmi.c:1.9 Wed Jan 27 03:10:20 2021
+++ src/sys/arch/arm/sunxi/sunxi_dwhdmi.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_dwhdmi.c,v 1.9 2021/01/27 03:10:20 thorpej Exp $ */
+/* $NetBSD: sunxi_dwhdmi.c,v 1.10 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_dwhdmi.c,v 1.9 2021/01/27 03:10:20 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_dwhdmi.c,v 1.10 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -37,7 +37,7 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_dwhdmi
#include <sys/kernel.h>
#include <sys/conf.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <dev/fdt/fdtvar.h>
#include <dev/fdt/fdt_port.h>
@@ -183,8 +183,9 @@ sunxi_dwhdmi_disable(struct dwhdmi_softc
}
static void
-sunxi_dwhdmi_mode_set(struct dwhdmi_softc *dsc, struct drm_display_mode *mode,
- struct drm_display_mode *adjusted_mode)
+sunxi_dwhdmi_mode_set(struct dwhdmi_softc *dsc,
+ const struct drm_display_mode *mode,
+ const struct drm_display_mode *adjusted_mode)
{
struct sunxi_dwhdmi_softc * const sc = to_sunxi_dwhdmi_softc(dsc);
int error;
Index: src/sys/arch/arm/sunxi/sunxi_fb.c
diff -u src/sys/arch/arm/sunxi/sunxi_fb.c:1.3 src/sys/arch/arm/sunxi/sunxi_fb.c:1.4
--- src/sys/arch/arm/sunxi/sunxi_fb.c:1.3 Wed Jan 30 10:55:44 2019
+++ src/sys/arch/arm/sunxi/sunxi_fb.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_fb.c,v 1.3 2019/01/30 10:55:44 jmcneill Exp $ */
+/* $NetBSD: sunxi_fb.c,v 1.4 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2015-2019 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
#include "opt_wsdisplay_compat.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_fb.c,v 1.3 2019/01/30 10:55:44 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_fb.c,v 1.4 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -37,7 +37,7 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_fb.c,v
#include <dev/fdt/fdtvar.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drmfb.h>
#include <arm/sunxi/sunxi_drm.h>
Index: src/sys/arch/arm/sunxi/sunxi_hdmiphy.h
diff -u src/sys/arch/arm/sunxi/sunxi_hdmiphy.h:1.2 src/sys/arch/arm/sunxi/sunxi_hdmiphy.h:1.3
--- src/sys/arch/arm/sunxi/sunxi_hdmiphy.h:1.2 Sat Nov 23 12:30:45 2019
+++ src/sys/arch/arm/sunxi/sunxi_hdmiphy.h Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_hdmiphy.h,v 1.2 2019/11/23 12:30:45 jmcneill Exp $ */
+/* $NetBSD: sunxi_hdmiphy.h,v 1.3 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
#ifndef _ARM_SUNXI_HDMIPHY_H
#define _ARM_SUNXI_HDMIPHY_H
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_modes.h>
void sunxi_hdmiphy_init(struct fdtbus_phy *);
Index: src/sys/arch/arm/sunxi/sunxi_lcdc.c
diff -u src/sys/arch/arm/sunxi/sunxi_lcdc.c:1.12 src/sys/arch/arm/sunxi/sunxi_lcdc.c:1.13
--- src/sys/arch/arm/sunxi/sunxi_lcdc.c:1.12 Wed Jan 27 03:10:20 2021
+++ src/sys/arch/arm/sunxi/sunxi_lcdc.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_lcdc.c,v 1.12 2021/01/27 03:10:20 thorpej Exp $ */
+/* $NetBSD: sunxi_lcdc.c,v 1.13 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_lcdc.c,v 1.12 2021/01/27 03:10:20 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_lcdc.c,v 1.13 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -37,8 +37,9 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_lcdc.c
#include <sys/kernel.h>
#include <sys/conf.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_vblank.h>
#include <dev/fdt/fdtvar.h>
#include <dev/fdt/fdt_port.h>
@@ -410,7 +411,7 @@ sunxi_lcdc_ep_activate(device_t dev, str
out_ep = fdt_endpoint_get_from_index(&sc->sc_ports, TCON_PORT_OUTPUT, 0);
if (out_ep != NULL) {
drm_encoder_init(crtc->dev, &sc->sc_encoder.base, &sunxi_lcdc_funcs,
- sunxi_lcdc_encoder_mode(out_ep));
+ sunxi_lcdc_encoder_mode(out_ep), NULL);
drm_encoder_helper_add(&sc->sc_encoder.base, &sunxi_lcdc_tcon0_helper_funcs);
sunxi_lcdc_setup_vblank(sc);
@@ -421,7 +422,7 @@ sunxi_lcdc_ep_activate(device_t dev, str
out_ep = fdt_endpoint_get_from_index(&sc->sc_ports, TCON_PORT_OUTPUT, 1);
if (out_ep != NULL) {
drm_encoder_init(crtc->dev, &sc->sc_encoder.base, &sunxi_lcdc_funcs,
- sunxi_lcdc_encoder_mode(out_ep));
+ sunxi_lcdc_encoder_mode(out_ep), NULL);
drm_encoder_helper_add(&sc->sc_encoder.base, &sunxi_lcdc_tcon1_helper_funcs);
sunxi_lcdc_setup_vblank(sc);
Index: src/sys/arch/arm/sunxi/sunxi_mixer.c
diff -u src/sys/arch/arm/sunxi/sunxi_mixer.c:1.16 src/sys/arch/arm/sunxi/sunxi_mixer.c:1.17
--- src/sys/arch/arm/sunxi/sunxi_mixer.c:1.16 Wed Jan 27 03:10:20 2021
+++ src/sys/arch/arm/sunxi/sunxi_mixer.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_mixer.c,v 1.16 2021/01/27 03:10:20 thorpej Exp $ */
+/* $NetBSD: sunxi_mixer.c,v 1.17 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_mixer.c,v 1.16 2021/01/27 03:10:20 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_mixer.c,v 1.17 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -38,10 +38,12 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_mixer.
#include <sys/conf.h>
#include <sys/sysctl.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_fourcc.h>
#include <drm/drm_plane_helper.h>
+#include <drm/drm_vblank.h>
#include <dev/fdt/fdtvar.h>
#include <dev/fdt/fdt_port.h>
@@ -282,7 +284,7 @@ sunxi_mixer_mode_do_set_base(struct drm_
uint64_t paddr = (uint64_t)sfb->obj->dmamap->dm_segs[0].ds_addr;
paddr += y * sfb->base.pitches[0];
- paddr += x * drm_format_plane_cpp(sfb->base.pixel_format, 0);
+ paddr += x * sfb->base.format->cpp[0];
uint32_t haddr = (paddr >> 32) & OVL_UI_TOP_HADD_LAYER0;
uint32_t laddr = paddr & 0xffffffff;
@@ -308,7 +310,8 @@ sunxi_mixer_destroy(struct drm_crtc *crt
static int
sunxi_mixer_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
- struct drm_pending_vblank_event *event, uint32_t flags)
+ struct drm_pending_vblank_event *event, uint32_t flags,
+ struct drm_modeset_acquire_ctx *ctx)
{
struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
@@ -323,7 +326,7 @@ sunxi_mixer_page_flip(struct drm_crtc *c
if (event) {
spin_lock_irqsave(&crtc->dev->event_lock, irqflags);
- drm_send_vblank_event(crtc->dev, drm_crtc_index(crtc), event);
+ drm_crtc_send_vblank_event(crtc, event);
spin_unlock_irqrestore(&crtc->dev->event_lock, irqflags);
}
@@ -362,7 +365,7 @@ sunxi_mixer_cursor_set(struct drm_crtc *
goto done;
}
- gem_obj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
+ gem_obj = drm_gem_object_lookup(file_priv, handle);
if (gem_obj == NULL) {
DRM_ERROR("Cannot find cursor object %#x for crtc %d\n",
handle, drm_crtc_index(crtc));
@@ -431,7 +434,7 @@ done:
}
if (gem_obj != NULL)
- drm_gem_object_unreference_unlocked(gem_obj);
+ drm_gem_object_put_unlocked(gem_obj);
return error;
}
@@ -515,7 +518,7 @@ sunxi_mixer_mode_set(struct drm_crtc *cr
BLD_WRITE(sc, BLD_SIZE, size);
/* Enable UI overlay */
- if (crtc->primary->fb->pixel_format == DRM_FORMAT_XRGB8888)
+ if (crtc->primary->fb->format->format == DRM_FORMAT_XRGB8888)
fbfmt = OVL_UI_ATTR_CTL_LAY_FBFMT_XRGB_8888;
else
fbfmt = OVL_UI_ATTR_CTL_LAY_FBFMT_ARGB_8888;
@@ -1009,13 +1012,13 @@ static const uint32_t lan2coefftab32[512
static void
sunxi_mixer_vsu_init(struct sunxi_mixer_softc *sc, u_int src_w, u_int src_h,
- u_int crtc_w, u_int crtc_h, uint32_t pixel_format)
+ u_int crtc_w, u_int crtc_h, const struct drm_format_info *format)
{
const u_int hstep = (src_w << 16) / crtc_w;
const u_int vstep = (src_h << 16) / crtc_h;
- const int hsub = drm_format_horz_chroma_subsampling(pixel_format);
- const int vsub = drm_format_vert_chroma_subsampling(pixel_format);
+ const int hsub = format->hsub;
+ const int vsub = format->vsub;
const u_int src_cw = src_w / hsub;
const u_int src_ch = src_h / vsub;
@@ -1078,14 +1081,15 @@ sunxi_mixer_csc_disable(struct sunxi_mix
static int
sunxi_mixer_overlay_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
struct drm_framebuffer *fb, int crtc_x, int crtc_y, u_int crtc_w, u_int crtc_h,
- uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h)
+ uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h,
+ struct drm_modeset_acquire_ctx *ctx)
{
struct sunxi_mixer_plane *overlay = to_sunxi_mixer_plane(plane);
struct sunxi_mixer_softc * const sc = overlay->sc;
struct sunxi_drm_framebuffer *sfb = to_sunxi_drm_framebuffer(fb);
uint32_t val;
- const u_int fbfmt = sunxi_mixer_overlay_format(fb->pixel_format);
+ const u_int fbfmt = sunxi_mixer_overlay_format(fb->format->format);
const uint64_t paddr = (uint64_t)sfb->obj->dmamap->dm_segs[0].ds_addr;
const uint32_t input_size = (((src_h >> 16) - 1) << 16) | ((src_w >> 16) - 1);
@@ -1101,13 +1105,13 @@ sunxi_mixer_overlay_update_plane(struct
OVL_V_WRITE(sc, OVL_V_PITCH2(0), fb->pitches[1]);
const uint64_t paddr0 = paddr + fb->offsets[0] +
- (src_x >> 16) * drm_format_plane_cpp(fb->pixel_format, 0) +
+ (src_x >> 16) * fb->format->cpp[0] +
(src_y >> 16) * fb->pitches[0];
const uint64_t paddr1 = paddr + fb->offsets[2] +
- (src_x >> 16) * drm_format_plane_cpp(fb->pixel_format, 2) +
+ (src_x >> 16) * fb->format->cpp[2] +
(src_y >> 16) * fb->pitches[2];
const uint64_t paddr2 = paddr + fb->offsets[1] +
- (src_x >> 16) * drm_format_plane_cpp(fb->pixel_format, 1) +
+ (src_x >> 16) * fb->format->cpp[1] +
(src_y >> 16) * fb->pitches[1];
OVL_V_WRITE(sc, OVL_V_TOP_HADD0, (paddr0 >> 32) & OVL_V_TOP_HADD_LAYER0);
@@ -1122,16 +1126,16 @@ sunxi_mixer_overlay_update_plane(struct
val = OVL_V_ATTCTL_LAY0_EN;
val |= __SHIFTIN(fbfmt, OVL_V_ATTCTL_LAY_FBFMT);
- if (sunxi_mixer_overlay_rgb(fb->pixel_format) == true)
+ if (sunxi_mixer_overlay_rgb(fb->format->format) == true)
val |= OVL_V_ATTCTL_VIDEO_UI_SEL;
OVL_V_WRITE(sc, OVL_V_ATTCTL(0), val);
/* Enable video scaler */
- sunxi_mixer_vsu_init(sc, src_w >> 16, src_h >> 16, crtc_w, crtc_h, fb->pixel_format);
+ sunxi_mixer_vsu_init(sc, src_w >> 16, src_h >> 16, crtc_w, crtc_h, fb->format);
/* Enable colour space conversion for non-RGB formats */
- if (sunxi_mixer_overlay_rgb(fb->pixel_format) == false)
- sunxi_mixer_csc_init(sc, fb->pixel_format);
+ if (sunxi_mixer_overlay_rgb(fb->format->format) == false)
+ sunxi_mixer_csc_init(sc, fb->format->format);
else
sunxi_mixer_csc_disable(sc);
@@ -1157,7 +1161,8 @@ sunxi_mixer_overlay_update_plane(struct
}
static int
-sunxi_mixer_overlay_disable_plane(struct drm_plane *plane)
+sunxi_mixer_overlay_disable_plane(struct drm_plane *plane,
+ struct drm_modeset_acquire_ctx *ctx)
{
struct sunxi_mixer_plane *overlay = to_sunxi_mixer_plane(plane);
struct sunxi_mixer_softc * const sc = overlay->sc;
@@ -1231,7 +1236,7 @@ sunxi_mixer_ep_activate(device_t dev, st
drm_universal_plane_init(ddev, &sc->sc_overlay.base,
1 << drm_crtc_index(&sc->sc_crtc.base), &sunxi_mixer_overlay_funcs,
sunxi_mixer_overlay_formats, __arraycount(sunxi_mixer_overlay_formats),
- DRM_PLANE_TYPE_OVERLAY);
+ NULL, DRM_PLANE_TYPE_OVERLAY, NULL);
return fdt_endpoint_activate(ep, activate);
}
Index: src/sys/dev/fdt/fdt_panel.c
diff -u src/sys/dev/fdt/fdt_panel.c:1.4 src/sys/dev/fdt/fdt_panel.c:1.5
--- src/sys/dev/fdt/fdt_panel.c:1.4 Sun Nov 7 17:11:58 2021
+++ src/sys/dev/fdt/fdt_panel.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_panel.c,v 1.4 2021/11/07 17:11:58 jmcneill Exp $ */
+/* $NetBSD: fdt_panel.c,v 1.5 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jonathan A. Kollasch <jakll...@kollasch.net>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_panel.c,v 1.4 2021/11/07 17:11:58 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_panel.c,v 1.5 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -40,7 +40,7 @@ __KERNEL_RCSID(0, "$NetBSD: fdt_panel.c,
#include <dev/i2c/ddcvar.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_panel.h>
#include <drm/drm_edid.h>
@@ -158,7 +158,7 @@ panel_fdt_attach(device_t parent, device
sc->sc_ports.dp_ep_get_data = panel_fdt_ep_get_data;
fdt_ports_register(&sc->sc_ports, self, phandle, EP_DRM_PANEL);
- drm_panel_init(&sc->sc_panel);
+ drm_panel_init(&sc->sc_panel, self, &panel_fdt_funcs, DRM_MODE_CONNECTOR_DPI);
sc->sc_panel.funcs = &panel_fdt_funcs;
drm_panel_add(&sc->sc_panel);
Index: src/sys/dev/fdt/hdmi_connector.c
diff -u src/sys/dev/fdt/hdmi_connector.c:1.2 src/sys/dev/fdt/hdmi_connector.c:1.3
--- src/sys/dev/fdt/hdmi_connector.c:1.2 Wed Jan 27 03:10:21 2021
+++ src/sys/dev/fdt/hdmi_connector.c Sun Dec 19 11:00:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: hdmi_connector.c,v 1.2 2021/01/27 03:10:21 thorpej Exp $ */
+/* $NetBSD: hdmi_connector.c,v 1.3 2021/12/19 11:00:46 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hdmi_connector.c,v 1.2 2021/01/27 03:10:21 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hdmi_connector.c,v 1.3 2021/12/19 11:00:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -40,10 +40,11 @@ __KERNEL_RCSID(0, "$NetBSD: hdmi_connect
#include <dev/i2c/ddcvar.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_edid.h>
+#include <drm/drm_probe_helper.h>
static const struct device_compatible_entry compat_data[] = {
{ .compat = "hdmi-connector" },
@@ -132,38 +133,16 @@ dispcon_hdmi_connector_get_modes(struct
}
}
- drm_mode_connector_update_edid_property(connector, pedid);
+ drm_connector_update_edid_property(connector, pedid);
if (pedid == NULL)
return 0;
- error = drm_add_edid_modes(connector, pedid);
- drm_edid_to_eld(connector, pedid);
-
- return error;
-}
-
-static struct drm_encoder *
-dispcon_hdmi_connector_best_encoder(struct drm_connector *connector)
-{
- int enc_id = connector->encoder_ids[0];
- struct drm_mode_object *obj;
- struct drm_encoder *encoder = NULL;
-
- if (enc_id) {
- obj = drm_mode_object_find(connector->dev, enc_id,
- DRM_MODE_OBJECT_ENCODER);
- if (obj == NULL)
- return NULL;
- encoder = obj_to_encoder(obj);
- }
-
- return encoder;
+ return drm_add_edid_modes(connector, pedid);
}
static const struct drm_connector_helper_funcs dispcon_hdmi_connector_helper_funcs = {
.mode_valid = dispcon_hdmi_connector_mode_valid,
.get_modes = dispcon_hdmi_connector_get_modes,
- .best_encoder = dispcon_hdmi_connector_best_encoder,
};
static int
@@ -191,7 +170,7 @@ dispcon_hdmi_ep_activate(device_t dev, s
hdmi_connector->type);
drm_connector_helper_add(connector, &dispcon_hdmi_connector_helper_funcs);
drm_connector_register(connector);
- drm_mode_connector_attach_encoder(connector, encoder);
+ drm_connector_attach_encoder(connector, encoder);
}
return 0;
Index: src/sys/dev/i2c/anxedp.c
diff -u src/sys/dev/i2c/anxedp.c:1.6 src/sys/dev/i2c/anxedp.c:1.7
--- src/sys/dev/i2c/anxedp.c:1.6 Wed Jan 27 02:29:48 2021
+++ src/sys/dev/i2c/anxedp.c Sun Dec 19 11:00:47 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: anxedp.c,v 1.6 2021/01/27 02:29:48 thorpej Exp $ */
+/* $NetBSD: anxedp.c,v 1.7 2021/12/19 11:00:47 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: anxedp.c,v 1.6 2021/01/27 02:29:48 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: anxedp.c,v 1.7 2021/12/19 11:00:47 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -48,10 +48,12 @@ __KERNEL_RCSID(0, "$NetBSD: anxedp.c,v 1
#include <dev/fdt/fdtvar.h>
#include <dev/fdt/fdt_port.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_connector.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_edid.h>
+#include <drm/drm_probe_helper.h>
#define ANX_DP_AUX_CH_CTL_1 0xe5
#define ANX_AUX_LENGTH __BITS(7,4)
@@ -253,37 +255,15 @@ anxedp_connector_get_modes(struct drm_co
if (error == 0)
pedid = (struct edid *)edid;
- drm_mode_connector_update_edid_property(connector, pedid);
+ drm_connector_update_edid_property(connector, pedid);
if (pedid == NULL)
return 0;
- error = drm_add_edid_modes(connector, pedid);
- drm_edid_to_eld(connector, pedid);
-
- return error;
-}
-
-static struct drm_encoder *
-anxedp_connector_best_encoder(struct drm_connector *connector)
-{
- int enc_id = connector->encoder_ids[0];
- struct drm_mode_object *obj;
- struct drm_encoder *encoder = NULL;
-
- if (enc_id) {
- obj = drm_mode_object_find(connector->dev, enc_id,
- DRM_MODE_OBJECT_ENCODER);
- if (obj == NULL)
- return NULL;
- encoder = obj_to_encoder(obj);
- }
-
- return encoder;
+ return drm_add_edid_modes(connector, pedid);
}
static const struct drm_connector_helper_funcs anxedp_connector_helper_funcs = {
.get_modes = anxedp_connector_get_modes,
- .best_encoder = anxedp_connector_best_encoder,
};
static int
@@ -304,7 +284,7 @@ anxedp_bridge_attach(struct drm_bridge *
connector->connector_type);
drm_connector_helper_add(connector, &anxedp_connector_helper_funcs);
- error = drm_mode_connector_attach_encoder(connector, bridge->encoder);
+ error = drm_connector_attach_encoder(connector, bridge->encoder);
if (error != 0)
return error;
@@ -333,7 +313,8 @@ anxedp_bridge_post_disable(struct drm_br
static void
anxedp_bridge_mode_set(struct drm_bridge *bridge,
- struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode)
+ const struct drm_display_mode *mode,
+ const struct drm_display_mode *adjusted_mode)
{
struct anxedp_softc * const sc = bridge->driver_private;
@@ -394,12 +375,10 @@ anxedp_ep_activate(device_t dev, struct
sc->sc_bridge.funcs = &anxedp_bridge_funcs;
sc->sc_bridge.encoder = encoder;
- error = drm_bridge_attach(encoder->dev, &sc->sc_bridge);
+ error = drm_bridge_attach(encoder, &sc->sc_bridge, NULL);
if (error != 0)
return EIO;
- encoder->bridge = &sc->sc_bridge;
-
return 0;
}
Index: src/sys/dev/ic/anx_dp.c
diff -u src/sys/dev/ic/anx_dp.c:1.2 src/sys/dev/ic/anx_dp.c:1.3
--- src/sys/dev/ic/anx_dp.c:1.2 Sat Jan 4 12:08:32 2020
+++ src/sys/dev/ic/anx_dp.c Sun Dec 19 11:00:47 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: anx_dp.c,v 1.2 2020/01/04 12:08:32 jmcneill Exp $ */
+/* $NetBSD: anx_dp.c,v 1.3 2021/12/19 11:00:47 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jonathan A. Kollasch <jakll...@kollasch.net>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: anx_dp.c,v 1.2 2020/01/04 12:08:32 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: anx_dp.c,v 1.3 2021/12/19 11:00:47 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -43,7 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: anx_dp.c,v 1
#include <dev/audio/audio_dai.h>
#endif
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_dp_helper.h>
@@ -198,6 +198,13 @@ __KERNEL_RCSID(0, "$NetBSD: anx_dp.c,v 1
#define ANXDP_PLL_REG_4 0x9ec
#define ANXDP_PLL_REG_5 0xa00
+struct anxdp_link {
+ uint8_t revision;
+ u_int rate;
+ u_int num_lanes;
+ bool enhanced_framing;
+};
+
#if ANXDP_AUDIO
enum anxdp_dai_mixer_ctrl {
ANXDP_DAI_OUTPUT_CLASS,
@@ -348,12 +355,11 @@ anxdp_connector_get_modes(struct drm_con
}
#endif
- drm_mode_connector_update_edid_property(connector, pedid);
+ drm_connector_update_edid_property(connector, pedid);
if (pedid == NULL)
return 0;
error = drm_add_edid_modes(connector, pedid);
- drm_edid_to_eld(connector, pedid);
if (pedid != NULL)
kfree(pedid);
@@ -361,27 +367,8 @@ anxdp_connector_get_modes(struct drm_con
return error;
}
-static struct drm_encoder *
-anxdp_connector_best_encoder(struct drm_connector *connector)
-{
- int enc_id = connector->encoder_ids[0];
- struct drm_mode_object *obj;
- struct drm_encoder *encoder = NULL;
-
- if (enc_id) {
- obj = drm_mode_object_find(connector->dev, enc_id,
- DRM_MODE_OBJECT_ENCODER);
- if (obj == NULL)
- return NULL;
- encoder = obj_to_encoder(obj);
- }
-
- return encoder;
-}
-
static const struct drm_connector_helper_funcs anxdp_connector_helper_funcs = {
.get_modes = anxdp_connector_get_modes,
- .best_encoder = anxdp_connector_best_encoder,
};
static int
@@ -403,7 +390,7 @@ anxdp_bridge_attach(struct drm_bridge *b
connector->connector_type);
drm_connector_helper_add(connector, &anxdp_connector_helper_funcs);
- error = drm_mode_connector_attach_encoder(connector, bridge->encoder);
+ error = drm_connector_attach_encoder(connector, bridge->encoder);
if (error != 0)
return error;
@@ -424,16 +411,22 @@ anxdp_macro_reset(struct anxdp_softc * c
}
static void
-anxdp_link_start(struct anxdp_softc * const sc, struct drm_dp_link * const link)
+anxdp_link_start(struct anxdp_softc * const sc, struct anxdp_link * const link)
{
uint8_t training[4];
+ uint8_t bw[2];
uint32_t val;
bus_space_write_4(sc->sc_bst, sc->sc_bsh, ANXDP_LINK_BW_SET, drm_dp_link_rate_to_bw_code(link->rate));
bus_space_write_4(sc->sc_bst, sc->sc_bsh, ANXDP_LANE_COUNT_SET, link->num_lanes);
- if (0 != drm_dp_link_configure(&sc->sc_dpaux, link))
- return;
+ bw[0] = drm_dp_link_rate_to_bw_code(link->rate);
+ bw[1] = link->num_lanes;
+ if (link->enhanced_framing)
+ bw[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
+ if (drm_dp_dpcd_write(&sc->sc_dpaux, DP_LINK_BW_SET, bw, sizeof(bw)) < 0)
+ return;
+
for (u_int i = 0; i < link->num_lanes; i++) {
val = bus_space_read_4(sc->sc_bst, sc->sc_bsh,
ANXDP_LNx_LINK_TRAINING_CTL(i));
@@ -458,7 +451,7 @@ anxdp_link_start(struct anxdp_softc * co
static void
anxdp_process_clock_recovery(struct anxdp_softc * const sc,
- struct drm_dp_link * const link)
+ struct anxdp_link * const link)
{
u_int i, tries;
uint8_t link_status[DP_LINK_STATUS_SIZE];
@@ -503,7 +496,7 @@ cr_fail:
}
static void
-anxdp_process_eq(struct anxdp_softc * const sc, struct drm_dp_link * const link)
+anxdp_process_eq(struct anxdp_softc * const sc, struct anxdp_link * const link)
{
u_int i, tries;
uint8_t link_status[DP_LINK_STATUS_SIZE];
@@ -550,16 +543,32 @@ eq_fail:
static void
anxdp_train_link(struct anxdp_softc * const sc)
{
- struct drm_dp_link link;
+ struct anxdp_link link;
+ uint8_t values[3], power;
anxdp_macro_reset(sc);
- if (0 != drm_dp_link_probe(&sc->sc_dpaux, &link)) {
+ if (drm_dp_dpcd_read(&sc->sc_dpaux, DP_DPCD_REV, values, sizeof(values)) < 0) {
device_printf(sc->sc_dev, "link probe failed\n");
return;
}
- if (0 != drm_dp_link_power_up(&sc->sc_dpaux, &link))
- return;
+ memset(&link, 0, sizeof(link));
+ link.revision = values[0];
+ link.rate = drm_dp_bw_code_to_link_rate(values[1]);
+ link.num_lanes = values[2] & DP_MAX_LANE_COUNT_MASK;
+ if (values[2] & DP_ENHANCED_FRAME_CAP)
+ link.enhanced_framing = true;
+
+ if (link.revision >= 0x11) {
+ if (drm_dp_dpcd_readb(&sc->sc_dpaux, DP_SET_POWER, &power) < 0)
+ return;
+ power &= ~DP_SET_POWER_MASK;
+ power |= DP_SET_POWER_D0;
+ if (drm_dp_dpcd_writeb(&sc->sc_dpaux, DP_SET_POWER, power) < 0)
+ return;
+ delay(2000);
+ }
+
if (DP_RECEIVER_CAP_SIZE != drm_dp_dpcd_read(&sc->sc_dpaux, DP_DPCD_REV,
sc->sc_dpcd, DP_RECEIVER_CAP_SIZE))
return;
@@ -718,7 +727,7 @@ anxdp_bridge_post_disable(struct drm_bri
static void
anxdp_bridge_mode_set(struct drm_bridge *bridge,
- struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode)
+ const struct drm_display_mode *mode, const struct drm_display_mode *adjusted_mode)
{
struct anxdp_softc * const sc = bridge->driver_private;
@@ -1043,12 +1052,10 @@ anxdp_bind(struct anxdp_softc *sc, struc
sc->sc_bridge.funcs = &anxdp_bridge_funcs;
sc->sc_bridge.encoder = encoder;
- error = drm_bridge_attach(encoder->dev, &sc->sc_bridge);
+ error = drm_bridge_attach(encoder, &sc->sc_bridge, NULL);
if (error != 0)
return EIO;
- encoder->bridge = &sc->sc_bridge;
-
if (sc->sc_panel != NULL && sc->sc_panel->funcs != NULL && sc->sc_panel->funcs->prepare != NULL)
sc->sc_panel->funcs->prepare(sc->sc_panel);
Index: src/sys/dev/ic/anx_dp.h
diff -u src/sys/dev/ic/anx_dp.h:1.2 src/sys/dev/ic/anx_dp.h:1.3
--- src/sys/dev/ic/anx_dp.h:1.2 Sat Jan 4 12:08:32 2020
+++ src/sys/dev/ic/anx_dp.h Sun Dec 19 11:00:47 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: anx_dp.h,v 1.2 2020/01/04 12:08:32 jmcneill Exp $ */
+/* $NetBSD: anx_dp.h,v 1.3 2021/12/19 11:00:47 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jonathan A. Kollasch <jakll...@kollasch.net>
@@ -33,9 +33,12 @@
#include <dev/audio/audio_dai.h>
#endif
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_bridge.h>
+#include <drm/drm_connector.h>
#include <drm/drm_dp_helper.h>
#include <drm/drm_panel.h>
+#include <drm/drm_probe_helper.h>
struct anxdp_softc;
Index: src/sys/dev/ic/dw_hdmi_phy.c
diff -u src/sys/dev/ic/dw_hdmi_phy.c:1.2 src/sys/dev/ic/dw_hdmi_phy.c:1.3
--- src/sys/dev/ic/dw_hdmi_phy.c:1.2 Sun Nov 10 10:36:01 2019
+++ src/sys/dev/ic/dw_hdmi_phy.c Sun Dec 19 11:00:47 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: dw_hdmi_phy.c,v 1.2 2019/11/10 10:36:01 jmcneill Exp $ */
+/* $NetBSD: dw_hdmi_phy.c,v 1.3 2021/12/19 11:00:47 riastradh Exp $ */
/*-
* Copyright (c) 2015 Oleksandr Tymoshenko <go...@freebsd.org>
@@ -27,11 +27,11 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dw_hdmi_phy.c,v 1.2 2019/11/10 10:36:01 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dw_hdmi_phy.c,v 1.3 2021/12/19 11:00:47 riastradh Exp $");
#include <sys/param.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <dev/ic/dw_hdmi.h>
@@ -267,7 +267,7 @@ dwhdmi_phy_test_clear(struct dwhdmi_soft
}
static int
-dwhdmi_phy_configure(struct dwhdmi_softc *sc, struct drm_display_mode *mode)
+dwhdmi_phy_configure(struct dwhdmi_softc *sc, const struct drm_display_mode *mode)
{
const struct dwhdmi_mpll_config *mpll_conf;
const struct dwhdmi_phy_config *phy_conf;
@@ -355,7 +355,7 @@ dwhdmi_phy_configure(struct dwhdmi_softc
}
static void
-dwhdmi_phy_init(struct dwhdmi_softc *sc, struct drm_display_mode *mode)
+dwhdmi_phy_init(struct dwhdmi_softc *sc, const struct drm_display_mode *mode)
{
int i;
@@ -395,7 +395,8 @@ dwhdmi_phy_disable(struct dwhdmi_softc *
void
dwhdmi_phy_mode_set(struct dwhdmi_softc *sc,
- struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode)
+ const struct drm_display_mode *mode,
+ const struct drm_display_mode *adjusted_mode)
{
dwhdmi_phy_init(sc, adjusted_mode);
}
Index: src/sys/dev/ic/dw_hdmi.c
diff -u src/sys/dev/ic/dw_hdmi.c:1.7 src/sys/dev/ic/dw_hdmi.c:1.8
--- src/sys/dev/ic/dw_hdmi.c:1.7 Sun Dec 22 23:23:32 2019
+++ src/sys/dev/ic/dw_hdmi.c Sun Dec 19 11:00:47 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: dw_hdmi.c,v 1.7 2019/12/22 23:23:32 thorpej Exp $ */
+/* $NetBSD: dw_hdmi.c,v 1.8 2021/12/19 11:00:47 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dw_hdmi.c,v 1.7 2019/12/22 23:23:32 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dw_hdmi.c,v 1.8 2021/12/19 11:00:47 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -47,10 +47,11 @@ __KERNEL_RCSID(0, "$NetBSD: dw_hdmi.c,v
#include <dev/audio/audio_dai.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_edid.h>
+#include <drm/drm_probe_helper.h>
#define HDMI_DESIGN_ID 0x0000
#define HDMI_REVISION_ID 0x0001
@@ -601,37 +602,15 @@ dwhdmi_connector_get_modes(struct drm_co
dwhdmi_connector->monitor_audio = false;
}
- drm_mode_connector_update_edid_property(connector, pedid);
+ drm_connector_update_edid_property(connector, pedid);
if (pedid == NULL)
return 0;
- error = drm_add_edid_modes(connector, pedid);
- drm_edid_to_eld(connector, pedid);
-
- return error;
-}
-
-static struct drm_encoder *
-dwhdmi_connector_best_encoder(struct drm_connector *connector)
-{
- int enc_id = connector->encoder_ids[0];
- struct drm_mode_object *obj;
- struct drm_encoder *encoder = NULL;
-
- if (enc_id) {
- obj = drm_mode_object_find(connector->dev, enc_id,
- DRM_MODE_OBJECT_ENCODER);
- if (obj == NULL)
- return NULL;
- encoder = obj_to_encoder(obj);
- }
-
- return encoder;
+ return drm_add_edid_modes(connector, pedid);
}
static const struct drm_connector_helper_funcs dwhdmi_connector_helper_funcs = {
.get_modes = dwhdmi_connector_get_modes,
- .best_encoder = dwhdmi_connector_best_encoder,
};
static int
@@ -652,7 +631,7 @@ dwhdmi_bridge_attach(struct drm_bridge *
DRM_MODE_CONNECTOR_HDMIA);
drm_connector_helper_add(connector, &dwhdmi_connector_helper_funcs);
- error = drm_mode_connector_attach_encoder(connector, bridge->encoder);
+ error = drm_connector_attach_encoder(connector, bridge->encoder);
if (error != 0)
return error;
@@ -700,7 +679,8 @@ dwhdmi_bridge_post_disable(struct drm_br
static void
dwhdmi_bridge_mode_set(struct drm_bridge *bridge,
- struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode)
+ const struct drm_display_mode *mode,
+ const struct drm_display_mode *adjusted_mode)
{
struct dwhdmi_softc * const sc = bridge->driver_private;
@@ -917,11 +897,9 @@ dwhdmi_bind(struct dwhdmi_softc *sc, str
sc->sc_bridge.funcs = &dwhdmi_bridge_funcs;
sc->sc_bridge.encoder = encoder;
- error = drm_bridge_attach(encoder->dev, &sc->sc_bridge);
+ error = drm_bridge_attach(encoder, &sc->sc_bridge, NULL);
if (error != 0)
return EIO;
- encoder->bridge = &sc->sc_bridge;
-
return 0;
}
Index: src/sys/dev/ic/dw_hdmi.h
diff -u src/sys/dev/ic/dw_hdmi.h:1.6 src/sys/dev/ic/dw_hdmi.h:1.7
--- src/sys/dev/ic/dw_hdmi.h:1.6 Sun Dec 22 23:23:32 2019
+++ src/sys/dev/ic/dw_hdmi.h Sun Dec 19 11:00:47 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: dw_hdmi.h,v 1.6 2019/12/22 23:23:32 thorpej Exp $ */
+/* $NetBSD: dw_hdmi.h,v 1.7 2021/12/19 11:00:47 riastradh Exp $ */
/*-
* Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -34,7 +34,10 @@
#include <dev/audio/audio_dai.h>
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_bridge.h>
+#include <drm/drm_connector.h>
+#include <drm/drm_modes.h>
struct dwhdmi_softc;
@@ -91,8 +94,8 @@ struct dwhdmi_softc {
void (*sc_enable)(struct dwhdmi_softc *);
void (*sc_disable)(struct dwhdmi_softc *);
void (*sc_mode_set)(struct dwhdmi_softc *,
- struct drm_display_mode *,
- struct drm_display_mode *);
+ const struct drm_display_mode *,
+ const struct drm_display_mode *);
};
#define to_dwhdmi_connector(x) container_of(x, struct dwhdmi_connector, base)
@@ -107,7 +110,7 @@ enum drm_connector_status dwhdmi_phy_det
void dwhdmi_phy_enable(struct dwhdmi_softc *);
void dwhdmi_phy_disable(struct dwhdmi_softc *);
void dwhdmi_phy_mode_set(struct dwhdmi_softc *,
- struct drm_display_mode *,
- struct drm_display_mode *);
+ const struct drm_display_mode *,
+ const struct drm_display_mode *);
#endif /* !_DEV_IC_DWHDMI_H */
Index: src/sys/external/bsd/dwc2/dwc2.h
diff -u src/sys/external/bsd/dwc2/dwc2.h:1.10 src/sys/external/bsd/dwc2/dwc2.h:1.11
--- src/sys/external/bsd/dwc2/dwc2.h:1.10 Mon Aug 27 17:13:07 2018
+++ src/sys/external/bsd/dwc2/dwc2.h Sun Dec 19 11:00:47 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc2.h,v 1.10 2018/08/27 17:13:07 riastradh Exp $ */
+/* $NetBSD: dwc2.h,v 1.11 2021/12/19 11:00:47 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -41,6 +41,7 @@
#include <linux/list.h>
#include <linux/workqueue.h>
+#include <linux/bug.h>
#include "opt_usb.h"
// #define VERBOSE_DEBUG
@@ -70,7 +71,6 @@ typedef int irqreturn_t;
#ifdef DWC2_DEBUG
extern int dwc2debug;
-#define WARN_ON(x) KASSERT(!(x))
#define dev_info(d,fmt,...) do { \
printf("%s: " fmt, device_xname(d), \
@@ -97,7 +97,6 @@ extern int dwc2debug;
} \
} while (0)
#else
-#define WARN_ON(x)
#define dev_info(...) do { } while (0)
#define dev_warn(...) do { } while (0)
#define dev_err(...) do { } while (0)