mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-03-30 07:10:36 +02:00
Before this patch, X server detects/sets the primary device by: 1. The "PrimaryGPU" option in extra X configuration 2. pci_device_is_boot_vga() for PCI devices 3. Set the first (0 index) device as the primary device, if it is not found yet. However, the other display controllers like Amlogic's meson cannot be detected as the primary device by pci_device_is_boot_vga(). Thus, it has to set the extra X configuration for the "PrimaryGPU" option. Otherwise, X server will set the first (0 index) device as the primary device. But it may not be the correct one, because it has no output. For example, Amlogic puts the GPU and display controller as different devices: (II) xfree86: Adding drm device (/dev/dri/card0) (II) Platform probe for /sys/devices/platform/soc/d0000000.apb/d00c0000.gpu/drm/card0 (II) xfree86: Adding drm device (/dev/dri/card1) (II) Platform probe for /sys/devices/platform/soc/d0100000.vpu/drm/card1 This patch introduces a new member num_connectors into OdevAttributes to hold the number of display connectors for each DRM device. It gets the number of the device's connectors by detecting the output connecters of devices in platform dev driver, that refers to the check_outputs() function in modesetting driver. Then, adds a new way to set the primary device by checking the number of display connectors for drm devices, before use the first platform device as a fallback. Buglink: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1023 Signed-off-by: Jian-Hong Pan <jian-hong@endlessm.com>
86 lines
2.8 KiB
C
86 lines
2.8 KiB
C
/*
|
|
* Copyright © 2006-2007 Daniel Stone
|
|
*
|
|
* 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 (including the next
|
|
* paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
|
|
*
|
|
* Author: Daniel Stone <daniel@fooishbar.org>
|
|
*/
|
|
|
|
#ifndef HOTPLUG_H
|
|
#define HOTPLUG_H
|
|
|
|
#include "list.h"
|
|
|
|
extern _X_EXPORT void config_pre_init(void);
|
|
extern _X_EXPORT void config_init(void);
|
|
extern _X_EXPORT void config_fini(void);
|
|
|
|
/* Bump this each time you add something to the struct
|
|
* so that drivers can easily tell what is available
|
|
*/
|
|
#define ODEV_ATTRIBUTES_VERSION 2
|
|
|
|
struct OdevAttributes {
|
|
/* path to kernel device node - Linux e.g. /dev/dri/card0 */
|
|
char *path;
|
|
|
|
/* system device path - Linux e.g. /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 */
|
|
char *syspath;
|
|
|
|
/* DRI-style bus id */
|
|
char *busid;
|
|
|
|
/* Server managed FD */
|
|
int fd;
|
|
|
|
/* Major number of the device node pointed to by ODEV_ATTRIB_PATH */
|
|
int major;
|
|
|
|
/* Minor number of the device node pointed to by ODEV_ATTRIB_PATH */
|
|
int minor;
|
|
|
|
/* kernel driver name */
|
|
char *driver;
|
|
|
|
/* Amount of display connectors */
|
|
int num_connectors;
|
|
};
|
|
|
|
/* Note starting with xserver 1.16 this function never fails */
|
|
struct OdevAttributes *
|
|
config_odev_allocate_attributes(void);
|
|
|
|
void
|
|
config_odev_free_attributes(struct OdevAttributes *attribs);
|
|
|
|
typedef void (*config_odev_probe_proc_ptr)(struct OdevAttributes *attribs);
|
|
void config_odev_probe(config_odev_probe_proc_ptr probe_callback);
|
|
|
|
#ifdef CONFIG_UDEV_KMS
|
|
void NewGPUDeviceRequest(struct OdevAttributes *attribs);
|
|
void DeleteGPUDeviceRequest(struct OdevAttributes *attribs);
|
|
#endif
|
|
|
|
#define ServerIsNotSeat0() (SeatId && strcmp(SeatId, "seat0"))
|
|
|
|
struct xf86_platform_device *
|
|
xf86_find_platform_device_by_devnum(int major, int minor);
|
|
|
|
#endif /* HOTPLUG_H */
|