Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'topic-arcpgu-sim' of https://github.com/foss-for-synopsys-dwc-arc-processors/linux into drm-next

Add support for arcgpu on the sim platform.

* 'topic-arcpgu-sim' of https://github.com/foss-for-synopsys-dwc-arc-processors/linux:
ARC: [nsimosci] Enable ARC PGU on nSIM OSCI virtual platforms
ARCv2: [vdk] Enable ARC PGU on HS38 VDK
drm/arcpgu: Make ARC PGU usable on simulation platforms

+189 -30
+11 -3
arch/arc/boot/dts/nsimosci.dts
··· 20 20 /* this is for console on PGU */ 21 21 /* bootargs = "console=tty0 consoleblank=0"; */ 22 22 /* this is for console on serial */ 23 - bootargs = "earlycon=uart8250,mmio32,0xf0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblank=0 debug"; 23 + bootargs = "earlycon=uart8250,mmio32,0xf0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblank=0 debug video=640x480-24"; 24 24 }; 25 25 26 26 aliases { ··· 58 58 no-loopback-test = <1>; 59 59 }; 60 60 61 - pgu0: pgu@f9000000 { 62 - compatible = "snps,arcpgufb"; 61 + pguclk: pguclk { 62 + #clock-cells = <0>; 63 + compatible = "fixed-clock"; 64 + clock-frequency = <25175000>; 65 + }; 66 + 67 + pgu@f9000000 { 68 + compatible = "snps,arcpgu"; 63 69 reg = <0xf9000000 0x400>; 70 + clocks = <&pguclk>; 71 + clock-names = "pxlclk"; 64 72 }; 65 73 66 74 ps2: ps2@f9001000 {
+11 -3
arch/arc/boot/dts/nsimosci_hs.dts
··· 20 20 /* this is for console on PGU */ 21 21 /* bootargs = "console=tty0 consoleblank=0"; */ 22 22 /* this is for console on serial */ 23 - bootargs = "earlycon=uart8250,mmio32,0xf0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblank=0 debug"; 23 + bootargs = "earlycon=uart8250,mmio32,0xf0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblank=0 debug video=640x480-24"; 24 24 }; 25 25 26 26 aliases { ··· 58 58 no-loopback-test = <1>; 59 59 }; 60 60 61 - pgu0: pgu@f9000000 { 62 - compatible = "snps,arcpgufb"; 61 + pguclk: pguclk { 62 + #clock-cells = <0>; 63 + compatible = "fixed-clock"; 64 + clock-frequency = <25175000>; 65 + }; 66 + 67 + pgu@f9000000 { 68 + compatible = "snps,arcpgu"; 63 69 reg = <0xf9000000 0x400>; 70 + clocks = <&pguclk>; 71 + clock-names = "pxlclk"; 64 72 }; 65 73 66 74 ps2: ps2@f9001000 {
+11 -3
arch/arc/boot/dts/nsimosci_hs_idu.dts
··· 18 18 19 19 chosen { 20 20 /* this is for console on serial */ 21 - bootargs = "earlycon=uart8250,mmio32,0xf0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblan=0 debug"; 21 + bootargs = "earlycon=uart8250,mmio32,0xf0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblan=0 debug video=640x480-24"; 22 22 }; 23 23 24 24 aliases { ··· 77 77 no-loopback-test = <1>; 78 78 }; 79 79 80 - pgu0: pgu@f9000000 { 81 - compatible = "snps,arcpgufb"; 80 + pguclk: pguclk { 81 + #clock-cells = <0>; 82 + compatible = "fixed-clock"; 83 + clock-frequency = <25175000>; 84 + }; 85 + 86 + pgu@f9000000 { 87 + compatible = "snps,arcpgu"; 82 88 reg = <0xf9000000 0x400>; 89 + clocks = <&pguclk>; 90 + clock-names = "pxlclk"; 83 91 }; 84 92 85 93 ps2: ps2@f9001000 {
+9 -4
arch/arc/boot/dts/vdk_axs10x_mb.dtsi
··· 23 23 #clock-cells = <0>; 24 24 }; 25 25 26 + pguclk: pguclk { 27 + #clock-cells = <0>; 28 + compatible = "fixed-clock"; 29 + clock-frequency = <25175000>; 30 + }; 26 31 }; 27 32 28 33 ethernet@0x18000 { ··· 80 75 }; 81 76 82 77 /* PGU output directly sent to virtual LCD screen; hdmi controller not modelled */ 83 - pgu@0x17000 { 84 - compatible = "snps,arcpgufb"; 78 + pgu@17000 { 79 + compatible = "snps,arcpgu"; 85 80 reg = <0x17000 0x400>; 86 - clock-frequency = <51000000>; /* PGU'clock is initated in init function */ 87 - /* interrupts = <5>; PGU interrupts not used, this vector is used for ps2 below */ 81 + clocks = <&pguclk>; 82 + clock-names = "pxlclk"; 88 83 }; 89 84 90 85 /* VDK has additional ps2 keyboard/mouse interface integrated in LCD screen model */
+1 -1
arch/arc/boot/dts/vdk_hs38_smp.dts
··· 16 16 compatible = "snps,axs103"; 17 17 18 18 chosen { 19 - bootargs = "earlycon=uart8250,mmio32,0xe0022000,115200n8 console=tty0 console=ttyS3,115200n8 consoleblank=0"; 19 + bootargs = "earlycon=uart8250,mmio32,0xe0022000,115200n8 console=tty0 console=ttyS3,115200n8 consoleblank=0 video=640x480-24"; 20 20 }; 21 21 };
+2 -1
arch/arc/configs/nsimosci_defconfig
··· 58 58 CONFIG_SERIAL_OF_PLATFORM=y 59 59 # CONFIG_HW_RANDOM is not set 60 60 # CONFIG_HWMON is not set 61 - CONFIG_FB=y 61 + CONFIG_DRM=y 62 + CONFIG_DRM_ARCPGU=y 62 63 CONFIG_FRAMEBUFFER_CONSOLE=y 63 64 CONFIG_LOGO=y 64 65 # CONFIG_HID is not set
+2 -1
arch/arc/configs/nsimosci_hs_defconfig
··· 57 57 CONFIG_SERIAL_OF_PLATFORM=y 58 58 # CONFIG_HW_RANDOM is not set 59 59 # CONFIG_HWMON is not set 60 - CONFIG_FB=y 60 + CONFIG_DRM=y 61 + CONFIG_DRM_ARCPGU=y 61 62 CONFIG_FRAMEBUFFER_CONSOLE=y 62 63 CONFIG_LOGO=y 63 64 # CONFIG_HID is not set
+2 -1
arch/arc/configs/nsimosci_hs_smp_defconfig
··· 70 70 CONFIG_SERIAL_OF_PLATFORM=y 71 71 # CONFIG_HW_RANDOM is not set 72 72 # CONFIG_HWMON is not set 73 - CONFIG_FB=y 73 + CONFIG_DRM=y 74 + CONFIG_DRM_ARCPGU=y 74 75 CONFIG_FRAMEBUFFER_CONSOLE=y 75 76 CONFIG_LOGO=y 76 77 # CONFIG_HID is not set
+2 -5
arch/arc/configs/vdk_hs38_smp_defconfig
··· 63 63 CONFIG_SERIAL_OF_PLATFORM=y 64 64 # CONFIG_HW_RANDOM is not set 65 65 # CONFIG_HWMON is not set 66 - CONFIG_FB=y 67 - CONFIG_ARCPGU_RGB888=y 68 - CONFIG_ARCPGU_DISPTYPE=0 69 - # CONFIG_VGA_CONSOLE is not set 66 + CONFIG_DRM=y 67 + CONFIG_DRM_ARCPGU=y 70 68 CONFIG_FRAMEBUFFER_CONSOLE=y 71 - CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y 72 69 CONFIG_LOGO=y 73 70 # CONFIG_LOGO_LINUX_MONO is not set 74 71 # CONFIG_LOGO_LINUX_VGA16 is not set
+1 -1
drivers/gpu/drm/arc/Makefile
··· 1 - arcpgu-y := arcpgu_crtc.o arcpgu_hdmi.o arcpgu_drv.o 1 + arcpgu-y := arcpgu_crtc.o arcpgu_hdmi.o arcpgu_sim.o arcpgu_drv.o 2 2 obj-$(CONFIG_DRM_ARCPGU) += arcpgu.o
+1
drivers/gpu/drm/arc/arcpgu.h
··· 43 43 44 44 int arc_pgu_setup_crtc(struct drm_device *dev); 45 45 int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np); 46 + int arcpgu_drm_sim_init(struct drm_device *drm, struct device_node *np); 46 47 struct drm_fbdev_cma *arcpgu_fbdev_cma_init(struct drm_device *dev, 47 48 unsigned int preferred_bpp, unsigned int num_crtc, 48 49 unsigned int max_conn_count);
+8 -7
drivers/gpu/drm/arc/arcpgu_drv.c
··· 149 149 150 150 /* find the encoder node and initialize it */ 151 151 encoder_node = of_parse_phandle(drm->dev->of_node, "encoder-slave", 0); 152 - if (!encoder_node) { 153 - dev_err(drm->dev, "failed to get an encoder slave node\n"); 154 - return -ENODEV; 152 + if (encoder_node) { 153 + ret = arcpgu_drm_hdmi_init(drm, encoder_node); 154 + if (ret < 0) 155 + return ret; 156 + } else { 157 + ret = arcpgu_drm_sim_init(drm, 0); 158 + if (ret < 0) 159 + return ret; 155 160 } 156 - 157 - ret = arcpgu_drm_hdmi_init(drm, encoder_node); 158 - if (ret < 0) 159 - return ret; 160 161 161 162 drm_mode_config_reset(drm); 162 163 drm_kms_helper_poll_init(drm);
+128
drivers/gpu/drm/arc/arcpgu_sim.c
··· 1 + /* 2 + * ARC PGU DRM driver. 3 + * 4 + * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com) 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License version 2 as 8 + * published by the Free Software Foundation. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + */ 16 + 17 + #include <drm/drm_crtc_helper.h> 18 + #include <drm/drm_encoder_slave.h> 19 + #include <drm/drm_atomic_helper.h> 20 + 21 + #include "arcpgu.h" 22 + 23 + #define XRES_DEF 640 24 + #define YRES_DEF 480 25 + 26 + #define XRES_MAX 8192 27 + #define YRES_MAX 8192 28 + 29 + 30 + struct arcpgu_drm_connector { 31 + struct drm_connector connector; 32 + struct drm_encoder_slave *encoder_slave; 33 + }; 34 + 35 + static int arcpgu_drm_connector_get_modes(struct drm_connector *connector) 36 + { 37 + int count; 38 + 39 + count = drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX); 40 + drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF); 41 + return count; 42 + } 43 + 44 + static enum drm_connector_status 45 + arcpgu_drm_connector_detect(struct drm_connector *connector, bool force) 46 + { 47 + return connector_status_connected; 48 + } 49 + 50 + static void arcpgu_drm_connector_destroy(struct drm_connector *connector) 51 + { 52 + drm_connector_unregister(connector); 53 + drm_connector_cleanup(connector); 54 + } 55 + 56 + static const struct drm_connector_helper_funcs 57 + arcpgu_drm_connector_helper_funcs = { 58 + .get_modes = arcpgu_drm_connector_get_modes, 59 + }; 60 + 61 + static const struct drm_connector_funcs arcpgu_drm_connector_funcs = { 62 + .dpms = drm_helper_connector_dpms, 63 + .reset = drm_atomic_helper_connector_reset, 64 + .detect = arcpgu_drm_connector_detect, 65 + .fill_modes = drm_helper_probe_single_connector_modes, 66 + .destroy = arcpgu_drm_connector_destroy, 67 + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 68 + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 69 + }; 70 + 71 + static struct drm_encoder_funcs arcpgu_drm_encoder_funcs = { 72 + .destroy = drm_encoder_cleanup, 73 + }; 74 + 75 + int arcpgu_drm_sim_init(struct drm_device *drm, struct device_node *np) 76 + { 77 + struct arcpgu_drm_connector *arcpgu_connector; 78 + struct drm_encoder_slave *encoder; 79 + struct drm_connector *connector; 80 + int ret; 81 + 82 + encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL); 83 + if (encoder == NULL) 84 + return -ENOMEM; 85 + 86 + encoder->base.possible_crtcs = 1; 87 + encoder->base.possible_clones = 0; 88 + 89 + ret = drm_encoder_init(drm, &encoder->base, &arcpgu_drm_encoder_funcs, 90 + DRM_MODE_ENCODER_VIRTUAL, NULL); 91 + if (ret) 92 + return ret; 93 + 94 + arcpgu_connector = devm_kzalloc(drm->dev, sizeof(*arcpgu_connector), 95 + GFP_KERNEL); 96 + if (!arcpgu_connector) { 97 + ret = -ENOMEM; 98 + goto error_encoder_cleanup; 99 + } 100 + 101 + connector = &arcpgu_connector->connector; 102 + drm_connector_helper_add(connector, &arcpgu_drm_connector_helper_funcs); 103 + 104 + ret = drm_connector_init(drm, connector, &arcpgu_drm_connector_funcs, 105 + DRM_MODE_CONNECTOR_VIRTUAL); 106 + if (ret < 0) { 107 + dev_err(drm->dev, "failed to initialize drm connector\n"); 108 + goto error_encoder_cleanup; 109 + } 110 + 111 + ret = drm_mode_connector_attach_encoder(connector, &encoder->base); 112 + if (ret < 0) { 113 + dev_err(drm->dev, "could not attach connector to encoder\n"); 114 + drm_connector_unregister(connector); 115 + goto error_connector_cleanup; 116 + } 117 + 118 + arcpgu_connector->encoder_slave = encoder; 119 + 120 + return 0; 121 + 122 + error_connector_cleanup: 123 + drm_connector_cleanup(connector); 124 + 125 + error_encoder_cleanup: 126 + drm_encoder_cleanup(&encoder->base); 127 + return ret; 128 + }