<div>Hi Joe,</div><div>   The ikvm works now, thanks very much.</div><div>One issue, the right button of mouse operation has no response on bmc  ikvm website page.</div><div><div>Best,</div><div>xiuzhi</div><div><br></div><div style="font-size: 12px;font-family: Arial Narrow;padding:2px 0 2px 0;">------------------ Original ------------------</div><div style="font-size: 12px;background:#efefef;padding:8px;"><div><b>From: </b> "jae.hyun.yoo";<jae.hyun.yoo@linux.intel.com>;</div><div><b>Send time:</b> Tuesday, Mar 19, 2019 1:33 AM</div><div><b>To:</b> "Lei YU"<mine260309@gmail.com>; <wbr></div><div><b>Cc:</b> "xiuzhi"<1450335857@qq.com>; "openbmc"<openbmc@lists.ozlabs.org>; "ed"<ed@tanous.net>; "Eddie James"<eajames@linux.vnet.ibm.com>; <wbr></div><div><b>Subject: </b> Re: Does obmc-ikvm work with bmcweb?</div></div><div><br></div>Attaching a patch file for back porting of Eddie's aspeed-video driver.<br>Diff in below doesn't include the newly created file so I'm attaching it<br>as a patch.<br><br>-Jae<br><br>On 3/18/2019 10:21 AM, Jae Hyun Yoo wrote:<br>> On 3/17/2019 7:25 PM, Lei YU wrote:<br>>>> openbmc: ae29d00f227e55192a69f66c87633e1b53fc6e68<br>>>><br>>>> I'm using a custom build config for my machine. As you already know, for<br>>>> enabling the KVM feature, customization on kernel configs, adding a<br>>>> 'start-ipkvm' service, adding of libvncserver package and back-porting<br>>>> of aspeed video driver are also needed so there is no one-shot buildable<br>>>> TEMPLATECONF for KVM test.<br>>><br>>> Could you kindly put everything together on a branch so others could <br>>> refer the<br>>> branch to know what the changes are for KVM to work?<br>>> Thanks a lot!<br>>><br>> <br>> Well, I've already shared SHAs that are relating to KVM in this email<br>> thread, I'm sharing it again with some more details.<br>> <br>> openbmc: ae29d00f227e55192a69f66c87633e1b53fc6e68<br>> <br>> bmcweb: 9474b3788017bddd70e493e2b9b7674be30abc87<br>> <br>> phosphor-webui: 511a2bbc5540fccb883b8d0005c2b387a23c9d05<br>>                  Cherry picked <br>> https://gerrit.openbmc-project.xyz/#/c/openbmc/phosphor-webui/+/10268/<br>> <br>> libvncserver: 3348a7e42e86dfb98dd7458ad29def476cf6096f<br>> Need to remove 'x11' and 'gtk+' to reduce package size so I made:<br>> libvncserver_%.bbappend<br>> ----------------------------------------------------------------<br>> PACKAGECONFIG_remove = "gcrypt gnutls png sdl zlib"<br>> <br>> TARGET_CXXFLAGS += " -Dflto"<br>> <br>> do_install_append() {<br>>      rm -rf ${D}${libdir}/libvncclient*<br>> }<br>> <br>> inherit cmake<br>> <br>> # Use the latest to support obmc-ikvm<br>> DEPENDS += "openssl"<br>> SRC_URI = "git://github.com/LibVNC/libvncserver"<br>> SRCREV = "3348a7e42e86dfb98dd7458ad29def476cf6096f"<br>> S = "${WORKDIR}/git"<br>> <br>> # Remove x11 and gtk+ that cause big image size<br>> # Actually, these aren't needed to support obmc-ikvm<br>> REQUIRED_DISTRO_FEATURES_remove = "x11"<br>> DEPENDS_remove = "gtk+"<br>> RDEPENDS_${PN}_remove = "gtk+"<br>> ----------------------------------------------------------------<br>> <br>> start-ipkvm: Cherry pick <br>> https://gerrit.openbmc-project.xyz/#/c/openbmc/meta-phosphor/+/13536/<br>> After cherry picking it, I changed start-ipkvm.service file like below:<br>> start-ipkvm.service<br>> ----------------------------------------------------------------<br>> [Unit]<br>> Description=OpenBMC ipKVM daemon<br>> StopWhenUnneeded=false<br>> <br>> [Service]<br>> Restart=always<br>> ExecStartPre=/usr/bin/create_usbhid.sh<br>> ExecStart=/usr/bin/env obmc-ikvm -v /dev/video0 -f 10 -k /dev/hidg0 -p <br>> /dev/hidg1<br>> <br>> [Install]<br>> WantedBy=multi-user.target<br>> -----------------------------------------------------------------<br>> <br>> obmc-ikvm: 2bc661d34abd1fda92a9d2b256ed88ca0e90d09a<br>> <br>> linux-aspeed: 7859d04be772a1d185de335a8e9d38ac03a89f3f<br>> Added these kernel configs:<br>> -----------------------------------------------------------------<br>> CONFIG_FRAME_VECTOR=y<br>> CONFIG_MEDIA_SUPPORT=y<br>> CONFIG_MEDIA_CAMERA_SUPPORT=y<br>> CONFIG_VIDEO_DEV=y<br>> CONFIG_VIDEO_V4L2=y<br>> CONFIG_V4L_PLATFORM_DRIVERS=y<br>> CONFIG_VIDEO_ASPEED=y<br>> CONFIG_VIDEOBUF2_CORE=y<br>> CONFIG_VIDEOBUF2_V4L2=y<br>> CONFIG_VIDEOBUF2_MEMOPS=y<br>> CONFIG_VIDEOBUF2_DMA_CONTIG=y<br>> CONFIG_MEDIA_SUBDRV_AUTOSELECT=y<br>> CONFIG_USB_GADGET_VBUS_DRAW=2<br>> CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2<br>> CONFIG_USB_LIBCOMPOSITE=y<br>> CONFIG_USB_F_HID=y<br>> CONFIG_USB_GADGET=y<br>> CONFIG_U_SERIAL_CONSOLE=y<br>> CONFIG_USB_ASPEED_VHUB=y<br>> CONFIG_USB_CONFIGFS=y<br>> CONFIG_USB_CONFIGFS_MASS_STORAGE=y<br>> CONFIG_USB_CONFIGFS_F_FS=y<br>> CONFIG_USB_CONFIGFS_F_HID=y<br>> -------------------------------------------------------------------<br>> Back ported Eddie's aspeed-video driver<br>> <br>> diff --git a/MAINTAINERS b/MAINTAINERS<br>> index b98a5763f6c1..cdd8f824b6da 100644<br>> --- a/MAINTAINERS<br>> +++ b/MAINTAINERS<br>> @@ -2358,6 +2358,14 @@ S:    Maintained<br>>   F:    Documentation/hwmon/asc7621<br>>   F:    drivers/hwmon/asc7621.c<br>> <br>> +ASPEED VIDEO ENGINE DRIVER<br>> +M:    Eddie James <eajames@linux.ibm.com><br>> +L:    linux-media@vger.kernel.org<br>> +L:    openbmc@lists.ozlabs.org (moderated for non-subscribers)<br>> +S:    Maintained<br>> +F:    drivers/media/platform/aspeed-video.c<br>> +F:    Documentation/devicetree/bindings/media/aspeed-video.txt<br>> +<br>>   ASUS NOTEBOOKS AND EEEPC ACPI/WMI EXTRAS DRIVERS<br>>   M:    Corentin Chary <corentin.chary@gmail.com><br>>   L:    acpi4asus-user@lists.sourceforge.net<br>> diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi <br>> b/arch/arm/boot/dts/aspeed-g5.dtsi<br>> index d8a9d20cc4e0..d6da0a29ced3 100644<br>> --- a/arch/arm/boot/dts/aspeed-g5.dtsi<br>> +++ b/arch/arm/boot/dts/aspeed-g5.dtsi<br>> @@ -243,6 +243,17 @@<br>>                   interrupts = <0x19>;<br>>               };<br>> <br>> +            video: video@1e700000 {<br>> +                compatible = "aspeed,ast2500-video-engine";<br>> +                reg = <0x1e700000 0x20000>;<br>> +                clocks = <&syscon ASPEED_CLK_GATE_VCLK>,<br>> +                     <&syscon ASPEED_CLK_GATE_ECLK>;<br>> +                clock-names = "vclk", "eclk";<br>> +                resets = <&syscon ASPEED_RESET_VIDEO>;<br>> +                interrupts = <7>;<br>> +                status = "disabled";<br>> +            };<br>> +<br>>               adc: adc@1e6e9000 {<br>>                   compatible = "aspeed,ast2500-adc";<br>>                   reg = <0x1e6e9000 0xb0>;<br>> diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c<br>> index 596136793fc4..f16ce7dbd6ab 100644<br>> --- a/drivers/clk/clk-aspeed.c<br>> +++ b/drivers/clk/clk-aspeed.c<br>> @@ -87,7 +87,7 @@ struct aspeed_clk_gate {<br>>   /* TODO: ask Aspeed about the actual parent data */<br>>   static const struct aspeed_gate_data aspeed_gates[] = {<br>>       /*                 clk rst   name            parent    flags */<br>> -    [ASPEED_CLK_GATE_ECLK] =    {  0, -1, "eclk-gate",        <br>> "eclk",    0 }, /* Video Engine */<br>> +    [ASPEED_CLK_GATE_ECLK] =    {  0,  6, "eclk-gate",        <br>> "eclk",    0 }, /* Video Engine */<br>>       [ASPEED_CLK_GATE_GCLK] =    {  1,  7, "gclk-gate",        NULL,    <br>> 0 }, /* 2D engine */<br>>       [ASPEED_CLK_GATE_MCLK] =    {  2, -1, "mclk-gate",        "mpll", <br>> CLK_IS_CRITICAL }, /* SDRAM */<br>>       [ASPEED_CLK_GATE_VCLK] =    {  3,  6, "vclk-gate",        NULL,    <br>> 0 }, /* Video Capture */<br>> @@ -113,6 +113,24 @@ static const struct aspeed_gate_data aspeed_gates[] <br>> = {<br>>       [ASPEED_CLK_GATE_LHCCLK] =    { 28, -1, "lhclk-gate",        <br>> "lhclk", 0 }, /* LPC master/LPC+ */<br>>   };<br>> <br>> +static const char * const eclk_parent_names[] = {<br>> +    "mpll",<br>> +    "hpll",<br>> +    "dpll",<br>> +};<br>> +<br>> +static const struct clk_div_table ast2500_eclk_div_table[] = {<br>> +    { 0x0, 2 },<br>> +    { 0x1, 2 },<br>> +    { 0x2, 3 },<br>> +    { 0x3, 4 },<br>> +    { 0x4, 5 },<br>> +    { 0x5, 6 },<br>> +    { 0x6, 7 },<br>> +    { 0x7, 8 },<br>> +    { 0 }<br>> +};<br>> +<br>>   static const struct clk_div_table ast2500_mac_div_table[] = {<br>>       { 0x0, 4 }, /* Yep, really. Aspeed confirmed this is correct */<br>>       { 0x1, 4 },<br>> @@ -192,18 +210,21 @@ static struct clk_hw <br>> *aspeed_ast2500_calc_pll(const char *name, u32 val)<br>> <br>>   struct aspeed_clk_soc_data {<br>>       const struct clk_div_table *div_table;<br>> +    const struct clk_div_table *eclk_div_table;<br>>       const struct clk_div_table *mac_div_table;<br>>       struct clk_hw *(*calc_pll)(const char *name, u32 val);<br>>   };<br>> <br>>   static const struct aspeed_clk_soc_data ast2500_data = {<br>>       .div_table = ast2500_div_table,<br>> +    .eclk_div_table = ast2500_eclk_div_table,<br>>       .mac_div_table = ast2500_mac_div_table,<br>>       .calc_pll = aspeed_ast2500_calc_pll,<br>>   };<br>> <br>>   static const struct aspeed_clk_soc_data ast2400_data = {<br>>       .div_table = ast2400_div_table,<br>> +    .eclk_div_table = ast2400_div_table,<br>>       .mac_div_table = ast2400_div_table,<br>>       .calc_pll = aspeed_ast2400_calc_pll,<br>>   };<br>> @@ -317,6 +338,7 @@ static const u8 aspeed_resets[] = {<br>>       [ASPEED_RESET_PECI]    = 10,<br>>       [ASPEED_RESET_I2C]    =  2,<br>>       [ASPEED_RESET_AHB]    =  1,<br>> +    [ASPEED_RESET_VIDEO]    =  6,<br>> <br>>       /*<br>>        * SCUD4 resets start at an offset to separate them from<br>> @@ -522,6 +544,22 @@ static int aspeed_clk_probe(struct platform_device <br>> *pdev)<br>>           return PTR_ERR(hw);<br>>       aspeed_clk_data->hws[ASPEED_CLK_24M] = hw;<br>> <br>> +    hw = clk_hw_register_mux(dev, "eclk-mux", eclk_parent_names,<br>> +                 ARRAY_SIZE(eclk_parent_names), 0,<br>> +                 scu_base + ASPEED_CLK_SELECTION, 2, 0x3, 0,<br>> +                 &aspeed_clk_lock);<br>> +    if (IS_ERR(hw))<br>> +        return PTR_ERR(hw);<br>> +    aspeed_clk_data->hws[ASPEED_CLK_ECLK_MUX] = hw;<br>> +<br>> +    hw = clk_hw_register_divider_table(dev, "eclk", "eclk-mux", 0,<br>> +                       scu_base + ASPEED_CLK_SELECTION, 28,<br>> +                       3, 0, soc_data->eclk_div_table,<br>> +                       &aspeed_clk_lock);<br>> +    if (IS_ERR(hw))<br>> +        return PTR_ERR(hw);<br>> +    aspeed_clk_data->hws[ASPEED_CLK_ECLK] = hw;<br>> +<br>>       /*<br>>        * TODO: There are a number of clocks that not included in this <br>> driver<br>>        * as more information is required:<br>> @@ -531,7 +569,6 @@ static int aspeed_clk_probe(struct platform_device <br>> *pdev)<br>>        *   RGMII<br>>        *   RMII<br>>        *   UART[1..5] clock source mux<br>> -     *   Video Engine (ECLK) mux and clock divider<br>>        */<br>> <br>>       for (i = 0; i < ARRAY_SIZE(aspeed_gates); i++) {<br>> diff --git a/drivers/media/platform/Kconfig <br>> b/drivers/media/platform/Kconfig<br>> index 54fe90acb5b2..d6edf2d28f9b 100644<br>> --- a/drivers/media/platform/Kconfig<br>> +++ b/drivers/media/platform/Kconfig<br>> @@ -32,6 +32,15 @@ source "drivers/media/platform/davinci/Kconfig"<br>> <br>>   source "drivers/media/platform/omap/Kconfig"<br>> <br>> +config VIDEO_ASPEED<br>> +    tristate "Aspeed AST2400 and AST2500 Video Engine driver"<br>> +    depends on VIDEO_V4L2<br>> +    select VIDEOBUF2_DMA_CONTIG<br>> +    help<br>> +      Support for the Aspeed Video Engine (VE) embedded in the Aspeed<br>> +      AST2400 and AST2500 SOCs. The VE can capture and compress video data<br>> +      from digital or analog sources.<br>> +<br>>   config VIDEO_SH_VOU<br>>       tristate "SuperH VOU video output driver"<br>>       depends on MEDIA_CAMERA_SUPPORT<br>> diff --git a/drivers/media/platform/Makefile <br>> b/drivers/media/platform/Makefile<br>> index 41322ab65802..205c33a004fc 100644<br>> --- a/drivers/media/platform/Makefile<br>> +++ b/drivers/media/platform/Makefile<br>> @@ -3,6 +3,7 @@<br>>   # Makefile for the video capture/playback device drivers.<br>>   #<br>> <br>> +obj-$(CONFIG_VIDEO_ASPEED)        += aspeed-video.o<br>>   obj-$(CONFIG_VIDEO_CADENCE)        += cadence/<br>>   obj-$(CONFIG_VIDEO_VIA_CAMERA) += via-camera.o<br>>   obj-$(CONFIG_VIDEO_CAFE_CCIC) += marvell-ccic/<br>> diff --git a/include/dt-bindings/clock/aspeed-clock.h <br>> b/include/dt-bindings/clock/aspeed-clock.h<br>> index f43738607d77..15a9059d0303 100644<br>> --- a/include/dt-bindings/clock/aspeed-clock.h<br>> +++ b/include/dt-bindings/clock/aspeed-clock.h<br>> @@ -50,5 +50,6 @@<br>>   #define ASPEED_RESET_I2C        7<br>>   #define ASPEED_RESET_AHB        8<br>>   #define ASPEED_RESET_CRT1        9<br>> +#define ASPEED_RESET_VIDEO        10<br>> <br>>   #endif<br>> ------------------------------------------------------------------<br>> <br>> These are all I did for testing KVM.<br>> <br>> Cheers,<br>> Jae<br><br></div>