[PATCH xf86-video-vmware 2/2] Add support for server managed fds

Hans de Goede hdegoede at redhat.com
Wed May 14 02:18:59 PDT 2014


Hi,

Thanks for the reviews!

On 05/14/2014 11:07 AM, Jakob Bornecrantz wrote:
> On Wed, May 7, 2014 at 3:23 PM, Hans de Goede <hdegoede at redhat.com> wrote:
>> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
>> ---
>>  src/vmware_bootstrap.c |  5 +++++
>>  vmwgfx/vmwgfx_driver.c | 31 +++++++++++++++++++++++++++----
>>  vmwgfx/vmwgfx_driver.h |  2 ++
>>  3 files changed, 34 insertions(+), 4 deletions(-)
> 
> This patch has, if one thing is fixed as detailed below, my
> Reviewed-by: Jakob Bornecrantz <jakob at vmware.com>
> 
>>
>> diff --git a/src/vmware_bootstrap.c b/src/vmware_bootstrap.c
>> index b30cf2b..1635876 100644
>> --- a/src/vmware_bootstrap.c
>> +++ b/src/vmware_bootstrap.c
>> @@ -30,6 +30,7 @@
>>  #endif
>>
>>  #include "xf86.h"
>> +#include <xorgVersion.h>
>>  #include "compiler.h"
>>  #include "xf86Pci.h"           /* pci */
>>  #include "vm_device_version.h"
>> @@ -496,6 +497,10 @@ VMWareDriverFunc(ScrnInfoPtr pScrn,
>>                               pScrn->yDpi / 2) / pScrn->yDpi;
>>        }
>>        return TRUE;
>> +#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,0)
>> +   case SUPPORTS_SERVER_FDS:
>> +      return TRUE;
>> +#endif
>>     default:
>>        return FALSE;
>>     }
>> diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c
>> index 7e5dc4e..03103a8 100644
>> --- a/vmwgfx/vmwgfx_driver.c
>> +++ b/vmwgfx/vmwgfx_driver.c
>> @@ -54,6 +54,10 @@
>>
>>  #include <pciaccess.h>
>>
>> +#ifdef XSERVER_PLATFORM_BUS
>> +#include "xf86platformBus.h"
>> +#endif
>> +
>>  #include "vmwgfx_driver.h"
>>
>>  #include <saa.h>
>> @@ -243,6 +247,15 @@ static const xf86CrtcConfigFuncsRec crtc_config_funcs = {
>>      .resize = drv_crtc_resize
>>  };
>>
>> +static Bool vmwgfx_use_server_fd(modesettingPtr ms)
>> +{
>> +#ifdef XF86_PDEV_SERVER_FD
>> +    return ms->platform_dev && (ms->platform_dev->flags & XF86_PDEV_SERVER_FD);
>> +#else
>> +    return FALSE;
>> +#endif
>> +}
>> +
>>  static Bool
>>  drv_init_drm(ScrnInfoPtr pScrn)
>>  {
>> @@ -253,6 +266,12 @@ drv_init_drm(ScrnInfoPtr pScrn)
>>
>>         ms->fd = vmwgfx_hosted_drm_fd(ms->hdriver, ms->hosted, ms->PciInfo);
>>
>> +#ifdef ODEV_ATTRIB_FD
>> +       if (ms->fd < 0 && vmwgfx_use_server_fd(ms))
>> +           ms->fd = xf86_get_platform_device_int_attrib(ms->platform_dev,
>> +                                                        ODEV_ATTRIB_FD, -1);
> 
> If this fails you probably want to error, since the rest of the DRM set/drop
> master code also looks at vmwgfx_use_server_fd. Then again I don't know
> if other drivers does it like this, and will try all methods when the platform
> bus is used.

The other drivers are like this since the server guarantees that the call
will succeed if vmwgfx_use_server_fd(ms) succeeds that ODEV_ATTRIB_FD will
be set and won't be -1.

But if you want I can easily add error handling by adding an "else" above
the #endif, then the normal open will only get skipped if vmwgfx_use_server_fd(ms)
is true, and the error handling path below the normal open path will trigger
if xf86_get_platform_device_int_attrib somehow failed.

Let me know how you want to proceed with this and then I'll add the "else"
(or not), your Reviewed-by and push these.

Regards,

Hans


> 
>> +#endif
>> +
>>         if (ms->fd < 0) {
>>
>>             char bus_id[64];
>> @@ -472,6 +491,9 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
>>         goto out_err_bus;
>>      }
>>
>> +    if (pEnt->location.type == BUS_PLATFORM)
>> +        ms->platform_dev = pEnt->location.id.plat;
>> +
>>      xf86SetPrimInitDone(pScrn->entityList[0]);
>>
>>      ms->hdriver = vmwgfx_hosted_detect();
>> @@ -605,7 +627,7 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
>>      free(ms->Options);
>>    out_depth:
>>    out_drm_version:
>> -    if (!vmwgfx_is_hosted(ms->hdriver))
>> +    if (!vmwgfx_is_hosted(ms->hdriver) && !vmwgfx_use_server_fd(ms))
>>         close(ms->fd);
>>    out_no_drm:
>>      vmwgfx_hosted_destroy(ms->hdriver, ms->hosted);
>> @@ -783,8 +805,8 @@ drv_set_master(ScrnInfoPtr pScrn)
>>  {
>>      modesettingPtr ms = modesettingPTR(pScrn);
>>
>> -    if (!vmwgfx_is_hosted(ms->hdriver) && !ms->isMaster &&
>> -       drmSetMaster(ms->fd) != 0) {
>> +    if (!vmwgfx_is_hosted(ms->hdriver) && !vmwgfx_use_server_fd(ms) &&
>> +            !ms->isMaster && drmSetMaster(ms->fd) != 0) {
>>         if (errno == EINVAL) {
>>             xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
>>                        "drmSetMaster failed: 2.6.29 or newer kernel required for "
>> @@ -1184,7 +1206,8 @@ drv_leave_vt(VT_FUNC_ARGS_DECL)
>>
>>      vmwgfx_saa_drop_master(pScrn->pScreen);
>>
>> -    if (!vmwgfx_is_hosted(ms->hdriver) && drmDropMaster(ms->fd))
>> +    if (!vmwgfx_is_hosted(ms->hdriver) && !vmwgfx_use_server_fd(ms) &&
>> +            drmDropMaster(ms->fd))
>>         xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
>>                    "drmDropMaster failed: %s\n", strerror(errno));
>>      ms->isMaster = FALSE;
>> diff --git a/vmwgfx/vmwgfx_driver.h b/vmwgfx/vmwgfx_driver.h
>> index c044a81..31dfc0f 100644
>> --- a/vmwgfx/vmwgfx_driver.h
>> +++ b/vmwgfx/vmwgfx_driver.h
>> @@ -83,6 +83,7 @@ enum xorg_throttling_reason {
>>  };
>>
>>  struct vmwgfx_hosted;
>> +struct xf86_platform_device;
>>
>>  typedef struct _modesettingRec
>>  {
>> @@ -98,6 +99,7 @@ typedef struct _modesettingRec
>>      int Chipset;
>>      EntityInfoPtr pEnt;
>>      struct pci_device *PciInfo;
>> +    struct xf86_platform_device *platform_dev;
>>
>>      /* Accel */
>>      Bool accelerate_render;
>> --
>> 1.9.0
>>
>> _______________________________________________
>> xorg-devel at lists.x.org: X.Org development
>> Archives: http://lists.x.org/archives/xorg-devel
>> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list