mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-16 02:14:58 +00:00
Merge tag 'drm-misc-next-2024-09-26' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next
drm-misc-next for v6.13: UAPI Changes: - panthor: Add realtime group priority and priority query. Cross-subsystem Changes: - Add Vivek Kasireddy as udmabuf maintainer. - Assorted udmabuf changes. - Device tree binding updates. - dmabuf documentation fixes. - Move drm_rect to drm core module from kms helper. Core Changes: - Update scheduler documentation and concurrency fixes. - drm/ci updates. - Add memory-agnostic fbdev client and client-agnostic setup helper. - Huge driver conversion for using the above. Driver Changes: - Assorted fixes to imx, panel/nt35510, sti, accel/ivpu, v3d, vkms, host1x. - Add panel quirks for AYA NEO panels. - Make module autoloading work for bridge/it6505 and mcde. - Add huge page support to v3d using a custom shmfs. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/a9b95e6f-9f35-464e-83f6-bda75b35ee0b@linux.intel.com
This commit is contained in:
commit
54bc1d3255
@ -7460,8 +7460,8 @@ T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: drivers/gpu/drm/udl/
|
||||
|
||||
DRM DRIVER FOR VIRTUAL KERNEL MODESETTING (VKMS)
|
||||
M: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
|
||||
M: Maíra Canal <mairacanal@riseup.net>
|
||||
M: Louis Chauvet <louis.chauvet@bootlin.com>
|
||||
R: Haneen Mohammed <hamohammed.sa@gmail.com>
|
||||
R: Simona Vetter <simona@ffwll.ch>
|
||||
R: Melissa Wen <melissa.srw@gmail.com>
|
||||
@ -24205,6 +24205,7 @@ F: lib/iov_iter.c
|
||||
|
||||
USERSPACE DMA BUFFER DRIVER
|
||||
M: Gerd Hoffmann <kraxel@redhat.com>
|
||||
M: Vivek Kasireddy <vivek.kasireddy@intel.com>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
/*
|
||||
* =========== FW API version information beginning ================
|
||||
* The bellow values will be used to construct the version info this way:
|
||||
* The below values will be used to construct the version info this way:
|
||||
* fw_bin_header->api_version[VPU_BOOT_API_VER_ID] = (VPU_BOOT_API_VER_MAJOR << 16) |
|
||||
* VPU_BOOT_API_VER_MINOR;
|
||||
* VPU_BOOT_API_VER_PATCH will be ignored. KMD and compatibility is not affected if this changes
|
||||
|
@ -36,6 +36,7 @@ config UDMABUF
|
||||
depends on DMA_SHARED_BUFFER
|
||||
depends on MEMFD_CREATE || COMPILE_TEST
|
||||
depends on MMU
|
||||
select VMAP_PFN
|
||||
help
|
||||
A driver to let userspace turn memfd regions into dma-bufs.
|
||||
Qemu can use this to create host dmabufs for guest framebuffers.
|
||||
|
@ -1296,10 +1296,12 @@ EXPORT_SYMBOL_NS_GPL(dma_buf_move_notify, DMA_BUF);
|
||||
* vmap interface is introduced. Note that on very old 32-bit architectures
|
||||
* vmalloc space might be limited and result in vmap calls failing.
|
||||
*
|
||||
* Interfaces::
|
||||
* Interfaces:
|
||||
*
|
||||
* void \*dma_buf_vmap(struct dma_buf \*dmabuf, struct iosys_map \*map)
|
||||
* void dma_buf_vunmap(struct dma_buf \*dmabuf, struct iosys_map \*map)
|
||||
* .. code-block:: c
|
||||
*
|
||||
* void *dma_buf_vmap(struct dma_buf *dmabuf, struct iosys_map *map)
|
||||
* void dma_buf_vunmap(struct dma_buf *dmabuf, struct iosys_map *map)
|
||||
*
|
||||
* The vmap call can fail if there is no vmap support in the exporter, or if
|
||||
* it runs out of vmalloc space. Note that the dma-buf layer keeps a reference
|
||||
@ -1356,10 +1358,11 @@ EXPORT_SYMBOL_NS_GPL(dma_buf_move_notify, DMA_BUF);
|
||||
* enough, since adding interfaces to intercept pagefaults and allow pte
|
||||
* shootdowns would increase the complexity quite a bit.
|
||||
*
|
||||
* Interface::
|
||||
* Interface:
|
||||
*
|
||||
* int dma_buf_mmap(struct dma_buf \*, struct vm_area_struct \*,
|
||||
* unsigned long);
|
||||
* .. code-block:: c
|
||||
*
|
||||
* int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *, unsigned long);
|
||||
*
|
||||
* If the importing subsystem simply provides a special-purpose mmap call to
|
||||
* set up a mapping in userspace, calling do_mmap with &dma_buf.file will
|
||||
|
@ -27,15 +27,21 @@ MODULE_PARM_DESC(size_limit_mb, "Max size of a dmabuf, in megabytes. Default is
|
||||
struct udmabuf {
|
||||
pgoff_t pagecount;
|
||||
struct folio **folios;
|
||||
|
||||
/**
|
||||
* Unlike folios, pinned_folios is only used for unpin.
|
||||
* So, nr_pinned is not the same to pagecount, the pinned_folios
|
||||
* only set each folio which already pinned when udmabuf_create.
|
||||
* Note that, since a folio may be pinned multiple times, each folio
|
||||
* can be added to pinned_folios multiple times, depending on how many
|
||||
* times the folio has been pinned when create.
|
||||
*/
|
||||
pgoff_t nr_pinned;
|
||||
struct folio **pinned_folios;
|
||||
|
||||
struct sg_table *sg;
|
||||
struct miscdevice *device;
|
||||
pgoff_t *offsets;
|
||||
struct list_head unpin_list;
|
||||
};
|
||||
|
||||
struct udmabuf_folio {
|
||||
struct folio *folio;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
static vm_fault_t udmabuf_vm_fault(struct vm_fault *vmf)
|
||||
@ -43,7 +49,8 @@ static vm_fault_t udmabuf_vm_fault(struct vm_fault *vmf)
|
||||
struct vm_area_struct *vma = vmf->vma;
|
||||
struct udmabuf *ubuf = vma->vm_private_data;
|
||||
pgoff_t pgoff = vmf->pgoff;
|
||||
unsigned long pfn;
|
||||
unsigned long addr, pfn;
|
||||
vm_fault_t ret;
|
||||
|
||||
if (pgoff >= ubuf->pagecount)
|
||||
return VM_FAULT_SIGBUS;
|
||||
@ -51,7 +58,35 @@ static vm_fault_t udmabuf_vm_fault(struct vm_fault *vmf)
|
||||
pfn = folio_pfn(ubuf->folios[pgoff]);
|
||||
pfn += ubuf->offsets[pgoff] >> PAGE_SHIFT;
|
||||
|
||||
return vmf_insert_pfn(vma, vmf->address, pfn);
|
||||
ret = vmf_insert_pfn(vma, vmf->address, pfn);
|
||||
if (ret & VM_FAULT_ERROR)
|
||||
return ret;
|
||||
|
||||
/* pre fault */
|
||||
pgoff = vma->vm_pgoff;
|
||||
addr = vma->vm_start;
|
||||
|
||||
for (; addr < vma->vm_end; pgoff++, addr += PAGE_SIZE) {
|
||||
if (addr == vmf->address)
|
||||
continue;
|
||||
|
||||
if (WARN_ON(pgoff >= ubuf->pagecount))
|
||||
break;
|
||||
|
||||
pfn = folio_pfn(ubuf->folios[pgoff]);
|
||||
pfn += ubuf->offsets[pgoff] >> PAGE_SHIFT;
|
||||
|
||||
/**
|
||||
* If the below vmf_insert_pfn() fails, we do not return an
|
||||
* error here during this pre-fault step. However, an error
|
||||
* will be returned if the failure occurs when the addr is
|
||||
* truly accessed.
|
||||
*/
|
||||
if (vmf_insert_pfn(vma, addr, pfn) & VM_FAULT_ERROR)
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct vm_operations_struct udmabuf_vm_ops = {
|
||||
@ -74,21 +109,29 @@ static int mmap_udmabuf(struct dma_buf *buf, struct vm_area_struct *vma)
|
||||
static int vmap_udmabuf(struct dma_buf *buf, struct iosys_map *map)
|
||||
{
|
||||
struct udmabuf *ubuf = buf->priv;
|
||||
struct page **pages;
|
||||
unsigned long *pfns;
|
||||
void *vaddr;
|
||||
pgoff_t pg;
|
||||
|
||||
dma_resv_assert_held(buf->resv);
|
||||
|
||||
pages = kmalloc_array(ubuf->pagecount, sizeof(*pages), GFP_KERNEL);
|
||||
if (!pages)
|
||||
/**
|
||||
* HVO may free tail pages, so just use pfn to map each folio
|
||||
* into vmalloc area.
|
||||
*/
|
||||
pfns = kvmalloc_array(ubuf->pagecount, sizeof(*pfns), GFP_KERNEL);
|
||||
if (!pfns)
|
||||
return -ENOMEM;
|
||||
|
||||
for (pg = 0; pg < ubuf->pagecount; pg++)
|
||||
pages[pg] = &ubuf->folios[pg]->page;
|
||||
for (pg = 0; pg < ubuf->pagecount; pg++) {
|
||||
unsigned long pfn = folio_pfn(ubuf->folios[pg]);
|
||||
|
||||
vaddr = vm_map_ram(pages, ubuf->pagecount, -1);
|
||||
kfree(pages);
|
||||
pfn += ubuf->offsets[pg] >> PAGE_SHIFT;
|
||||
pfns[pg] = pfn;
|
||||
}
|
||||
|
||||
vaddr = vmap_pfn(pfns, ubuf->pagecount, PAGE_KERNEL);
|
||||
kvfree(pfns);
|
||||
if (!vaddr)
|
||||
return -EINVAL;
|
||||
|
||||
@ -159,34 +202,42 @@ static void unmap_udmabuf(struct dma_buf_attachment *at,
|
||||
return put_sg_table(at->dev, sg, direction);
|
||||
}
|
||||
|
||||
static void unpin_all_folios(struct list_head *unpin_list)
|
||||
static void unpin_all_folios(struct udmabuf *ubuf)
|
||||
{
|
||||
struct udmabuf_folio *ubuf_folio;
|
||||
pgoff_t i;
|
||||
|
||||
while (!list_empty(unpin_list)) {
|
||||
ubuf_folio = list_first_entry(unpin_list,
|
||||
struct udmabuf_folio, list);
|
||||
unpin_folio(ubuf_folio->folio);
|
||||
for (i = 0; i < ubuf->nr_pinned; ++i)
|
||||
unpin_folio(ubuf->pinned_folios[i]);
|
||||
|
||||
list_del(&ubuf_folio->list);
|
||||
kfree(ubuf_folio);
|
||||
}
|
||||
kvfree(ubuf->pinned_folios);
|
||||
}
|
||||
|
||||
static int add_to_unpin_list(struct list_head *unpin_list,
|
||||
struct folio *folio)
|
||||
static __always_inline int init_udmabuf(struct udmabuf *ubuf, pgoff_t pgcnt)
|
||||
{
|
||||
struct udmabuf_folio *ubuf_folio;
|
||||
|
||||
ubuf_folio = kzalloc(sizeof(*ubuf_folio), GFP_KERNEL);
|
||||
if (!ubuf_folio)
|
||||
ubuf->folios = kvmalloc_array(pgcnt, sizeof(*ubuf->folios), GFP_KERNEL);
|
||||
if (!ubuf->folios)
|
||||
return -ENOMEM;
|
||||
|
||||
ubuf->offsets = kvcalloc(pgcnt, sizeof(*ubuf->offsets), GFP_KERNEL);
|
||||
if (!ubuf->offsets)
|
||||
return -ENOMEM;
|
||||
|
||||
ubuf->pinned_folios = kvmalloc_array(pgcnt,
|
||||
sizeof(*ubuf->pinned_folios),
|
||||
GFP_KERNEL);
|
||||
if (!ubuf->pinned_folios)
|
||||
return -ENOMEM;
|
||||
|
||||
ubuf_folio->folio = folio;
|
||||
list_add_tail(&ubuf_folio->list, unpin_list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __always_inline void deinit_udmabuf(struct udmabuf *ubuf)
|
||||
{
|
||||
unpin_all_folios(ubuf);
|
||||
kvfree(ubuf->offsets);
|
||||
kvfree(ubuf->folios);
|
||||
}
|
||||
|
||||
static void release_udmabuf(struct dma_buf *buf)
|
||||
{
|
||||
struct udmabuf *ubuf = buf->priv;
|
||||
@ -195,9 +246,7 @@ static void release_udmabuf(struct dma_buf *buf)
|
||||
if (ubuf->sg)
|
||||
put_sg_table(dev, ubuf->sg, DMA_BIDIRECTIONAL);
|
||||
|
||||
unpin_all_folios(&ubuf->unpin_list);
|
||||
kfree(ubuf->offsets);
|
||||
kfree(ubuf->folios);
|
||||
deinit_udmabuf(ubuf);
|
||||
kfree(ubuf);
|
||||
}
|
||||
|
||||
@ -254,9 +303,6 @@ static int check_memfd_seals(struct file *memfd)
|
||||
{
|
||||
int seals;
|
||||
|
||||
if (!memfd)
|
||||
return -EBADFD;
|
||||
|
||||
if (!shmem_file(memfd) && !is_file_hugepages(memfd))
|
||||
return -EBADFD;
|
||||
|
||||
@ -291,100 +337,116 @@ static int export_udmabuf(struct udmabuf *ubuf,
|
||||
return dma_buf_fd(buf, flags);
|
||||
}
|
||||
|
||||
static long udmabuf_pin_folios(struct udmabuf *ubuf, struct file *memfd,
|
||||
loff_t start, loff_t size, struct folio **folios)
|
||||
{
|
||||
pgoff_t nr_pinned = ubuf->nr_pinned;
|
||||
pgoff_t upgcnt = ubuf->pagecount;
|
||||
u32 cur_folio, cur_pgcnt;
|
||||
pgoff_t pgoff, pgcnt;
|
||||
long nr_folios;
|
||||
loff_t end;
|
||||
|
||||
pgcnt = size >> PAGE_SHIFT;
|
||||
end = start + (pgcnt << PAGE_SHIFT) - 1;
|
||||
nr_folios = memfd_pin_folios(memfd, start, end, folios, pgcnt, &pgoff);
|
||||
if (nr_folios <= 0)
|
||||
return nr_folios ? nr_folios : -EINVAL;
|
||||
|
||||
cur_pgcnt = 0;
|
||||
for (cur_folio = 0; cur_folio < nr_folios; ++cur_folio) {
|
||||
pgoff_t subpgoff = pgoff;
|
||||
size_t fsize = folio_size(folios[cur_folio]);
|
||||
|
||||
ubuf->pinned_folios[nr_pinned++] = folios[cur_folio];
|
||||
|
||||
for (; subpgoff < fsize; subpgoff += PAGE_SIZE) {
|
||||
ubuf->folios[upgcnt] = folios[cur_folio];
|
||||
ubuf->offsets[upgcnt] = subpgoff;
|
||||
++upgcnt;
|
||||
|
||||
if (++cur_pgcnt >= pgcnt)
|
||||
goto end;
|
||||
}
|
||||
|
||||
/**
|
||||
* In a given range, only the first subpage of the first folio
|
||||
* has an offset, that is returned by memfd_pin_folios().
|
||||
* The first subpages of other folios (in the range) have an
|
||||
* offset of 0.
|
||||
*/
|
||||
pgoff = 0;
|
||||
}
|
||||
end:
|
||||
ubuf->pagecount = upgcnt;
|
||||
ubuf->nr_pinned = nr_pinned;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long udmabuf_create(struct miscdevice *device,
|
||||
struct udmabuf_create_list *head,
|
||||
struct udmabuf_create_item *list)
|
||||
{
|
||||
pgoff_t pgoff, pgcnt, pglimit, pgbuf = 0;
|
||||
long nr_folios, ret = -EINVAL;
|
||||
struct file *memfd = NULL;
|
||||
struct folio **folios;
|
||||
unsigned long max_nr_folios = 0;
|
||||
struct folio **folios = NULL;
|
||||
pgoff_t pgcnt = 0, pglimit;
|
||||
struct udmabuf *ubuf;
|
||||
u32 i, j, k, flags;
|
||||
loff_t end;
|
||||
long ret = -EINVAL;
|
||||
u32 i, flags;
|
||||
|
||||
ubuf = kzalloc(sizeof(*ubuf), GFP_KERNEL);
|
||||
if (!ubuf)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&ubuf->unpin_list);
|
||||
pglimit = (size_limit_mb * 1024 * 1024) >> PAGE_SHIFT;
|
||||
for (i = 0; i < head->count; i++) {
|
||||
if (!IS_ALIGNED(list[i].offset, PAGE_SIZE))
|
||||
goto err;
|
||||
if (!IS_ALIGNED(list[i].size, PAGE_SIZE))
|
||||
goto err;
|
||||
ubuf->pagecount += list[i].size >> PAGE_SHIFT;
|
||||
if (ubuf->pagecount > pglimit)
|
||||
goto err;
|
||||
pgoff_t subpgcnt;
|
||||
|
||||
if (!PAGE_ALIGNED(list[i].offset))
|
||||
goto err_noinit;
|
||||
if (!PAGE_ALIGNED(list[i].size))
|
||||
goto err_noinit;
|
||||
|
||||
subpgcnt = list[i].size >> PAGE_SHIFT;
|
||||
pgcnt += subpgcnt;
|
||||
if (pgcnt > pglimit)
|
||||
goto err_noinit;
|
||||
|
||||
max_nr_folios = max_t(unsigned long, subpgcnt, max_nr_folios);
|
||||
}
|
||||
|
||||
if (!ubuf->pagecount)
|
||||
if (!pgcnt)
|
||||
goto err_noinit;
|
||||
|
||||
ret = init_udmabuf(ubuf, pgcnt);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ubuf->folios = kmalloc_array(ubuf->pagecount, sizeof(*ubuf->folios),
|
||||
GFP_KERNEL);
|
||||
if (!ubuf->folios) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
ubuf->offsets = kcalloc(ubuf->pagecount, sizeof(*ubuf->offsets),
|
||||
GFP_KERNEL);
|
||||
if (!ubuf->offsets) {
|
||||
folios = kvmalloc_array(max_nr_folios, sizeof(*folios), GFP_KERNEL);
|
||||
if (!folios) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
pgbuf = 0;
|
||||
for (i = 0; i < head->count; i++) {
|
||||
memfd = fget(list[i].memfd);
|
||||
struct file *memfd = fget(list[i].memfd);
|
||||
|
||||
if (!memfd) {
|
||||
ret = -EBADFD;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = check_memfd_seals(memfd);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
pgcnt = list[i].size >> PAGE_SHIFT;
|
||||
folios = kmalloc_array(pgcnt, sizeof(*folios), GFP_KERNEL);
|
||||
if (!folios) {
|
||||
ret = -ENOMEM;
|
||||
if (ret < 0) {
|
||||
fput(memfd);
|
||||
goto err;
|
||||
}
|
||||
|
||||
end = list[i].offset + (pgcnt << PAGE_SHIFT) - 1;
|
||||
ret = memfd_pin_folios(memfd, list[i].offset, end,
|
||||
folios, pgcnt, &pgoff);
|
||||
if (ret <= 0) {
|
||||
kfree(folios);
|
||||
if (!ret)
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
nr_folios = ret;
|
||||
pgoff >>= PAGE_SHIFT;
|
||||
for (j = 0, k = 0; j < pgcnt; j++) {
|
||||
ubuf->folios[pgbuf] = folios[k];
|
||||
ubuf->offsets[pgbuf] = pgoff << PAGE_SHIFT;
|
||||
|
||||
if (j == 0 || ubuf->folios[pgbuf-1] != folios[k]) {
|
||||
ret = add_to_unpin_list(&ubuf->unpin_list,
|
||||
folios[k]);
|
||||
if (ret < 0) {
|
||||
kfree(folios);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
pgbuf++;
|
||||
if (++pgoff == folio_nr_pages(folios[k])) {
|
||||
pgoff = 0;
|
||||
if (++k == nr_folios)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
kfree(folios);
|
||||
ret = udmabuf_pin_folios(ubuf, memfd, list[i].offset,
|
||||
list[i].size, folios);
|
||||
fput(memfd);
|
||||
memfd = NULL;
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
flags = head->flags & UDMABUF_FLAGS_CLOEXEC ? O_CLOEXEC : 0;
|
||||
@ -392,15 +454,14 @@ static long udmabuf_create(struct miscdevice *device,
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
kvfree(folios);
|
||||
return ret;
|
||||
|
||||
err:
|
||||
if (memfd)
|
||||
fput(memfd);
|
||||
unpin_all_folios(&ubuf->unpin_list);
|
||||
kfree(ubuf->offsets);
|
||||
kfree(ubuf->folios);
|
||||
deinit_udmabuf(ubuf);
|
||||
err_noinit:
|
||||
kfree(ubuf);
|
||||
kvfree(folios);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -210,6 +210,18 @@ config DRM_DEBUG_MODESET_LOCK
|
||||
|
||||
If in doubt, say "N".
|
||||
|
||||
config DRM_CLIENT_SELECTION
|
||||
bool
|
||||
depends on DRM
|
||||
select DRM_CLIENT_SETUP if DRM_FBDEV_EMULATION
|
||||
help
|
||||
Drivers that support in-kernel DRM clients have to select this
|
||||
option.
|
||||
|
||||
config DRM_CLIENT_SETUP
|
||||
bool
|
||||
depends on DRM_CLIENT_SELECTION
|
||||
|
||||
config DRM_FBDEV_EMULATION
|
||||
bool "Enable legacy fbdev support for your modesetting driver"
|
||||
depends on DRM
|
||||
@ -472,6 +484,7 @@ source "drivers/gpu/drm/imagination/Kconfig"
|
||||
config DRM_HYPERV
|
||||
tristate "DRM Support for Hyper-V synthetic video device"
|
||||
depends on DRM && PCI && MMU && HYPERV
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_GEM_SHMEM_HELPER
|
||||
help
|
||||
|
@ -68,6 +68,7 @@ drm-y := \
|
||||
drm_prime.o \
|
||||
drm_print.o \
|
||||
drm_property.o \
|
||||
drm_rect.o \
|
||||
drm_syncobj.o \
|
||||
drm_sysfs.o \
|
||||
drm_trace_points.o \
|
||||
@ -140,11 +141,14 @@ drm_kms_helper-y := \
|
||||
drm_modeset_helper.o \
|
||||
drm_plane_helper.o \
|
||||
drm_probe_helper.o \
|
||||
drm_rect.o \
|
||||
drm_self_refresh_helper.o \
|
||||
drm_simple_kms_helper.o
|
||||
drm_kms_helper-$(CONFIG_DRM_CLIENT_SETUP) += \
|
||||
drm_client_setup.o
|
||||
drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
|
||||
drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o
|
||||
drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += \
|
||||
drm_fbdev_client.o \
|
||||
drm_fb_helper.o
|
||||
obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
|
||||
|
||||
#
|
||||
|
@ -5,6 +5,7 @@ config DRM_AMDGPU
|
||||
depends on DRM && PCI && MMU
|
||||
depends on !UML
|
||||
select FW_LOADER
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_DISPLAY_DP_HELPER
|
||||
select DRM_DISPLAY_DSC_HELPER
|
||||
select DRM_DISPLAY_HDMI_HELPER
|
||||
|
@ -23,6 +23,7 @@
|
||||
*/
|
||||
|
||||
#include <drm/amdgpu_drm.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_ttm.h>
|
||||
#include <drm/drm_gem.h>
|
||||
@ -2365,11 +2366,15 @@ retry_init:
|
||||
*/
|
||||
if (adev->mode_info.mode_config_initialized &&
|
||||
!list_empty(&adev_to_drm(adev)->mode_config.connector_list)) {
|
||||
const struct drm_format_info *format;
|
||||
|
||||
/* select 8 bpp console on low vram cards */
|
||||
if (adev->gmc.real_vram_size <= (32*1024*1024))
|
||||
drm_fbdev_ttm_setup(adev_to_drm(adev), 8);
|
||||
format = drm_format_info(DRM_FORMAT_C8);
|
||||
else
|
||||
drm_fbdev_ttm_setup(adev_to_drm(adev), 32);
|
||||
format = NULL;
|
||||
|
||||
drm_client_setup(adev_to_drm(adev), format);
|
||||
}
|
||||
|
||||
ret = amdgpu_debugfs_init(adev);
|
||||
@ -2982,6 +2987,7 @@ static const struct drm_driver amdgpu_kms_driver = {
|
||||
.num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
|
||||
.dumb_create = amdgpu_mode_dumb_create,
|
||||
.dumb_map_offset = amdgpu_mode_dumb_mmap,
|
||||
DRM_FBDEV_TTM_DRIVER_OPS,
|
||||
.fops = &amdgpu_driver_kms_fops,
|
||||
.release = &amdgpu_driver_release_kms,
|
||||
#ifdef CONFIG_PROC_FS
|
||||
@ -3008,6 +3014,7 @@ const struct drm_driver amdgpu_partition_driver = {
|
||||
.num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
|
||||
.dumb_create = amdgpu_mode_dumb_create,
|
||||
.dumb_map_offset = amdgpu_mode_dumb_mmap,
|
||||
DRM_FBDEV_TTM_DRIVER_OPS,
|
||||
.fops = &amdgpu_driver_kms_fops,
|
||||
.release = &amdgpu_driver_release_kms,
|
||||
|
||||
|
@ -6,6 +6,7 @@ config DRM_HDLCD
|
||||
tristate "ARM HDLCD"
|
||||
depends on DRM && OF && (ARM || ARM64 || COMPILE_TEST)
|
||||
depends on COMMON_CLK
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_GEM_DMA_HELPER
|
||||
help
|
||||
@ -27,6 +28,7 @@ config DRM_MALI_DISPLAY
|
||||
tristate "ARM Mali Display Processor"
|
||||
depends on DRM && OF && (ARM || ARM64 || COMPILE_TEST)
|
||||
depends on COMMON_CLK
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_GEM_DMA_HELPER
|
||||
select VIDEOMODE_HELPERS
|
||||
|
@ -3,6 +3,7 @@ config DRM_KOMEDA
|
||||
tristate "ARM Komeda display driver"
|
||||
depends on DRM && OF
|
||||
depends on COMMON_CLK
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_GEM_DMA_HELPER
|
||||
select VIDEOMODE_HELPERS
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_module.h>
|
||||
#include <drm/drm_of.h>
|
||||
#include "komeda_dev.h"
|
||||
@ -84,7 +84,7 @@ static int komeda_platform_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, mdrv);
|
||||
drm_fbdev_dma_setup(&mdrv->kms->base, 32);
|
||||
drm_client_setup(&mdrv->kms->base, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_gem_dma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_managed.h>
|
||||
@ -58,6 +59,7 @@ static irqreturn_t komeda_kms_irq_handler(int irq, void *data)
|
||||
static const struct drm_driver komeda_kms_driver = {
|
||||
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
|
||||
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(komeda_gem_dma_dumb_create),
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
.fops = &komeda_cma_fops,
|
||||
.name = "komeda",
|
||||
.desc = "Arm Komeda Display Processor driver",
|
||||
|
@ -23,6 +23,7 @@
|
||||
|
||||
#include <drm/drm_aperture.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_debugfs.h>
|
||||
#include <drm/drm_drv.h>
|
||||
@ -228,6 +229,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
|
||||
static const struct drm_driver hdlcd_driver = {
|
||||
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
|
||||
DRM_GEM_DMA_DRIVER_OPS,
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
.fops = &fops,
|
||||
.name = "hdlcd",
|
||||
.desc = "ARM HDLCD Controller DRM",
|
||||
@ -299,7 +301,7 @@ static int hdlcd_drm_bind(struct device *dev)
|
||||
if (ret)
|
||||
goto err_register;
|
||||
|
||||
drm_fbdev_dma_setup(drm, 32);
|
||||
drm_client_setup(drm, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
@ -562,6 +563,7 @@ static void malidp_debugfs_init(struct drm_minor *minor)
|
||||
static const struct drm_driver malidp_driver = {
|
||||
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
|
||||
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(malidp_dumb_create),
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
.debugfs_init = malidp_debugfs_init,
|
||||
#endif
|
||||
@ -852,7 +854,7 @@ static int malidp_bind(struct device *dev)
|
||||
if (ret)
|
||||
goto register_fail;
|
||||
|
||||
drm_fbdev_dma_setup(drm, 32);
|
||||
drm_client_setup(drm, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
config DRM_ARMADA
|
||||
tristate "DRM support for Marvell Armada SoCs"
|
||||
depends on DRM && HAVE_CLK && ARM && MMU
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select FB_IOMEM_HELPERS if DRM_FBDEV_EMULATION
|
||||
help
|
||||
|
@ -16,6 +16,8 @@ struct armada_crtc;
|
||||
struct armada_gem_object;
|
||||
struct clk;
|
||||
struct drm_display_mode;
|
||||
struct drm_fb_helper;
|
||||
struct drm_fb_helper_surface_size;
|
||||
|
||||
static inline void
|
||||
armada_updatel(uint32_t val, uint32_t mask, void __iomem *ptr)
|
||||
@ -74,10 +76,13 @@ struct armada_private {
|
||||
#define drm_to_armada_dev(dev) container_of(dev, struct armada_private, drm)
|
||||
|
||||
#if defined(CONFIG_DRM_FBDEV_EMULATION)
|
||||
void armada_fbdev_setup(struct drm_device *dev);
|
||||
int armada_fbdev_driver_fbdev_probe(struct drm_fb_helper *fbh,
|
||||
struct drm_fb_helper_surface_size *sizes);
|
||||
#define ARMADA_FBDEV_DRIVER_OPS \
|
||||
.fbdev_probe = armada_fbdev_driver_fbdev_probe
|
||||
#else
|
||||
static inline void armada_fbdev_setup(struct drm_device *dev)
|
||||
{ }
|
||||
#define ARMADA_FBDEV_DRIVER_OPS \
|
||||
.fbdev_probe = NULL
|
||||
#endif
|
||||
|
||||
int armada_overlay_plane_create(struct drm_device *, unsigned long);
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
#include <drm/drm_aperture.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_ioctl.h>
|
||||
#include <drm/drm_managed.h>
|
||||
@ -39,6 +40,7 @@ DEFINE_DRM_GEM_FOPS(armada_drm_fops);
|
||||
static const struct drm_driver armada_drm_driver = {
|
||||
.gem_prime_import = armada_gem_prime_import,
|
||||
.dumb_create = armada_gem_dumb_create,
|
||||
ARMADA_FBDEV_DRIVER_OPS,
|
||||
.major = 1,
|
||||
.minor = 0,
|
||||
.name = "armada-drm",
|
||||
@ -137,7 +139,7 @@ static int armada_drm_bind(struct device *dev)
|
||||
armada_drm_debugfs_init(priv->drm.primary);
|
||||
#endif
|
||||
|
||||
armada_fbdev_setup(&priv->drm);
|
||||
drm_client_setup(&priv->drm, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -39,8 +39,10 @@ static const struct fb_ops armada_fb_ops = {
|
||||
.fb_destroy = armada_fbdev_fb_destroy,
|
||||
};
|
||||
|
||||
static int armada_fbdev_create(struct drm_fb_helper *fbh,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
static const struct drm_fb_helper_funcs armada_fbdev_helper_funcs;
|
||||
|
||||
int armada_fbdev_driver_fbdev_probe(struct drm_fb_helper *fbh,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
struct drm_device *dev = fbh->dev;
|
||||
struct drm_mode_fb_cmd2 mode;
|
||||
@ -98,6 +100,7 @@ static int armada_fbdev_create(struct drm_fb_helper *fbh,
|
||||
info->fix.smem_len = obj->obj.size;
|
||||
info->screen_size = obj->obj.size;
|
||||
info->screen_base = ptr;
|
||||
fbh->funcs = &armada_fbdev_helper_funcs;
|
||||
fbh->fb = &dfb->fb;
|
||||
|
||||
drm_fb_helper_fill_info(info, fbh, sizes);
|
||||
@ -112,109 +115,3 @@ static int armada_fbdev_create(struct drm_fb_helper *fbh,
|
||||
dfb->fb.funcs->destroy(&dfb->fb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int armada_fb_probe(struct drm_fb_helper *fbh,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (!fbh->fb) {
|
||||
ret = armada_fbdev_create(fbh, sizes);
|
||||
if (ret == 0)
|
||||
ret = 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_fb_helper_funcs armada_fb_helper_funcs = {
|
||||
.fb_probe = armada_fb_probe,
|
||||
};
|
||||
|
||||
/*
|
||||
* Fbdev client and struct drm_client_funcs
|
||||
*/
|
||||
|
||||
static void armada_fbdev_client_unregister(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fbh = drm_fb_helper_from_client(client);
|
||||
|
||||
if (fbh->info) {
|
||||
drm_fb_helper_unregister_info(fbh);
|
||||
} else {
|
||||
drm_client_release(&fbh->client);
|
||||
drm_fb_helper_unprepare(fbh);
|
||||
kfree(fbh);
|
||||
}
|
||||
}
|
||||
|
||||
static int armada_fbdev_client_restore(struct drm_client_dev *client)
|
||||
{
|
||||
drm_fb_helper_lastclose(client->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int armada_fbdev_client_hotplug(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fbh = drm_fb_helper_from_client(client);
|
||||
struct drm_device *dev = client->dev;
|
||||
int ret;
|
||||
|
||||
if (dev->fb_helper)
|
||||
return drm_fb_helper_hotplug_event(dev->fb_helper);
|
||||
|
||||
ret = drm_fb_helper_init(dev, fbh);
|
||||
if (ret)
|
||||
goto err_drm_err;
|
||||
|
||||
if (!drm_drv_uses_atomic_modeset(dev))
|
||||
drm_helper_disable_unused_functions(dev);
|
||||
|
||||
ret = drm_fb_helper_initial_config(fbh);
|
||||
if (ret)
|
||||
goto err_drm_fb_helper_fini;
|
||||
|
||||
return 0;
|
||||
|
||||
err_drm_fb_helper_fini:
|
||||
drm_fb_helper_fini(fbh);
|
||||
err_drm_err:
|
||||
drm_err(dev, "armada: Failed to setup fbdev emulation (ret=%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_client_funcs armada_fbdev_client_funcs = {
|
||||
.owner = THIS_MODULE,
|
||||
.unregister = armada_fbdev_client_unregister,
|
||||
.restore = armada_fbdev_client_restore,
|
||||
.hotplug = armada_fbdev_client_hotplug,
|
||||
};
|
||||
|
||||
void armada_fbdev_setup(struct drm_device *dev)
|
||||
{
|
||||
struct drm_fb_helper *fbh;
|
||||
int ret;
|
||||
|
||||
drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
|
||||
drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
|
||||
|
||||
fbh = kzalloc(sizeof(*fbh), GFP_KERNEL);
|
||||
if (!fbh)
|
||||
return;
|
||||
drm_fb_helper_prepare(dev, fbh, 32, &armada_fb_helper_funcs);
|
||||
|
||||
ret = drm_client_init(dev, &fbh->client, "fbdev", &armada_fbdev_client_funcs);
|
||||
if (ret) {
|
||||
drm_err(dev, "Failed to register client: %d\n", ret);
|
||||
goto err_drm_client_init;
|
||||
}
|
||||
|
||||
drm_client_register(&fbh->client);
|
||||
|
||||
return;
|
||||
|
||||
err_drm_client_init:
|
||||
drm_fb_helper_unprepare(fbh);
|
||||
kfree(fbh);
|
||||
return;
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ config DRM_ASPEED_GFX
|
||||
depends on DRM && OF
|
||||
depends on (COMPILE_TEST || ARCH_ASPEED)
|
||||
depends on MMU
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_GEM_DMA_HELPER
|
||||
select DMA_CMA if HAVE_DMA_CONTIGUOUS
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/reset.h>
|
||||
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_device.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_gem_dma_helper.h>
|
||||
@ -247,6 +248,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
|
||||
static const struct drm_driver aspeed_gfx_driver = {
|
||||
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
|
||||
DRM_GEM_DMA_DRIVER_OPS,
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
.fops = &fops,
|
||||
.name = "aspeed-gfx-drm",
|
||||
.desc = "ASPEED GFX DRM",
|
||||
@ -339,7 +341,7 @@ static int aspeed_gfx_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto err_unload;
|
||||
|
||||
drm_fbdev_dma_setup(&priv->drm, 32);
|
||||
drm_client_setup(&priv->drm, NULL);
|
||||
return 0;
|
||||
|
||||
err_unload:
|
||||
|
@ -2,6 +2,7 @@
|
||||
config DRM_AST
|
||||
tristate "AST server chips"
|
||||
depends on DRM && PCI && MMU
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_GEM_SHMEM_HELPER
|
||||
select DRM_KMS_HELPER
|
||||
select I2C
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
#include <drm/drm_aperture.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_shmem.h>
|
||||
#include <drm/drm_gem_shmem_helper.h>
|
||||
@ -64,7 +65,8 @@ static const struct drm_driver ast_driver = {
|
||||
.minor = DRIVER_MINOR,
|
||||
.patchlevel = DRIVER_PATCHLEVEL,
|
||||
|
||||
DRM_GEM_SHMEM_DRIVER_OPS
|
||||
DRM_GEM_SHMEM_DRIVER_OPS,
|
||||
DRM_FBDEV_SHMEM_DRIVER_OPS,
|
||||
};
|
||||
|
||||
/*
|
||||
@ -360,7 +362,7 @@ static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
drm_fbdev_shmem_setup(drm, 32);
|
||||
drm_client_setup(drm, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
config DRM_ATMEL_HLCDC
|
||||
tristate "DRM Support for ATMEL HLCDC Display Controller"
|
||||
depends on DRM && OF && COMMON_CLK && ((MFD_ATMEL_HLCDC && ARM) || COMPILE_TEST)
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_GEM_DMA_HELPER
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_PANEL
|
||||
|
@ -18,8 +18,10 @@
|
||||
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_fourcc.h>
|
||||
#include <drm/drm_gem_dma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_module.h>
|
||||
@ -840,6 +842,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
|
||||
static const struct drm_driver atmel_hlcdc_dc_driver = {
|
||||
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
|
||||
DRM_GEM_DMA_DRIVER_OPS,
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
.fops = &fops,
|
||||
.name = "atmel-hlcdc",
|
||||
.desc = "Atmel HLCD Controller DRM",
|
||||
@ -865,7 +868,7 @@ static int atmel_hlcdc_dc_drm_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto err_unload;
|
||||
|
||||
drm_fbdev_dma_setup(ddev, 24);
|
||||
drm_client_setup_with_fourcc(ddev, DRM_FORMAT_RGB888);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -3505,6 +3505,7 @@ static const struct of_device_id it6505_of_match[] = {
|
||||
{ .compatible = "ite,it6505" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, it6505_of_match);
|
||||
|
||||
static struct i2c_driver it6505_i2c_driver = {
|
||||
.driver = {
|
||||
|
@ -1,14 +1,14 @@
|
||||
variables:
|
||||
DRM_CI_PROJECT_PATH: &drm-ci-project-path mesa/mesa
|
||||
DRM_CI_COMMIT_SHA: &drm-ci-commit-sha d9849ac46623797a9f56fb9d46dc52460ac477de
|
||||
DRM_CI_COMMIT_SHA: &drm-ci-commit-sha c6a9a9c3bce90923f7700219354e0b6e5a3c9ba6
|
||||
|
||||
UPSTREAM_REPO: https://gitlab.freedesktop.org/drm/kernel.git
|
||||
TARGET_BRANCH: drm-next
|
||||
|
||||
IGT_VERSION: f13702b8e4e847c56da3ef6f0969065d686049c5
|
||||
IGT_VERSION: a73311079a5d8ac99eb25336a8369a2c3c6b519b
|
||||
|
||||
DEQP_RUNNER_GIT_URL: https://gitlab.freedesktop.org/mesa/deqp-runner.git
|
||||
DEQP_RUNNER_GIT_TAG: v0.15.0
|
||||
DEQP_RUNNER_GIT_TAG: v0.20.0
|
||||
|
||||
FDO_UPSTREAM_REPO: helen.fornazier/linux # The repo where the git-archive daily runs
|
||||
MESA_TEMPLATES_COMMIT: &ci-templates-commit d5aa3941aa03c2f716595116354fb81eb8012acb
|
||||
@ -153,6 +153,14 @@ stages:
|
||||
# Pre-merge pipeline for Marge Bot
|
||||
- if: &is-pre-merge-for-marge '$GITLAB_USER_LOGIN == "marge-bot" && $CI_PIPELINE_SOURCE == "merge_request_event"'
|
||||
when: on_success
|
||||
# Push to a branch on a fork
|
||||
- &is-fork-push '$CI_PROJECT_NAMESPACE != "mesa" && $CI_PIPELINE_SOURCE == "push"'
|
||||
|
||||
# Rules applied to every job in the pipeline
|
||||
.common-rules:
|
||||
rules:
|
||||
- if: *is-fork-push
|
||||
when: manual
|
||||
|
||||
.never-post-merge-rules:
|
||||
rules:
|
||||
|
@ -1,5 +1,5 @@
|
||||
variables:
|
||||
CONTAINER_TAG: "2024-08-07-mesa-uprev"
|
||||
CONTAINER_TAG: "2024-09-09-uprevs"
|
||||
DEBIAN_X86_64_BUILD_BASE_IMAGE: "debian/x86_64_build-base"
|
||||
DEBIAN_BASE_TAG: "${CONTAINER_TAG}"
|
||||
|
||||
|
@ -2,6 +2,7 @@ amdgpu/amd_abm@abm_enabled,Fail
|
||||
amdgpu/amd_abm@abm_gradual,Fail
|
||||
amdgpu/amd_abm@backlight_monotonic_abm,Fail
|
||||
amdgpu/amd_abm@backlight_monotonic_basic,Fail
|
||||
amdgpu/amd_abm@dpms_cycle,Fail
|
||||
amdgpu/amd_assr@assr-links,Fail
|
||||
amdgpu/amd_assr@assr-links-dpms,Fail
|
||||
amdgpu/amd_mall@static-screen,Crash
|
||||
@ -14,7 +15,6 @@ amdgpu/amd_plane@mpo-scale-p010,Fail
|
||||
amdgpu/amd_plane@mpo-scale-rgb,Crash
|
||||
amdgpu/amd_plane@mpo-swizzle-toggle,Fail
|
||||
amdgpu/amd_uvd_dec@amdgpu_uvd_decode,Fail
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
kms_addfb_basic@bad-pitch-65536,Fail
|
||||
kms_addfb_basic@bo-too-small,Fail
|
||||
kms_addfb_basic@too-high,Fail
|
||||
|
@ -18,3 +18,10 @@ kms_async_flips@crc
|
||||
# IGT Version: 1.28-g0df7b9b97
|
||||
# Linux Version: 6.9.0-rc7
|
||||
kms_plane@pixel-format-source-clamping
|
||||
|
||||
# Board Name: hp-11A-G6-EE-grunt
|
||||
# Bug Report: https://lore.kernel.org/amd-gfx/09ee1862-3a0e-4085-ac1b-262601b1122b@collabora.com/T/#t
|
||||
# Failure Rate: 100
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_async_flips@async-flip-with-page-flip-events
|
||||
|
@ -1,3 +1,4 @@
|
||||
core_setmaster@master-drop-set-shared-fd,Fail
|
||||
core_setmaster@master-drop-set-user,Fail
|
||||
core_setmaster_vs_auth,Fail
|
||||
i915_module_load@load,Fail
|
||||
@ -6,7 +7,6 @@ i915_module_load@reload-no-display,Fail
|
||||
i915_module_load@resize-bar,Fail
|
||||
i915_pm_rpm@gem-execbuf-stress,Timeout
|
||||
i915_pm_rpm@module-reload,Fail
|
||||
kms_ccs@crc-primary-rotation-180-yf-tiled-ccs,Timeout
|
||||
kms_cursor_legacy@short-flip-before-cursor-atomic-transitions,Timeout
|
||||
kms_fb_coherency@memset-crc,Crash
|
||||
kms_flip@busy-flip,Timeout
|
||||
|
@ -46,3 +46,10 @@ i915_hangman@engine-engine-hang
|
||||
# IGT Version: 1.28-gf13702b8e
|
||||
# Linux Version: 6.10.0-rc5
|
||||
kms_pm_rpm@modeset-lpsp-stress
|
||||
|
||||
# Board Name: asus-C433TA-AJ0005-rammus
|
||||
# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332@collabora.com/T/#t
|
||||
# Failure Rate: 50
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_pm_rpm@drm-resources-equal
|
||||
|
@ -8,7 +8,6 @@ kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
|
||||
kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-upscaling,Fail
|
||||
kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling,Fail
|
||||
kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-upscaling,Fail
|
||||
kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-downscaling,Fail
|
||||
kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling,Fail
|
||||
kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling,Fail
|
||||
kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-upscaling,Fail
|
||||
|
@ -4,3 +4,10 @@
|
||||
# IGT Version: 1.28-g0df7b9b97
|
||||
# Linux Version: 6.9.0-rc7
|
||||
kms_fb_coherency@memset-crc
|
||||
|
||||
# Board Name: asus-C523NA-A20057-coral
|
||||
# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332@collabora.com/T/#t
|
||||
# Failure Rate: 100
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_universal_plane@cursor-fb-leak
|
||||
|
@ -1,5 +1,5 @@
|
||||
core_setmaster@master-drop-set-shared-fd,Fail
|
||||
core_setmaster@master-drop-set-user,Fail
|
||||
core_setmaster_vs_auth,Fail
|
||||
i915_module_load@load,Fail
|
||||
i915_module_load@reload,Fail
|
||||
i915_module_load@reload-no-display,Fail
|
||||
@ -9,10 +9,10 @@ i915_pipe_stress@stress-xrgb8888-ytiled,Fail
|
||||
i915_pm_rpm@gem-execbuf-stress,Timeout
|
||||
i915_pm_rpm@module-reload,Fail
|
||||
i915_pm_rpm@system-suspend-execbuf,Timeout
|
||||
kms_ccs@crc-primary-rotation-180-yf-tiled-ccs,Timeout
|
||||
i915_pm_rps@engine-order,Fail
|
||||
kms_big_fb@linear-16bpp-rotate-180,Timeout
|
||||
kms_fb_coherency@memset-crc,Crash
|
||||
kms_flip@busy-flip,Timeout
|
||||
kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset-interruptible,Fail
|
||||
kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
|
||||
kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-upscaling,Fail
|
||||
kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
|
||||
@ -40,14 +40,11 @@ kms_plane_alpha_blend@alpha-basic,Fail
|
||||
kms_plane_alpha_blend@alpha-opaque-fb,Fail
|
||||
kms_plane_alpha_blend@alpha-transparent-fb,Fail
|
||||
kms_plane_alpha_blend@constant-alpha-max,Fail
|
||||
kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation,Timeout
|
||||
kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-5,Timeout
|
||||
kms_pm_rpm@modeset-stress-extra-wait,Timeout
|
||||
kms_pm_rpm@universal-planes,Timeout
|
||||
kms_pm_rpm@universal-planes-dpms,Timeout
|
||||
kms_prop_blob@invalid-set-prop,Fail
|
||||
kms_psr2_sf@cursor-plane-update-sf,Fail
|
||||
kms_psr2_sf@fbc-plane-move-sf-dmg-area,Timeout
|
||||
kms_psr2_sf@overlay-plane-update-continuous-sf,Fail
|
||||
kms_psr2_sf@overlay-plane-update-sf-dmg-area,Fail
|
||||
kms_psr2_sf@overlay-primary-update-sf-dmg-area,Fail
|
||||
@ -55,7 +52,6 @@ kms_psr2_sf@plane-move-sf-dmg-area,Fail
|
||||
kms_psr2_sf@primary-plane-update-sf-dmg-area,Fail
|
||||
kms_psr2_sf@primary-plane-update-sf-dmg-area-big-fb,Fail
|
||||
kms_psr2_su@page_flip-NV12,Fail
|
||||
kms_psr2_su@page_flip-P010,Fail
|
||||
kms_rotation_crc@primary-rotation-180,Timeout
|
||||
kms_setmode@basic,Fail
|
||||
kms_vblank@query-forked-hang,Timeout
|
||||
|
@ -11,3 +11,17 @@ kms_plane_alpha_blend@constant-alpha-min
|
||||
# IGT Version: 1.28-gf13702b8e
|
||||
# Linux Version: 6.10.0-rc5
|
||||
kms_atomic_transition@plane-all-modeset-transition-internal-panels
|
||||
|
||||
# Board Name: asus-C436FA-Flip-hatch
|
||||
# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332@collabora.com/T/#t
|
||||
# Failure Rate: 100
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_plane_alpha_blend@constant-alpha-min
|
||||
|
||||
# Board Name: asus-C436FA-Flip-hatch
|
||||
# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332@collabora.com/T/#t
|
||||
# Failure Rate: 50
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_async_flips@crc
|
||||
|
@ -63,3 +63,4 @@ xe_module_load@load,Fail
|
||||
xe_module_load@many-reload,Fail
|
||||
xe_module_load@reload,Fail
|
||||
xe_module_load@reload-no-display,Fail
|
||||
core_setmaster@master-drop-set-shared-fd,Fail
|
||||
|
@ -17,12 +17,10 @@ perf@i915-ref-count,Fail
|
||||
perf_pmu@busy-accuracy-50,Fail
|
||||
perf_pmu@module-unload,Fail
|
||||
perf_pmu@rc6,Crash
|
||||
prime_busy@after,Fail
|
||||
sysfs_heartbeat_interval@long,Timeout
|
||||
sysfs_heartbeat_interval@off,Timeout
|
||||
sysfs_preempt_timeout@off,Timeout
|
||||
sysfs_timeslice_duration@off,Timeout
|
||||
testdisplay,Timeout
|
||||
xe_module_load@force-load,Fail
|
||||
xe_module_load@load,Fail
|
||||
xe_module_load@many-reload,Fail
|
||||
|
@ -1,40 +1,64 @@
|
||||
api_intel_allocator@fork-simple-stress-signal,Timeout
|
||||
api_intel_allocator@open-vm,Timeout
|
||||
api_intel_allocator@simple-allocator,Timeout
|
||||
api_intel_bb@lot-of-buffers,Timeout
|
||||
api_intel_bb@object-reloc-keep-cache,Timeout
|
||||
api_intel_bb@offset-control,Timeout
|
||||
core_auth@getclient-simple,Timeout
|
||||
core_hotunplug@hotunbind-rebind,Timeout
|
||||
api_intel_bb@render-ccs,Timeout
|
||||
api_intel_bb@reset-bb,Timeout
|
||||
core_auth@basic-auth,Timeout
|
||||
core_hotunplug@hotrebind,Timeout
|
||||
core_setmaster@master-drop-set-user,Fail
|
||||
debugfs_test@read_all_entries_display_on,Timeout
|
||||
drm_read@invalid-buffer,Timeout
|
||||
drm_read@short-buffer-nonblock,Timeout
|
||||
drm_read@empty-block,Timeout
|
||||
dumb_buffer@create-clear,Timeout
|
||||
dumb_buffer@invalid-bpp,Timeout
|
||||
gen3_render_tiledx_blits,Timeout
|
||||
gen7_exec_parse@basic-allocation,Timeout
|
||||
gen7_exec_parse@batch-without-end,Timeout
|
||||
gen9_exec_parse@batch-invalid-length,Timeout
|
||||
gen9_exec_parse@bb-secure,Timeout
|
||||
gen9_exec_parse@secure-batches,Timeout
|
||||
gen9_exec_parse@shadow-peek,Timeout
|
||||
gen9_exec_parse@unaligned-jump,Timeout
|
||||
i915_getparams_basic@basic-subslice-total,Timeout
|
||||
i915_hangman@gt-engine-hang,Timeout
|
||||
i915_module_load@load,Fail
|
||||
i915_module_load@reload,Fail
|
||||
i915_module_load@reload-no-display,Fail
|
||||
i915_module_load@resize-bar,Fail
|
||||
i915_pciid,Timeout
|
||||
i915_pipe_stress@stress-xrgb8888-ytiled,Timeout
|
||||
i915_pm_rpm@gem-execbuf-stress,Timeout
|
||||
i915_pm_rps@engine-order,Timeout
|
||||
i915_pm_rps@thresholds-idle-park,Timeout
|
||||
i915_query@engine-info,Timeout
|
||||
i915_query@query-topology-kernel-writes,Timeout
|
||||
i915_query@test-query-geometry-subslices,Timeout
|
||||
kms_lease@lease-uevent,Fail
|
||||
kms_rotation_crc@multiplane-rotation,Fail
|
||||
perf@i915-ref-count,Fail
|
||||
perf_pmu@busy,Timeout
|
||||
perf_pmu@enable-race,Timeout
|
||||
perf_pmu@event-wait,Timeout
|
||||
perf_pmu@faulting-read,Timeout
|
||||
perf_pmu@gt-awake,Timeout
|
||||
perf_pmu@interrupts,Timeout
|
||||
perf_pmu@module-unload,Fail
|
||||
perf_pmu@most-busy-idle-check-all,Timeout
|
||||
perf_pmu@rc6,Crash
|
||||
perf_pmu@render-node-busy-idle,Fail
|
||||
perf_pmu@semaphore-wait-idle,Timeout
|
||||
prime_busy@after,Timeout
|
||||
prime_mmap@test_aperture_limit,Timeout
|
||||
prime_mmap@test_map_unmap,Timeout
|
||||
prime_mmap@test_refcounting,Timeout
|
||||
prime_self_import@basic-with_one_bo,Timeout
|
||||
sriov_basic@enable-vfs-autoprobe-off,Timeout
|
||||
syncobj_basic@bad-destroy,Timeout
|
||||
syncobj_basic@bad-flags-fd-to-handle,Timeout
|
||||
syncobj_basic@create-signaled,Timeout
|
||||
syncobj_eventfd@invalid-bad-pad,Timeout
|
||||
syncobj_eventfd@timeline-wait-before-signal,Timeout
|
||||
syncobj_wait@invalid-multi-wait-unsubmitted-signaled,Timeout
|
||||
syncobj_wait@invalid-signal-illegal-handle,Timeout
|
||||
syncobj_wait@invalid-single-wait-all-unsubmitted,Timeout
|
||||
|
@ -1,5 +1,5 @@
|
||||
core_setmaster@master-drop-set-shared-fd,Fail
|
||||
core_setmaster@master-drop-set-user,Fail
|
||||
core_setmaster_vs_auth,Fail
|
||||
i915_module_load@load,Fail
|
||||
i915_module_load@reload,Fail
|
||||
i915_module_load@reload-no-display,Fail
|
||||
@ -7,7 +7,8 @@ i915_module_load@resize-bar,Fail
|
||||
i915_pm_rpm@gem-execbuf-stress,Timeout
|
||||
i915_pm_rpm@module-reload,Fail
|
||||
i915_pm_rpm@system-suspend-execbuf,Timeout
|
||||
kms_ccs@crc-primary-rotation-180-yf-tiled-ccs,Timeout
|
||||
i915_pm_rps@engine-order,Fail
|
||||
kms_big_fb@linear-16bpp-rotate-180,Timeout
|
||||
kms_cursor_legacy@short-flip-before-cursor-atomic-transitions,Timeout
|
||||
kms_dirtyfb@default-dirtyfb-ioctl,Fail
|
||||
kms_dirtyfb@fbc-dirtyfb-ioctl,Fail
|
||||
@ -32,19 +33,17 @@ kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail
|
||||
kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail
|
||||
kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail
|
||||
kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
|
||||
kms_frontbuffer_tracking@fbc-rgb565-draw-mmap-cpu,Timeout
|
||||
kms_frontbuffer_tracking@fbc-tiling-linear,Fail
|
||||
kms_frontbuffer_tracking@fbc-1p-indfb-fliptrack-mmap-gtt,Timeout
|
||||
kms_lease@lease-uevent,Fail
|
||||
kms_plane_alpha_blend@alpha-basic,Fail
|
||||
kms_plane_alpha_blend@alpha-opaque-fb,Fail
|
||||
kms_plane_alpha_blend@alpha-transparent-fb,Fail
|
||||
kms_plane_alpha_blend@constant-alpha-max,Fail
|
||||
kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation,Timeout
|
||||
kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-5,Timeout
|
||||
kms_pm_rpm@modeset-stress-extra-wait,Timeout
|
||||
kms_pm_rpm@universal-planes,Timeout
|
||||
kms_pm_rpm@universal-planes-dpms,Timeout
|
||||
kms_prop_blob@invalid-set-prop,Fail
|
||||
kms_rotation_crc@primary-rotation-180,Timeout
|
||||
kms_vblank@query-forked-hang,Timeout
|
||||
perf@i915-ref-count,Fail
|
||||
|
@ -1,8 +1,3 @@
|
||||
device_reset@cold-reset-bound,Fail
|
||||
device_reset@reset-bound,Fail
|
||||
device_reset@unbind-cold-reset-rebind,Fail
|
||||
device_reset@unbind-reset-rebind,Fail
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
fbdev@eof,Fail
|
||||
fbdev@read,Fail
|
||||
kms_3d,Fail
|
||||
@ -27,10 +22,6 @@ kms_cursor_legacy@cursor-vs-flip-atomic,Fail
|
||||
kms_cursor_legacy@cursor-vs-flip-legacy,Fail
|
||||
kms_flip@flip-vs-modeset-vs-hang,Fail
|
||||
kms_flip@flip-vs-panning-vs-hang,Fail
|
||||
kms_flip@flip-vs-suspend,Fail
|
||||
kms_flip@flip-vs-suspend-interruptible,Fail
|
||||
kms_lease@lease-uevent,Fail
|
||||
kms_properties@get_properties-sanity-atomic,Fail
|
||||
kms_properties@plane-properties-atomic,Fail
|
||||
kms_properties@plane-properties-legacy,Fail
|
||||
kms_rmfb@close-fd,Fail
|
||||
kms_flip@flip-vs-suspend-interruptible,Fail
|
||||
|
@ -1,10 +1,5 @@
|
||||
core_setmaster@master-drop-set-shared-fd,Fail
|
||||
device_reset@cold-reset-bound,Fail
|
||||
device_reset@reset-bound,Fail
|
||||
device_reset@unbind-cold-reset-rebind,Fail
|
||||
device_reset@unbind-reset-rebind,Fail
|
||||
dumb_buffer@create-clear,Crash
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
fbdev@eof,Fail
|
||||
fbdev@pan,Fail
|
||||
fbdev@read,Fail
|
||||
@ -18,5 +13,4 @@ kms_color@invalid-gamma-lut-sizes,Fail
|
||||
kms_flip@flip-vs-panning-vs-hang,Fail
|
||||
kms_flip@flip-vs-suspend,Fail
|
||||
kms_lease@lease-uevent,Fail
|
||||
kms_properties@plane-properties-atomic,Fail
|
||||
kms_rmfb@close-fd,Fail
|
||||
|
@ -1,4 +1,3 @@
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
kms_3d,Fail
|
||||
kms_cursor_legacy@forked-bo,Fail
|
||||
kms_cursor_legacy@forked-move,Fail
|
||||
|
@ -1,8 +1,3 @@
|
||||
device_reset@cold-reset-bound,Fail
|
||||
device_reset@reset-bound,Fail
|
||||
device_reset@unbind-cold-reset-rebind,Fail
|
||||
device_reset@unbind-reset-rebind,Fail
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
kms_3d,Fail
|
||||
kms_cursor_legacy@torture-bo,Fail
|
||||
kms_force_connector_basic@force-edid,Fail
|
||||
|
@ -1,7 +1,2 @@
|
||||
device_reset@cold-reset-bound,Fail
|
||||
device_reset@reset-bound,Fail
|
||||
device_reset@unbind-cold-reset-rebind,Fail
|
||||
device_reset@unbind-reset-rebind,Fail
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
kms_3d,Fail
|
||||
kms_lease@lease-uevent,Fail
|
||||
|
@ -1,8 +1,3 @@
|
||||
device_reset@cold-reset-bound,Fail
|
||||
device_reset@reset-bound,Fail
|
||||
device_reset@unbind-cold-reset-rebind,Fail
|
||||
device_reset@unbind-reset-rebind,Fail
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
kms_color@ctm-0-25,Fail
|
||||
kms_color@ctm-0-50,Fail
|
||||
kms_color@ctm-0-75,Fail
|
||||
@ -11,35 +6,13 @@ kms_color@ctm-green-to-red,Fail
|
||||
kms_color@ctm-negative,Fail
|
||||
kms_color@ctm-red-to-blue,Fail
|
||||
kms_color@ctm-signed,Fail
|
||||
kms_content_protection@atomic,Crash
|
||||
kms_content_protection@atomic-dpms,Crash
|
||||
kms_content_protection@content-type-change,Crash
|
||||
kms_content_protection@lic-type-0,Crash
|
||||
kms_content_protection@lic-type-1,Crash
|
||||
kms_content_protection@srm,Crash
|
||||
kms_content_protection@type1,Crash
|
||||
kms_content_protection@uevent,Crash
|
||||
kms_cursor_legacy@2x-cursor-vs-flip-atomic,Fail
|
||||
kms_cursor_legacy@2x-cursor-vs-flip-legacy,Fail
|
||||
kms_cursor_legacy@2x-flip-vs-cursor-atomic,Fail
|
||||
kms_cursor_legacy@2x-flip-vs-cursor-legacy,Fail
|
||||
kms_cursor_legacy@2x-long-cursor-vs-flip-atomic,Fail
|
||||
kms_cursor_legacy@2x-long-cursor-vs-flip-legacy,Fail
|
||||
kms_cursor_legacy@2x-long-flip-vs-cursor-atomic,Fail
|
||||
kms_cursor_legacy@2x-long-flip-vs-cursor-legacy,Fail
|
||||
kms_cursor_legacy@cursor-vs-flip-toggle,Fail
|
||||
kms_cursor_legacy@cursor-vs-flip-varying-size,Fail
|
||||
kms_display_modes@extended-mode-basic,Fail
|
||||
kms_flip@2x-flip-vs-modeset-vs-hang,Fail
|
||||
kms_flip@2x-flip-vs-panning-vs-hang,Fail
|
||||
kms_flip@flip-vs-modeset-vs-hang,Fail
|
||||
kms_flip@flip-vs-panning-vs-hang,Fail
|
||||
kms_lease@lease-uevent,Fail
|
||||
kms_multipipe_modeset@basic-max-pipe-crc-check,Fail
|
||||
kms_pipe_crc_basic@compare-crc-sanitycheck-nv12,Fail
|
||||
kms_plane_alpha_blend@alpha-7efc,Fail
|
||||
kms_plane_alpha_blend@coverage-7efc,Fail
|
||||
kms_plane_alpha_blend@coverage-vs-premult-vs-constant,Fail
|
||||
kms_plane_lowres@tiling-none,Fail
|
||||
kms_rmfb@close-fd,Fail
|
||||
kms_vblank@ts-continuation-dpms-rpm,Fail
|
||||
|
@ -1,8 +1,3 @@
|
||||
device_reset@cold-reset-bound,Fail
|
||||
device_reset@reset-bound,Fail
|
||||
device_reset@unbind-cold-reset-rebind,Fail
|
||||
device_reset@unbind-reset-rebind,Fail
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
kms_color@ctm-0-25,Fail
|
||||
kms_color@ctm-0-50,Fail
|
||||
kms_color@ctm-0-75,Fail
|
||||
@ -11,35 +6,13 @@ kms_color@ctm-green-to-red,Fail
|
||||
kms_color@ctm-negative,Fail
|
||||
kms_color@ctm-red-to-blue,Fail
|
||||
kms_color@ctm-signed,Fail
|
||||
kms_content_protection@atomic,Crash
|
||||
kms_content_protection@atomic-dpms,Crash
|
||||
kms_content_protection@content-type-change,Crash
|
||||
kms_content_protection@lic-type-0,Crash
|
||||
kms_content_protection@lic-type-1,Crash
|
||||
kms_content_protection@srm,Crash
|
||||
kms_content_protection@type1,Crash
|
||||
kms_content_protection@uevent,Crash
|
||||
kms_cursor_legacy@2x-cursor-vs-flip-atomic,Fail
|
||||
kms_cursor_legacy@2x-cursor-vs-flip-legacy,Fail
|
||||
kms_cursor_legacy@2x-flip-vs-cursor-atomic,Fail
|
||||
kms_cursor_legacy@2x-flip-vs-cursor-legacy,Fail
|
||||
kms_cursor_legacy@2x-long-cursor-vs-flip-atomic,Fail
|
||||
kms_cursor_legacy@2x-long-cursor-vs-flip-legacy,Fail
|
||||
kms_cursor_legacy@2x-long-flip-vs-cursor-atomic,Fail
|
||||
kms_cursor_legacy@2x-long-flip-vs-cursor-legacy,Fail
|
||||
kms_cursor_legacy@cursor-vs-flip-toggle,Fail
|
||||
kms_cursor_legacy@cursor-vs-flip-varying-size,Fail
|
||||
kms_display_modes@extended-mode-basic,Fail
|
||||
kms_flip@2x-flip-vs-modeset-vs-hang,Fail
|
||||
kms_flip@2x-flip-vs-panning-vs-hang,Fail
|
||||
kms_flip@flip-vs-modeset-vs-hang,Fail
|
||||
kms_flip@flip-vs-panning-vs-hang,Fail
|
||||
kms_lease@lease-uevent,Fail
|
||||
kms_multipipe_modeset@basic-max-pipe-crc-check,Fail
|
||||
kms_pipe_crc_basic@compare-crc-sanitycheck-nv12,Fail
|
||||
kms_plane_alpha_blend@alpha-7efc,Fail
|
||||
kms_plane_alpha_blend@coverage-7efc,Fail
|
||||
kms_plane_alpha_blend@coverage-vs-premult-vs-constant,Fail
|
||||
kms_plane_lowres@tiling-none,Fail
|
||||
kms_rmfb@close-fd,Fail
|
||||
kms_vblank@ts-continuation-dpms-rpm,Fail
|
||||
|
@ -1,8 +1,4 @@
|
||||
device_reset@cold-reset-bound,Fail
|
||||
device_reset@reset-bound,Fail
|
||||
device_reset@unbind-cold-reset-rebind,Fail
|
||||
device_reset@unbind-reset-rebind,Fail
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
drm_read@invalid-buffer,Fail
|
||||
kms_color@ctm-0-25,Fail
|
||||
kms_color@ctm-0-50,Fail
|
||||
kms_color@ctm-0-75,Fail
|
||||
|
@ -116,3 +116,17 @@ kms_cursor_legacy@flip-vs-cursor-toggle
|
||||
# IGT Version: 1.28-gf13702b8e
|
||||
# Linux Version: 6.10.0-rc5
|
||||
msm/msm_shrink@copy-mmap-oom-8
|
||||
|
||||
# Board Name: sdm845-cheza-r3
|
||||
# Bug Report: https://lore.kernel.org/linux-arm-msm/64bc4bcf-de51-4e60-a9f7-1295a1e64c65@collabora.com/T/#t
|
||||
# Failure Rate: 50
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_lease@page-flip-implicit-plane
|
||||
|
||||
# Board Name: sdm845-cheza-r3
|
||||
# Bug Report: https://lore.kernel.org/linux-arm-msm/64bc4bcf-de51-4e60-a9f7-1295a1e64c65@collabora.com/T/#t
|
||||
# Failure Rate: 50
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc5
|
||||
kms_flip@flip-vs-expired-vblank
|
||||
|
@ -25,3 +25,8 @@ core_hotunplug.*
|
||||
|
||||
# Whole machine hangs
|
||||
kms_cursor_crc.*
|
||||
|
||||
# IGT test crash
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_content_protection@uevent
|
||||
|
@ -1 +1,2 @@
|
||||
panfrost/panfrost_prime@gem-prime-import,Fail
|
||||
panfrost/panfrost_submit@pan-submit-error-bad-requirements,Fail
|
||||
|
@ -1 +1,2 @@
|
||||
panfrost/panfrost_prime@gem-prime-import,Fail
|
||||
panfrost/panfrost_submit@pan-submit-error-bad-requirements,Fail
|
||||
|
@ -1 +1,2 @@
|
||||
panfrost/panfrost_prime@gem-prime-import,Crash
|
||||
panfrost/panfrost_submit@pan-submit-error-bad-requirements,Crash
|
||||
|
@ -1 +1,2 @@
|
||||
panfrost/panfrost_prime@gem-prime-import,Fail
|
||||
panfrost/panfrost_submit@pan-submit-error-bad-requirements,Fail
|
||||
|
@ -1,18 +1,24 @@
|
||||
core_setmaster@master-drop-set-root,Crash
|
||||
core_setmaster@master-drop-set-user,Crash
|
||||
core_setmaster_vs_auth,Crash
|
||||
device_reset@cold-reset-bound,Crash
|
||||
device_reset@reset-bound,Crash
|
||||
device_reset@unbind-cold-reset-rebind,Crash
|
||||
device_reset@unbind-reset-rebind,Crash
|
||||
dumb_buffer@create-clear,Crash
|
||||
dumb_buffer@invalid-bpp,Crash
|
||||
fbdev@pan,Crash
|
||||
kms_bw@linear-tiling-2-displays-1920x1080p,Fail
|
||||
kms_cursor_crc@cursor-onscreen-32x10,Crash
|
||||
kms_cursor_crc@cursor-onscreen-32x32,Crash
|
||||
kms_cursor_crc@cursor-onscreen-64x64,Crash
|
||||
kms_cursor_crc@cursor-random-32x10,Crash
|
||||
kms_cursor_crc@cursor-sliding-32x10,Crash
|
||||
kms_cursor_crc@cursor-sliding-32x32,Crash
|
||||
kms_cursor_crc@cursor-sliding-64x21,Crash
|
||||
kms_cursor_legacy@basic-flip-before-cursor-atomic,Fail
|
||||
kms_cursor_legacy@cursor-vs-flip-legacy,Fail
|
||||
kms_cursor_legacy@flip-vs-cursor-crc-atomic,Crash
|
||||
kms_flip@flip-vs-panning-vs-hang,Crash
|
||||
kms_invalid_mode@int-max-clock,Crash
|
||||
kms_lease@invalid-create-leases,Fail
|
||||
kms_pipe_crc_basic@read-crc-frame-sequence,Crash
|
||||
kms_plane@pixel-format,Crash
|
||||
kms_plane@pixel-format-source-clamping,Crash
|
||||
kms_prop_blob@invalid-set-prop,Crash
|
||||
kms_prop_blob@invalid-set-prop-any,Crash
|
||||
kms_properties@get_properties-sanity-atomic,Crash
|
||||
kms_properties@get_properties-sanity-non-atomic,Crash
|
||||
kms_rmfb@close-fd,Crash
|
||||
|
@ -4,3 +4,31 @@
|
||||
# IGT Version: 1.28-gf13702b8e
|
||||
# Linux Version: 6.10.0-rc5
|
||||
kms_cursor_legacy@flip-vs-cursor-atomic
|
||||
|
||||
# Board Name: rk3288-veyron-jaq
|
||||
# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b@collabora.com/T/#t
|
||||
# Failure Rate: 100
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_cursor_crc@cursor-offscreen-32x10
|
||||
|
||||
# Board Name: rk3288-veyron-jaq
|
||||
# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b@collabora.com/T/#t
|
||||
# Failure Rate: 100
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_cursor_edge_walk@64x64-left-edge
|
||||
|
||||
# Board Name: rk3288-veyron-jaq
|
||||
# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b@collabora.com/T/#t
|
||||
# Failure Rate: 100
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_flip@plain-flip-ts-check
|
||||
|
||||
# Board Name: rk3288-veyron-jaq
|
||||
# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b@collabora.com/T/#t
|
||||
# Failure Rate: 100
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_cursor_crc@cursor-alpha-opaque
|
||||
|
@ -1,9 +1,4 @@
|
||||
device_reset@cold-reset-bound,Fail
|
||||
device_reset@reset-bound,Fail
|
||||
device_reset@unbind-cold-reset-rebind,Fail
|
||||
device_reset@unbind-reset-rebind,Fail
|
||||
dumb_buffer@create-clear,Crash
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
kms_atomic_transition@modeset-transition,Fail
|
||||
kms_atomic_transition@modeset-transition-fencing,Fail
|
||||
kms_atomic_transition@plane-toggle-modeset-transition,Fail
|
||||
@ -46,7 +41,6 @@ kms_cursor_legacy@flip-vs-cursor-legacy,Fail
|
||||
kms_cursor_legacy@long-nonblocking-modeset-vs-cursor-atomic,Fail
|
||||
kms_flip@basic-flip-vs-wf_vblank,Fail
|
||||
kms_flip@blocking-wf_vblank,Fail
|
||||
kms_flip@dpms-vs-vblank-race,Fail
|
||||
kms_flip@flip-vs-absolute-wf_vblank,Fail
|
||||
kms_flip@flip-vs-blocking-wf-vblank,Fail
|
||||
kms_flip@flip-vs-modeset-vs-hang,Fail
|
||||
@ -59,7 +53,6 @@ kms_flip@plain-flip-fb-recreate,Fail
|
||||
kms_flip@plain-flip-fb-recreate-interruptible,Fail
|
||||
kms_flip@plain-flip-ts-check,Fail
|
||||
kms_flip@plain-flip-ts-check-interruptible,Fail
|
||||
kms_flip@wf_vblank-ts-check,Fail
|
||||
kms_flip@wf_vblank-ts-check-interruptible,Fail
|
||||
kms_invalid_mode@int-max-clock,Fail
|
||||
kms_lease@lease-uevent,Fail
|
||||
|
@ -46,3 +46,31 @@ kms_setmode@basic
|
||||
# IGT Version: 1.28-gf13702b8e
|
||||
# Linux Version: 6.10.0-rc5
|
||||
kms_bw@connected-linear-tiling-1-displays-2560x1440p
|
||||
|
||||
# Board Name: rk3399-gru-kevin
|
||||
# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b@collabora.com/T/#t
|
||||
# Failure Rate: 50
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc2
|
||||
kms_flip@wf_vblank-ts-check
|
||||
|
||||
# Board Name: rk3399-gru-kevin
|
||||
# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b@collabora.com/T/#t
|
||||
# Failure Rate: 50
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc5
|
||||
kms_flip@dpms-vs-vblank-race
|
||||
|
||||
# Board Name: rk3399-gru-kevin
|
||||
# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b@collabora.com/T/#t
|
||||
# Failure Rate: 50
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc5
|
||||
kms_bw@linear-tiling-2-displays-2160x1440p
|
||||
|
||||
# Board Name: rk3399-gru-kevin
|
||||
# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b@collabora.com/T/#t
|
||||
# Failure Rate: 50
|
||||
# IGT Version: 1.28-ga73311079
|
||||
# Linux Version: 6.11.0-rc5
|
||||
kms_flip@flip-vs-expired-vblank
|
||||
|
@ -1,24 +1,3 @@
|
||||
core_hotunplug@hotrebind,Fail
|
||||
core_hotunplug@hotrebind-lateclose,Fail
|
||||
core_hotunplug@hotreplug,Fail
|
||||
core_hotunplug@hotreplug-lateclose,Fail
|
||||
core_hotunplug@hotunbind-rebind,Fail
|
||||
core_hotunplug@hotunplug-rescan,Fail
|
||||
core_hotunplug@unbind-rebind,Fail
|
||||
core_hotunplug@unplug-rescan,Fail
|
||||
device_reset@cold-reset-bound,Fail
|
||||
device_reset@reset-bound,Fail
|
||||
device_reset@unbind-cold-reset-rebind,Fail
|
||||
device_reset@unbind-reset-rebind,Fail
|
||||
dumb_buffer@invalid-bpp,Fail
|
||||
kms_content_protection@atomic,Crash
|
||||
kms_content_protection@atomic-dpms,Crash
|
||||
kms_content_protection@content-type-change,Crash
|
||||
kms_content_protection@lic-type-0,Crash
|
||||
kms_content_protection@lic-type-1,Crash
|
||||
kms_content_protection@srm,Crash
|
||||
kms_content_protection@type1,Crash
|
||||
kms_content_protection@uevent,Crash
|
||||
kms_cursor_crc@cursor-rapid-movement-128x128,Fail
|
||||
kms_cursor_crc@cursor-rapid-movement-128x42,Fail
|
||||
kms_cursor_crc@cursor-rapid-movement-256x256,Fail
|
||||
|
@ -205,6 +205,59 @@ kms_cursor_edge_walk@128x128-right-edge
|
||||
# R10: ffffa2c181790000 R11: 0000000000000000 R12: ffffa2c1814fa810
|
||||
# R13: 0000000000000031 R14: 0000000000000031 R15: 000000000000
|
||||
|
||||
kms_cursor_edge_walk@128x128-left-edge
|
||||
# DEBUG - Begin test kms_cursor_edge_walk@128x128-left-edge
|
||||
# Oops: Oops: 0000 [#1] PREEMPT SMP NOPTI
|
||||
# CPU: 0 UID: 0 PID: 27 Comm: kworker/u8:1 Not tainted 6.11.0-rc5-g5d3429a7e9aa #1
|
||||
# Hardware name: ChromiumOS crosvm, BIOS 0
|
||||
# Workqueue: vkms_composer vkms_composer_worker [vkms]
|
||||
# RIP: 0010:compose_active_planes+0x344/0x4e0 [vkms]
|
||||
# Code: 6a 34 0f 8e 91 fe ff ff 44 89 ea 48 8d 7c 24 48 e8 71 f0 ff ff 4b 8b 04 fc 48 8b 4c 24 50 48 8b 7c 24 40 48 8b 80 48 01 00 00 <48> 63 70 18 8b 40 20 48 89 f2 48 c1 e6 03 29 d0 48 8b 54 24 48 48
|
||||
# RSP: 0018:ffffa437800ebd58 EFLAGS: 00010282
|
||||
# RAX: 0000000000000000 RBX: 0000000000000002 RCX: ffffa0e841904000
|
||||
# RDX: 00000000000000ff RSI: ffffa0e841905ff8 RDI: ffffa0e841902000
|
||||
# RBP: 0000000000000000 R08: ffffa0e84158a600 R09: 00000000000003ff
|
||||
# R10: 0000000078b2bcd2 R11: 00000000278b2bcd R12: ffffa0e84870fc60
|
||||
# R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
|
||||
# FS: 0000000000000000(0000) GS:ffffa0e86bc00000(0000) knlGS:0000000000000000
|
||||
# CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
|
||||
# CR2: 0000000000000018 CR3: 0000000101710000 CR4: 0000000000350ef0
|
||||
# Call Trace:
|
||||
# <TASK>
|
||||
# ? __die+0x1e/0x60
|
||||
# ? page_fault_oops+0x17b/0x4a0
|
||||
# ? exc_page_fault+0x6d/0x230
|
||||
# ? asm_exc_page_fault+0x26/0x30
|
||||
# ? compose_active_planes+0x344/0x4e0 [vkms]
|
||||
# ? compose_active_planes+0x32f/0x4e0 [vkms]
|
||||
# ? srso_return_thunk+0x5/0x5f
|
||||
# vkms_composer_worker+0x205/0x240 [vkms]
|
||||
# process_one_work+0x201/0x6c0
|
||||
# ? lock_is_held_type+0x9e/0x110
|
||||
# worker_thread+0x17e/0x310
|
||||
# ? __pfx_worker_thread+0x10/0x10
|
||||
# kthread+0xce/0x100
|
||||
# ? __pfx_kthread+0x10/0x10
|
||||
# ret_from_fork+0x2f/0x50
|
||||
# ? __pfx_kthread+0x10/0x10
|
||||
# ret_from_fork_asm+0x1a/0x30
|
||||
# </TASK>
|
||||
# Modules linked in: vkms
|
||||
# CR2: 0000000000000018
|
||||
# ---[ end trace 0000000000000000 ]---
|
||||
# RIP: 0010:compose_active_planes+0x344/0x4e0 [vkms]
|
||||
# Code: 6a 34 0f 8e 91 fe ff ff 44 89 ea 48 8d 7c 24 48 e8 71 f0 ff ff 4b 8b 04 fc 48 8b 4c 24 50 48 8b 7c 24 40 48 8b 80 48 01 00 00 <48> 63 70 18 8b 40 20 48 89 f2 48 c1 e6 03 29 d0 48 8b 54 24 48 48
|
||||
# RSP: 0018:ffffa437800ebd58 EFLAGS: 00010282
|
||||
# RAX: 0000000000000000 RBX: 0000000000000002 RCX: ffffa0e841904000
|
||||
# RDX: 00000000000000ff RSI: ffffa0e841905ff8 RDI: ffffa0e841902000
|
||||
# RBP: 0000000000000000 R08: ffffa0e84158a600 R09: 00000000000003ff
|
||||
# R10: 0000000078b2bcd2 R11: 00000000278b2bcd R12: ffffa0e84870fc60
|
||||
# R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
|
||||
# FS: 0000000000000000(0000) GS:ffffa0e86bc00000(0000) knlGS:0000000000000000
|
||||
# CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
|
||||
# CR2: 0000000000000018 CR3: 0000000101710000 CR4: 0000000000350ef0
|
||||
# vkms_vblank_simulate: vblank timer overrun
|
||||
|
||||
# Skip driver specific tests
|
||||
^amdgpu.*
|
||||
^msm.*
|
||||
|
66
drivers/gpu/drm/drm_client_setup.c
Normal file
66
drivers/gpu/drm/drm_client_setup.c
Normal file
@ -0,0 +1,66 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_device.h>
|
||||
#include <drm/drm_fbdev_client.h>
|
||||
#include <drm/drm_fourcc.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
/**
|
||||
* drm_client_setup() - Setup in-kernel DRM clients
|
||||
* @dev: DRM device
|
||||
* @format: Preferred pixel format for the device. Use NULL, unless
|
||||
* there is clearly a driver-preferred format.
|
||||
*
|
||||
* This function sets up the in-kernel DRM clients. Restore, hotplug
|
||||
* events and teardown are all taken care of.
|
||||
*
|
||||
* Drivers should call drm_client_setup() after registering the new
|
||||
* DRM device with drm_dev_register(). This function is safe to call
|
||||
* even when there are no connectors present. Setup will be retried
|
||||
* on the next hotplug event.
|
||||
*
|
||||
* The clients are destroyed by drm_dev_unregister().
|
||||
*/
|
||||
void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = drm_fbdev_client_setup(dev, format);
|
||||
if (ret)
|
||||
drm_warn(dev, "Failed to set up DRM client; error %d\n", ret);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_client_setup);
|
||||
|
||||
/**
|
||||
* drm_client_setup_with_fourcc() - Setup in-kernel DRM clients for color mode
|
||||
* @dev: DRM device
|
||||
* @fourcc: Preferred pixel format as 4CC code for the device
|
||||
*
|
||||
* This function sets up the in-kernel DRM clients. It is equivalent
|
||||
* to drm_client_setup(), but expects a 4CC code as second argument.
|
||||
*/
|
||||
void drm_client_setup_with_fourcc(struct drm_device *dev, u32 fourcc)
|
||||
{
|
||||
drm_client_setup(dev, drm_format_info(fourcc));
|
||||
}
|
||||
EXPORT_SYMBOL(drm_client_setup_with_fourcc);
|
||||
|
||||
/**
|
||||
* drm_client_setup_with_color_mode() - Setup in-kernel DRM clients for color mode
|
||||
* @dev: DRM device
|
||||
* @color_mode: Preferred color mode for the device
|
||||
*
|
||||
* This function sets up the in-kernel DRM clients. It is equivalent
|
||||
* to drm_client_setup(), but expects a color mode as second argument.
|
||||
*
|
||||
* Do not use this function in new drivers. Prefer drm_client_setup() with a
|
||||
* format of NULL.
|
||||
*/
|
||||
void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode)
|
||||
{
|
||||
u32 fourcc = drm_driver_color_mode_format(dev, color_mode);
|
||||
|
||||
drm_client_setup_with_fourcc(dev, fourcc);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_client_setup_with_color_mode);
|
@ -492,8 +492,8 @@ EXPORT_SYMBOL(drm_fb_helper_init);
|
||||
* @fb_helper: driver-allocated fbdev helper
|
||||
*
|
||||
* A helper to alloc fb_info and the member cmap. Called by the driver
|
||||
* within the fb_probe fb_helper callback function. Drivers do not
|
||||
* need to release the allocated fb_info structure themselves, this is
|
||||
* within the struct &drm_driver.fbdev_probe callback function. Drivers do
|
||||
* not need to release the allocated fb_info structure themselves, this is
|
||||
* automatically done when calling drm_fb_helper_fini().
|
||||
*
|
||||
* RETURNS:
|
||||
@ -554,7 +554,7 @@ EXPORT_SYMBOL(drm_fb_helper_release_info);
|
||||
|
||||
/**
|
||||
* drm_fb_helper_unregister_info - unregister fb_info framebuffer device
|
||||
* @fb_helper: driver-allocated fbdev helper, can be NULL
|
||||
* @fb_helper: driver-allocated fbdev helper, must not be NULL
|
||||
*
|
||||
* A wrapper around unregister_framebuffer, to release the fb_info
|
||||
* framebuffer device. This must be called before releasing all resources for
|
||||
@ -562,8 +562,12 @@ EXPORT_SYMBOL(drm_fb_helper_release_info);
|
||||
*/
|
||||
void drm_fb_helper_unregister_info(struct drm_fb_helper *fb_helper)
|
||||
{
|
||||
if (fb_helper && fb_helper->info)
|
||||
unregister_framebuffer(fb_helper->info);
|
||||
struct fb_info *info = fb_helper->info;
|
||||
struct device *dev = info->device;
|
||||
|
||||
if (dev_is_pci(dev))
|
||||
vga_switcheroo_client_fb_set(to_pci_dev(dev), NULL);
|
||||
unregister_framebuffer(fb_helper->info);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fb_helper_unregister_info);
|
||||
|
||||
@ -1441,67 +1445,27 @@ unlock:
|
||||
EXPORT_SYMBOL(drm_fb_helper_pan_display);
|
||||
|
||||
static uint32_t drm_fb_helper_find_format(struct drm_fb_helper *fb_helper, const uint32_t *formats,
|
||||
size_t format_count, uint32_t bpp, uint32_t depth)
|
||||
size_t format_count, unsigned int color_mode)
|
||||
{
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
uint32_t format;
|
||||
size_t i;
|
||||
|
||||
/*
|
||||
* Do not consider YUV or other complicated formats
|
||||
* for framebuffers. This means only legacy formats
|
||||
* are supported (fmt->depth is a legacy field), but
|
||||
* the framebuffer emulation can only deal with such
|
||||
* formats, specifically RGB/BGA formats.
|
||||
*/
|
||||
format = drm_mode_legacy_fb_format(bpp, depth);
|
||||
if (!format)
|
||||
goto err;
|
||||
format = drm_driver_color_mode_format(dev, color_mode);
|
||||
if (!format) {
|
||||
drm_info(dev, "unsupported color mode of %d\n", color_mode);
|
||||
return DRM_FORMAT_INVALID;
|
||||
}
|
||||
|
||||
for (i = 0; i < format_count; ++i) {
|
||||
if (formats[i] == format)
|
||||
return format;
|
||||
}
|
||||
|
||||
err:
|
||||
/* We found nothing. */
|
||||
drm_warn(dev, "bpp/depth value of %u/%u not supported\n", bpp, depth);
|
||||
drm_warn(dev, "format %p4cc not supported\n", &format);
|
||||
|
||||
return DRM_FORMAT_INVALID;
|
||||
}
|
||||
|
||||
static uint32_t drm_fb_helper_find_color_mode_format(struct drm_fb_helper *fb_helper,
|
||||
const uint32_t *formats, size_t format_count,
|
||||
unsigned int color_mode)
|
||||
{
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
uint32_t bpp, depth;
|
||||
|
||||
switch (color_mode) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 4:
|
||||
case 8:
|
||||
case 16:
|
||||
case 24:
|
||||
bpp = depth = color_mode;
|
||||
break;
|
||||
case 15:
|
||||
bpp = 16;
|
||||
depth = 15;
|
||||
break;
|
||||
case 32:
|
||||
bpp = 32;
|
||||
depth = 24;
|
||||
break;
|
||||
default:
|
||||
drm_info(dev, "unsupported color mode of %d\n", color_mode);
|
||||
return DRM_FORMAT_INVALID;
|
||||
}
|
||||
|
||||
return drm_fb_helper_find_format(fb_helper, formats, format_count, bpp, depth);
|
||||
}
|
||||
|
||||
static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
@ -1531,10 +1495,10 @@ static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
|
||||
if (!cmdline_mode->bpp_specified)
|
||||
continue;
|
||||
|
||||
surface_format = drm_fb_helper_find_color_mode_format(fb_helper,
|
||||
plane->format_types,
|
||||
plane->format_count,
|
||||
cmdline_mode->bpp);
|
||||
surface_format = drm_fb_helper_find_format(fb_helper,
|
||||
plane->format_types,
|
||||
plane->format_count,
|
||||
cmdline_mode->bpp);
|
||||
if (surface_format != DRM_FORMAT_INVALID)
|
||||
break; /* found supported format */
|
||||
}
|
||||
@ -1544,10 +1508,10 @@ static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
|
||||
break; /* found supported format */
|
||||
|
||||
/* try preferred color mode */
|
||||
surface_format = drm_fb_helper_find_color_mode_format(fb_helper,
|
||||
plane->format_types,
|
||||
plane->format_count,
|
||||
fb_helper->preferred_bpp);
|
||||
surface_format = drm_fb_helper_find_format(fb_helper,
|
||||
plane->format_types,
|
||||
plane->format_count,
|
||||
fb_helper->preferred_bpp);
|
||||
if (surface_format != DRM_FORMAT_INVALID)
|
||||
break; /* found supported format */
|
||||
}
|
||||
@ -1648,13 +1612,14 @@ static int drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
|
||||
|
||||
/*
|
||||
* Allocates the backing storage and sets up the fbdev info structure through
|
||||
* the ->fb_probe callback.
|
||||
* the ->fbdev_probe callback.
|
||||
*/
|
||||
static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
|
||||
{
|
||||
struct drm_client_dev *client = &fb_helper->client;
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
struct drm_fb_helper_surface_size sizes;
|
||||
struct fb_info *info;
|
||||
int ret;
|
||||
|
||||
ret = drm_fb_helper_find_sizes(fb_helper, &sizes);
|
||||
@ -1666,15 +1631,20 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
|
||||
}
|
||||
|
||||
/* push down into drivers */
|
||||
ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes);
|
||||
if (dev->driver->fbdev_probe)
|
||||
ret = dev->driver->fbdev_probe(fb_helper, &sizes);
|
||||
else if (fb_helper->funcs)
|
||||
ret = fb_helper->funcs->fb_probe(fb_helper, &sizes);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
strcpy(fb_helper->fb->comm, "[fbcon]");
|
||||
|
||||
info = fb_helper->info;
|
||||
|
||||
/* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */
|
||||
if (dev_is_pci(dev->dev))
|
||||
vga_switcheroo_client_fb_set(to_pci_dev(dev->dev), fb_helper->info);
|
||||
if (dev_is_pci(info->device))
|
||||
vga_switcheroo_client_fb_set(to_pci_dev(info->device), info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1738,7 +1708,7 @@ static void drm_fb_helper_fill_var(struct fb_info *info,
|
||||
* instance and the drm framebuffer allocated in &drm_fb_helper.fb.
|
||||
*
|
||||
* Drivers should call this (or their equivalent setup code) from their
|
||||
* &drm_fb_helper_funcs.fb_probe callback after having allocated the fbdev
|
||||
* &drm_driver.fbdev_probe callback after having allocated the fbdev
|
||||
* backing storage framebuffer.
|
||||
*/
|
||||
void drm_fb_helper_fill_info(struct fb_info *info,
|
||||
@ -1894,7 +1864,7 @@ __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper)
|
||||
* Note that this also registers the fbdev and so allows userspace to call into
|
||||
* the driver through the fbdev interfaces.
|
||||
*
|
||||
* This function will call down into the &drm_fb_helper_funcs.fb_probe callback
|
||||
* This function will call down into the &drm_driver.fbdev_probe callback
|
||||
* to let the driver allocate and initialize the fbdev info structure and the
|
||||
* drm framebuffer used to back the fbdev. drm_fb_helper_fill_info() is provided
|
||||
* as a helper to setup simple default values for the fbdev info structure.
|
||||
|
141
drivers/gpu/drm/drm_fbdev_client.c
Normal file
141
drivers/gpu/drm/drm_fbdev_client.c
Normal file
@ -0,0 +1,141 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <drm/drm_client.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_client.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#include <drm/drm_fourcc.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
/*
|
||||
* struct drm_client_funcs
|
||||
*/
|
||||
|
||||
static void drm_fbdev_client_unregister(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
|
||||
if (fb_helper->info) {
|
||||
drm_fb_helper_unregister_info(fb_helper);
|
||||
} else {
|
||||
drm_client_release(&fb_helper->client);
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
}
|
||||
|
||||
static int drm_fbdev_client_restore(struct drm_client_dev *client)
|
||||
{
|
||||
drm_fb_helper_lastclose(client->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int drm_fbdev_client_hotplug(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
struct drm_device *dev = client->dev;
|
||||
int ret;
|
||||
|
||||
if (dev->fb_helper)
|
||||
return drm_fb_helper_hotplug_event(dev->fb_helper);
|
||||
|
||||
ret = drm_fb_helper_init(dev, fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_err;
|
||||
|
||||
if (!drm_drv_uses_atomic_modeset(dev))
|
||||
drm_helper_disable_unused_functions(dev);
|
||||
|
||||
ret = drm_fb_helper_initial_config(fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_fb_helper_fini;
|
||||
|
||||
return 0;
|
||||
|
||||
err_drm_fb_helper_fini:
|
||||
drm_fb_helper_fini(fb_helper);
|
||||
err_drm_err:
|
||||
drm_err(dev, "fbdev: Failed to setup emulation (ret=%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_client_funcs drm_fbdev_client_funcs = {
|
||||
.owner = THIS_MODULE,
|
||||
.unregister = drm_fbdev_client_unregister,
|
||||
.restore = drm_fbdev_client_restore,
|
||||
.hotplug = drm_fbdev_client_hotplug,
|
||||
};
|
||||
|
||||
/**
|
||||
* drm_fbdev_client_setup() - Setup fbdev emulation
|
||||
* @dev: DRM device
|
||||
* @format: Preferred color format for the device. DRM_FORMAT_XRGB8888
|
||||
* is used if this is zero.
|
||||
*
|
||||
* This function sets up fbdev emulation. Restore, hotplug events and
|
||||
* teardown are all taken care of. Drivers that do suspend/resume need
|
||||
* to call drm_fb_helper_set_suspend_unlocked() themselves. Simple
|
||||
* drivers might use drm_mode_config_helper_suspend().
|
||||
*
|
||||
* This function is safe to call even when there are no connectors present.
|
||||
* Setup will be retried on the next hotplug event.
|
||||
*
|
||||
* The fbdev client is destroyed by drm_dev_unregister().
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success, or a negative errno code otherwise.
|
||||
*/
|
||||
int drm_fbdev_client_setup(struct drm_device *dev, const struct drm_format_info *format)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper;
|
||||
unsigned int color_mode;
|
||||
int ret;
|
||||
|
||||
/* TODO: Use format info throughout DRM */
|
||||
if (format) {
|
||||
unsigned int bpp = drm_format_info_bpp(format, 0);
|
||||
|
||||
switch (bpp) {
|
||||
case 16:
|
||||
color_mode = format->depth; // could also be 15
|
||||
break;
|
||||
default:
|
||||
color_mode = bpp;
|
||||
}
|
||||
} else {
|
||||
switch (dev->mode_config.preferred_depth) {
|
||||
case 0:
|
||||
case 24:
|
||||
color_mode = 32;
|
||||
break;
|
||||
default:
|
||||
color_mode = dev->mode_config.preferred_depth;
|
||||
}
|
||||
}
|
||||
|
||||
drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
|
||||
drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
|
||||
|
||||
fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
|
||||
if (!fb_helper)
|
||||
return -ENOMEM;
|
||||
drm_fb_helper_prepare(dev, fb_helper, color_mode, NULL);
|
||||
|
||||
ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs);
|
||||
if (ret) {
|
||||
drm_err(dev, "Failed to register client: %d\n", ret);
|
||||
goto err_drm_client_init;
|
||||
}
|
||||
|
||||
drm_client_register(&fb_helper->client);
|
||||
|
||||
return 0;
|
||||
|
||||
err_drm_client_init:
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fbdev_client_setup);
|
@ -2,15 +2,13 @@
|
||||
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_fb_dma_helper.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#include <drm/drm_framebuffer.h>
|
||||
#include <drm/drm_gem_dma_helper.h>
|
||||
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
|
||||
/*
|
||||
* struct fb_ops
|
||||
*/
|
||||
@ -102,8 +100,35 @@ static const struct fb_ops drm_fbdev_dma_deferred_fb_ops = {
|
||||
* struct drm_fb_helper
|
||||
*/
|
||||
|
||||
static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
|
||||
struct drm_clip_rect *clip)
|
||||
{
|
||||
struct drm_device *dev = helper->dev;
|
||||
int ret;
|
||||
|
||||
/* Call damage handlers only if necessary */
|
||||
if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
|
||||
return 0;
|
||||
|
||||
if (helper->fb->funcs->dirty) {
|
||||
ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
|
||||
if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
|
||||
.fb_dirty = drm_fbdev_dma_helper_fb_dirty,
|
||||
};
|
||||
|
||||
/*
|
||||
* struct drm_fb_helper
|
||||
*/
|
||||
|
||||
int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
struct drm_client_dev *client = &fb_helper->client;
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
@ -147,6 +172,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
|
||||
goto err_drm_client_buffer_delete;
|
||||
}
|
||||
|
||||
fb_helper->funcs = &drm_fbdev_dma_helper_funcs;
|
||||
fb_helper->buffer = buffer;
|
||||
fb_helper->fb = fb;
|
||||
|
||||
@ -210,136 +236,4 @@ err_drm_client_buffer_delete:
|
||||
drm_client_framebuffer_delete(buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
|
||||
struct drm_clip_rect *clip)
|
||||
{
|
||||
struct drm_device *dev = helper->dev;
|
||||
int ret;
|
||||
|
||||
/* Call damage handlers only if necessary */
|
||||
if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
|
||||
return 0;
|
||||
|
||||
if (helper->fb->funcs->dirty) {
|
||||
ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
|
||||
if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
|
||||
.fb_probe = drm_fbdev_dma_helper_fb_probe,
|
||||
.fb_dirty = drm_fbdev_dma_helper_fb_dirty,
|
||||
};
|
||||
|
||||
/*
|
||||
* struct drm_client_funcs
|
||||
*/
|
||||
|
||||
static void drm_fbdev_dma_client_unregister(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
|
||||
if (fb_helper->info) {
|
||||
drm_fb_helper_unregister_info(fb_helper);
|
||||
} else {
|
||||
drm_client_release(&fb_helper->client);
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
}
|
||||
|
||||
static int drm_fbdev_dma_client_restore(struct drm_client_dev *client)
|
||||
{
|
||||
drm_fb_helper_lastclose(client->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int drm_fbdev_dma_client_hotplug(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
struct drm_device *dev = client->dev;
|
||||
int ret;
|
||||
|
||||
if (dev->fb_helper)
|
||||
return drm_fb_helper_hotplug_event(dev->fb_helper);
|
||||
|
||||
ret = drm_fb_helper_init(dev, fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_err;
|
||||
|
||||
if (!drm_drv_uses_atomic_modeset(dev))
|
||||
drm_helper_disable_unused_functions(dev);
|
||||
|
||||
ret = drm_fb_helper_initial_config(fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_fb_helper_fini;
|
||||
|
||||
return 0;
|
||||
|
||||
err_drm_fb_helper_fini:
|
||||
drm_fb_helper_fini(fb_helper);
|
||||
err_drm_err:
|
||||
drm_err(dev, "fbdev-dma: Failed to setup generic emulation (ret=%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_client_funcs drm_fbdev_dma_client_funcs = {
|
||||
.owner = THIS_MODULE,
|
||||
.unregister = drm_fbdev_dma_client_unregister,
|
||||
.restore = drm_fbdev_dma_client_restore,
|
||||
.hotplug = drm_fbdev_dma_client_hotplug,
|
||||
};
|
||||
|
||||
/**
|
||||
* drm_fbdev_dma_setup() - Setup fbdev emulation for GEM DMA helpers
|
||||
* @dev: DRM device
|
||||
* @preferred_bpp: Preferred bits per pixel for the device.
|
||||
* 32 is used if this is zero.
|
||||
*
|
||||
* This function sets up fbdev emulation for GEM DMA drivers that support
|
||||
* dumb buffers with a virtual address and that can be mmap'ed.
|
||||
* drm_fbdev_dma_setup() shall be called after the DRM driver registered
|
||||
* the new DRM device with drm_dev_register().
|
||||
*
|
||||
* Restore, hotplug events and teardown are all taken care of. Drivers that do
|
||||
* suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
|
||||
* Simple drivers might use drm_mode_config_helper_suspend().
|
||||
*
|
||||
* This function is safe to call even when there are no connectors present.
|
||||
* Setup will be retried on the next hotplug event.
|
||||
*
|
||||
* The fbdev is destroyed by drm_dev_unregister().
|
||||
*/
|
||||
void drm_fbdev_dma_setup(struct drm_device *dev, unsigned int preferred_bpp)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper;
|
||||
int ret;
|
||||
|
||||
drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
|
||||
drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
|
||||
|
||||
fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
|
||||
if (!fb_helper)
|
||||
return;
|
||||
drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_dma_helper_funcs);
|
||||
|
||||
ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_dma_client_funcs);
|
||||
if (ret) {
|
||||
drm_err(dev, "Failed to register client: %d\n", ret);
|
||||
goto err_drm_client_init;
|
||||
}
|
||||
|
||||
drm_client_register(&fb_helper->client);
|
||||
|
||||
return;
|
||||
|
||||
err_drm_client_init:
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fbdev_dma_setup);
|
||||
EXPORT_SYMBOL(drm_fbdev_dma_driver_fbdev_probe);
|
||||
|
@ -2,15 +2,13 @@
|
||||
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_shmem.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#include <drm/drm_framebuffer.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_gem_shmem_helper.h>
|
||||
|
||||
#include <drm/drm_fbdev_shmem.h>
|
||||
|
||||
/*
|
||||
* struct fb_ops
|
||||
*/
|
||||
@ -105,8 +103,35 @@ static struct page *drm_fbdev_shmem_get_page(struct fb_info *info, unsigned long
|
||||
* struct drm_fb_helper
|
||||
*/
|
||||
|
||||
static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper,
|
||||
struct drm_clip_rect *clip)
|
||||
{
|
||||
struct drm_device *dev = helper->dev;
|
||||
int ret;
|
||||
|
||||
/* Call damage handlers only if necessary */
|
||||
if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
|
||||
return 0;
|
||||
|
||||
if (helper->fb->funcs->dirty) {
|
||||
ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
|
||||
if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = {
|
||||
.fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
|
||||
};
|
||||
|
||||
/*
|
||||
* struct drm_driver
|
||||
*/
|
||||
|
||||
int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
struct drm_client_dev *client = &fb_helper->client;
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
@ -139,6 +164,7 @@ static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
|
||||
goto err_drm_client_buffer_delete;
|
||||
}
|
||||
|
||||
fb_helper->funcs = &drm_fbdev_shmem_helper_funcs;
|
||||
fb_helper->buffer = buffer;
|
||||
fb_helper->fb = fb;
|
||||
|
||||
@ -182,136 +208,4 @@ err_drm_client_buffer_delete:
|
||||
drm_client_framebuffer_delete(buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper,
|
||||
struct drm_clip_rect *clip)
|
||||
{
|
||||
struct drm_device *dev = helper->dev;
|
||||
int ret;
|
||||
|
||||
/* Call damage handlers only if necessary */
|
||||
if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
|
||||
return 0;
|
||||
|
||||
if (helper->fb->funcs->dirty) {
|
||||
ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
|
||||
if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = {
|
||||
.fb_probe = drm_fbdev_shmem_helper_fb_probe,
|
||||
.fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
|
||||
};
|
||||
|
||||
/*
|
||||
* struct drm_client_funcs
|
||||
*/
|
||||
|
||||
static void drm_fbdev_shmem_client_unregister(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
|
||||
if (fb_helper->info) {
|
||||
drm_fb_helper_unregister_info(fb_helper);
|
||||
} else {
|
||||
drm_client_release(&fb_helper->client);
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
}
|
||||
|
||||
static int drm_fbdev_shmem_client_restore(struct drm_client_dev *client)
|
||||
{
|
||||
drm_fb_helper_lastclose(client->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int drm_fbdev_shmem_client_hotplug(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
struct drm_device *dev = client->dev;
|
||||
int ret;
|
||||
|
||||
if (dev->fb_helper)
|
||||
return drm_fb_helper_hotplug_event(dev->fb_helper);
|
||||
|
||||
ret = drm_fb_helper_init(dev, fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_err;
|
||||
|
||||
if (!drm_drv_uses_atomic_modeset(dev))
|
||||
drm_helper_disable_unused_functions(dev);
|
||||
|
||||
ret = drm_fb_helper_initial_config(fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_fb_helper_fini;
|
||||
|
||||
return 0;
|
||||
|
||||
err_drm_fb_helper_fini:
|
||||
drm_fb_helper_fini(fb_helper);
|
||||
err_drm_err:
|
||||
drm_err(dev, "fbdev-shmem: Failed to setup emulation (ret=%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_client_funcs drm_fbdev_shmem_client_funcs = {
|
||||
.owner = THIS_MODULE,
|
||||
.unregister = drm_fbdev_shmem_client_unregister,
|
||||
.restore = drm_fbdev_shmem_client_restore,
|
||||
.hotplug = drm_fbdev_shmem_client_hotplug,
|
||||
};
|
||||
|
||||
/**
|
||||
* drm_fbdev_shmem_setup() - Setup fbdev emulation for GEM SHMEM helpers
|
||||
* @dev: DRM device
|
||||
* @preferred_bpp: Preferred bits per pixel for the device.
|
||||
* 32 is used if this is zero.
|
||||
*
|
||||
* This function sets up fbdev emulation for GEM DMA drivers that support
|
||||
* dumb buffers with a virtual address and that can be mmap'ed.
|
||||
* drm_fbdev_shmem_setup() shall be called after the DRM driver registered
|
||||
* the new DRM device with drm_dev_register().
|
||||
*
|
||||
* Restore, hotplug events and teardown are all taken care of. Drivers that do
|
||||
* suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
|
||||
* Simple drivers might use drm_mode_config_helper_suspend().
|
||||
*
|
||||
* This function is safe to call even when there are no connectors present.
|
||||
* Setup will be retried on the next hotplug event.
|
||||
*
|
||||
* The fbdev is destroyed by drm_dev_unregister().
|
||||
*/
|
||||
void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper;
|
||||
int ret;
|
||||
|
||||
drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
|
||||
drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
|
||||
|
||||
fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
|
||||
if (!fb_helper)
|
||||
return;
|
||||
drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_shmem_helper_funcs);
|
||||
|
||||
ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_shmem_client_funcs);
|
||||
if (ret) {
|
||||
drm_err(dev, "Failed to register client: %d\n", ret);
|
||||
goto err_drm_client_init;
|
||||
}
|
||||
|
||||
drm_client_register(&fb_helper->client);
|
||||
|
||||
return;
|
||||
|
||||
err_drm_client_init:
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fbdev_shmem_setup);
|
||||
EXPORT_SYMBOL(drm_fbdev_shmem_driver_fbdev_probe);
|
||||
|
@ -65,79 +65,6 @@ static const struct fb_ops drm_fbdev_ttm_fb_ops = {
|
||||
.fb_destroy = drm_fbdev_ttm_fb_destroy,
|
||||
};
|
||||
|
||||
/*
|
||||
* This function uses the client API to create a framebuffer backed by a dumb buffer.
|
||||
*/
|
||||
static int drm_fbdev_ttm_helper_fb_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
struct drm_client_dev *client = &fb_helper->client;
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
struct drm_client_buffer *buffer;
|
||||
struct fb_info *info;
|
||||
size_t screen_size;
|
||||
void *screen_buffer;
|
||||
u32 format;
|
||||
int ret;
|
||||
|
||||
drm_dbg_kms(dev, "surface width(%d), height(%d) and bpp(%d)\n",
|
||||
sizes->surface_width, sizes->surface_height,
|
||||
sizes->surface_bpp);
|
||||
|
||||
format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
|
||||
sizes->surface_depth);
|
||||
buffer = drm_client_framebuffer_create(client, sizes->surface_width,
|
||||
sizes->surface_height, format);
|
||||
if (IS_ERR(buffer))
|
||||
return PTR_ERR(buffer);
|
||||
|
||||
fb_helper->buffer = buffer;
|
||||
fb_helper->fb = buffer->fb;
|
||||
|
||||
screen_size = buffer->gem->size;
|
||||
screen_buffer = vzalloc(screen_size);
|
||||
if (!screen_buffer) {
|
||||
ret = -ENOMEM;
|
||||
goto err_drm_client_framebuffer_delete;
|
||||
}
|
||||
|
||||
info = drm_fb_helper_alloc_info(fb_helper);
|
||||
if (IS_ERR(info)) {
|
||||
ret = PTR_ERR(info);
|
||||
goto err_vfree;
|
||||
}
|
||||
|
||||
drm_fb_helper_fill_info(info, fb_helper, sizes);
|
||||
|
||||
info->fbops = &drm_fbdev_ttm_fb_ops;
|
||||
|
||||
/* screen */
|
||||
info->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
|
||||
info->screen_buffer = screen_buffer;
|
||||
info->fix.smem_len = screen_size;
|
||||
|
||||
/* deferred I/O */
|
||||
fb_helper->fbdefio.delay = HZ / 20;
|
||||
fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
|
||||
|
||||
info->fbdefio = &fb_helper->fbdefio;
|
||||
ret = fb_deferred_io_init(info);
|
||||
if (ret)
|
||||
goto err_drm_fb_helper_release_info;
|
||||
|
||||
return 0;
|
||||
|
||||
err_drm_fb_helper_release_info:
|
||||
drm_fb_helper_release_info(fb_helper);
|
||||
err_vfree:
|
||||
vfree(screen_buffer);
|
||||
err_drm_client_framebuffer_delete:
|
||||
fb_helper->fb = NULL;
|
||||
fb_helper->buffer = NULL;
|
||||
drm_client_framebuffer_delete(buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void drm_fbdev_ttm_damage_blit_real(struct drm_fb_helper *fb_helper,
|
||||
struct drm_clip_rect *clip,
|
||||
struct iosys_map *dst)
|
||||
@ -236,115 +163,81 @@ static int drm_fbdev_ttm_helper_fb_dirty(struct drm_fb_helper *helper,
|
||||
}
|
||||
|
||||
static const struct drm_fb_helper_funcs drm_fbdev_ttm_helper_funcs = {
|
||||
.fb_probe = drm_fbdev_ttm_helper_fb_probe,
|
||||
.fb_dirty = drm_fbdev_ttm_helper_fb_dirty,
|
||||
};
|
||||
|
||||
static void drm_fbdev_ttm_client_unregister(struct drm_client_dev *client)
|
||||
/*
|
||||
* struct drm_driver
|
||||
*/
|
||||
|
||||
int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
|
||||
if (fb_helper->info) {
|
||||
drm_fb_helper_unregister_info(fb_helper);
|
||||
} else {
|
||||
drm_client_release(&fb_helper->client);
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
}
|
||||
|
||||
static int drm_fbdev_ttm_client_restore(struct drm_client_dev *client)
|
||||
{
|
||||
drm_fb_helper_lastclose(client->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int drm_fbdev_ttm_client_hotplug(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
struct drm_device *dev = client->dev;
|
||||
struct drm_client_dev *client = &fb_helper->client;
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
struct drm_client_buffer *buffer;
|
||||
struct fb_info *info;
|
||||
size_t screen_size;
|
||||
void *screen_buffer;
|
||||
u32 format;
|
||||
int ret;
|
||||
|
||||
if (dev->fb_helper)
|
||||
return drm_fb_helper_hotplug_event(dev->fb_helper);
|
||||
drm_dbg_kms(dev, "surface width(%d), height(%d) and bpp(%d)\n",
|
||||
sizes->surface_width, sizes->surface_height,
|
||||
sizes->surface_bpp);
|
||||
|
||||
ret = drm_fb_helper_init(dev, fb_helper);
|
||||
format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
|
||||
sizes->surface_depth);
|
||||
buffer = drm_client_framebuffer_create(client, sizes->surface_width,
|
||||
sizes->surface_height, format);
|
||||
if (IS_ERR(buffer))
|
||||
return PTR_ERR(buffer);
|
||||
|
||||
fb_helper->funcs = &drm_fbdev_ttm_helper_funcs;
|
||||
fb_helper->buffer = buffer;
|
||||
fb_helper->fb = buffer->fb;
|
||||
|
||||
screen_size = buffer->gem->size;
|
||||
screen_buffer = vzalloc(screen_size);
|
||||
if (!screen_buffer) {
|
||||
ret = -ENOMEM;
|
||||
goto err_drm_client_framebuffer_delete;
|
||||
}
|
||||
|
||||
info = drm_fb_helper_alloc_info(fb_helper);
|
||||
if (IS_ERR(info)) {
|
||||
ret = PTR_ERR(info);
|
||||
goto err_vfree;
|
||||
}
|
||||
|
||||
drm_fb_helper_fill_info(info, fb_helper, sizes);
|
||||
|
||||
info->fbops = &drm_fbdev_ttm_fb_ops;
|
||||
|
||||
/* screen */
|
||||
info->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
|
||||
info->screen_buffer = screen_buffer;
|
||||
info->fix.smem_len = screen_size;
|
||||
|
||||
/* deferred I/O */
|
||||
fb_helper->fbdefio.delay = HZ / 20;
|
||||
fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
|
||||
|
||||
info->fbdefio = &fb_helper->fbdefio;
|
||||
ret = fb_deferred_io_init(info);
|
||||
if (ret)
|
||||
goto err_drm_err;
|
||||
|
||||
if (!drm_drv_uses_atomic_modeset(dev))
|
||||
drm_helper_disable_unused_functions(dev);
|
||||
|
||||
ret = drm_fb_helper_initial_config(fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_fb_helper_fini;
|
||||
goto err_drm_fb_helper_release_info;
|
||||
|
||||
return 0;
|
||||
|
||||
err_drm_fb_helper_fini:
|
||||
drm_fb_helper_fini(fb_helper);
|
||||
err_drm_err:
|
||||
drm_err(dev, "fbdev: Failed to setup emulation (ret=%d)\n", ret);
|
||||
err_drm_fb_helper_release_info:
|
||||
drm_fb_helper_release_info(fb_helper);
|
||||
err_vfree:
|
||||
vfree(screen_buffer);
|
||||
err_drm_client_framebuffer_delete:
|
||||
fb_helper->fb = NULL;
|
||||
fb_helper->buffer = NULL;
|
||||
drm_client_framebuffer_delete(buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_client_funcs drm_fbdev_ttm_client_funcs = {
|
||||
.owner = THIS_MODULE,
|
||||
.unregister = drm_fbdev_ttm_client_unregister,
|
||||
.restore = drm_fbdev_ttm_client_restore,
|
||||
.hotplug = drm_fbdev_ttm_client_hotplug,
|
||||
};
|
||||
|
||||
/**
|
||||
* drm_fbdev_ttm_setup() - Setup fbdev emulation for TTM-based drivers
|
||||
* @dev: DRM device
|
||||
* @preferred_bpp: Preferred bits per pixel for the device.
|
||||
*
|
||||
* This function sets up fbdev emulation for TTM-based drivers that support
|
||||
* dumb buffers with a virtual address and that can be mmap'ed.
|
||||
* drm_fbdev_ttm_setup() shall be called after the DRM driver registered
|
||||
* the new DRM device with drm_dev_register().
|
||||
*
|
||||
* Restore, hotplug events and teardown are all taken care of. Drivers that do
|
||||
* suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
|
||||
* Simple drivers might use drm_mode_config_helper_suspend().
|
||||
*
|
||||
* In order to provide fixed mmap-able memory ranges, fbdev emulation
|
||||
* uses a shadow buffer in system memory. The implementation blits the shadow
|
||||
* fbdev buffer onto the real buffer in regular intervals.
|
||||
*
|
||||
* This function is safe to call even when there are no connectors present.
|
||||
* Setup will be retried on the next hotplug event.
|
||||
*
|
||||
* The fbdev is destroyed by drm_dev_unregister().
|
||||
*/
|
||||
void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper;
|
||||
int ret;
|
||||
|
||||
drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
|
||||
drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
|
||||
|
||||
fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
|
||||
if (!fb_helper)
|
||||
return;
|
||||
drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_ttm_helper_funcs);
|
||||
|
||||
ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_ttm_client_funcs);
|
||||
if (ret) {
|
||||
drm_err(dev, "Failed to register client: %d\n", ret);
|
||||
goto err_drm_client_init;
|
||||
}
|
||||
|
||||
drm_client_register(&fb_helper->client);
|
||||
|
||||
return;
|
||||
|
||||
err_drm_client_init:
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fbdev_ttm_setup);
|
||||
EXPORT_SYMBOL(drm_fbdev_ttm_driver_fbdev_probe);
|
||||
|
@ -36,7 +36,6 @@
|
||||
* @depth: bit depth per pixel
|
||||
*
|
||||
* Computes a drm fourcc pixel format code for the given @bpp/@depth values.
|
||||
* Useful in fbdev emulation code, since that deals in those values.
|
||||
*/
|
||||
uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
|
||||
{
|
||||
@ -140,6 +139,35 @@ uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL(drm_driver_legacy_fb_format);
|
||||
|
||||
/**
|
||||
* drm_driver_color_mode_format - Compute DRM 4CC code from color mode
|
||||
* @dev: DRM device
|
||||
* @color_mode: command-line color mode
|
||||
*
|
||||
* Computes a DRM 4CC pixel format code for the given color mode using
|
||||
* drm_driver_color_mode(). The color mode is in the format used and the
|
||||
* kernel command line. It specifies the number of bits per pixel
|
||||
* and color depth in a single value.
|
||||
*
|
||||
* Useful in fbdev emulation code, since that deals in those values. The
|
||||
* helper does not consider YUV or other complicated formats. This means
|
||||
* only legacy formats are supported (fmt->depth is a legacy field), but
|
||||
* the framebuffer emulation can only deal with such formats, specifically
|
||||
* RGB/BGA formats.
|
||||
*/
|
||||
uint32_t drm_driver_color_mode_format(struct drm_device *dev, unsigned int color_mode)
|
||||
{
|
||||
switch (color_mode) {
|
||||
case 15:
|
||||
return drm_driver_legacy_fb_format(dev, 16, 15);
|
||||
case 32:
|
||||
return drm_driver_legacy_fb_format(dev, 32, 24);
|
||||
default:
|
||||
return drm_driver_legacy_fb_format(dev, color_mode, color_mode);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_driver_color_mode_format);
|
||||
|
||||
/*
|
||||
* Internal function to query information for a given format. See
|
||||
* drm_format_info() for the public API.
|
||||
|
@ -113,6 +113,42 @@ drm_gem_init(struct drm_device *dev)
|
||||
return drmm_add_action(dev, drm_gem_init_release, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_gem_object_init_with_mnt - initialize an allocated shmem-backed GEM
|
||||
* object in a given shmfs mountpoint
|
||||
*
|
||||
* @dev: drm_device the object should be initialized for
|
||||
* @obj: drm_gem_object to initialize
|
||||
* @size: object size
|
||||
* @gemfs: tmpfs mount where the GEM object will be created. If NULL, use
|
||||
* the usual tmpfs mountpoint (`shm_mnt`).
|
||||
*
|
||||
* Initialize an already allocated GEM object of the specified size with
|
||||
* shmfs backing store.
|
||||
*/
|
||||
int drm_gem_object_init_with_mnt(struct drm_device *dev,
|
||||
struct drm_gem_object *obj, size_t size,
|
||||
struct vfsmount *gemfs)
|
||||
{
|
||||
struct file *filp;
|
||||
|
||||
drm_gem_private_object_init(dev, obj, size);
|
||||
|
||||
if (gemfs)
|
||||
filp = shmem_file_setup_with_mnt(gemfs, "drm mm object", size,
|
||||
VM_NORESERVE);
|
||||
else
|
||||
filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
|
||||
|
||||
if (IS_ERR(filp))
|
||||
return PTR_ERR(filp);
|
||||
|
||||
obj->filp = filp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_object_init_with_mnt);
|
||||
|
||||
/**
|
||||
* drm_gem_object_init - initialize an allocated shmem-backed GEM object
|
||||
* @dev: drm_device the object should be initialized for
|
||||
@ -122,20 +158,10 @@ drm_gem_init(struct drm_device *dev)
|
||||
* Initialize an already allocated GEM object of the specified size with
|
||||
* shmfs backing store.
|
||||
*/
|
||||
int drm_gem_object_init(struct drm_device *dev,
|
||||
struct drm_gem_object *obj, size_t size)
|
||||
int drm_gem_object_init(struct drm_device *dev, struct drm_gem_object *obj,
|
||||
size_t size)
|
||||
{
|
||||
struct file *filp;
|
||||
|
||||
drm_gem_private_object_init(dev, obj, size);
|
||||
|
||||
filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
|
||||
if (IS_ERR(filp))
|
||||
return PTR_ERR(filp);
|
||||
|
||||
obj->filp = filp;
|
||||
|
||||
return 0;
|
||||
return drm_gem_object_init_with_mnt(dev, obj, size, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_object_init);
|
||||
|
||||
|
@ -49,7 +49,8 @@ static const struct drm_gem_object_funcs drm_gem_shmem_funcs = {
|
||||
};
|
||||
|
||||
static struct drm_gem_shmem_object *
|
||||
__drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)
|
||||
__drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private,
|
||||
struct vfsmount *gemfs)
|
||||
{
|
||||
struct drm_gem_shmem_object *shmem;
|
||||
struct drm_gem_object *obj;
|
||||
@ -76,7 +77,7 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)
|
||||
drm_gem_private_object_init(dev, obj, size);
|
||||
shmem->map_wc = false; /* dma-buf mappings use always writecombine */
|
||||
} else {
|
||||
ret = drm_gem_object_init(dev, obj, size);
|
||||
ret = drm_gem_object_init_with_mnt(dev, obj, size, gemfs);
|
||||
}
|
||||
if (ret) {
|
||||
drm_gem_private_object_fini(obj);
|
||||
@ -123,10 +124,31 @@ err_free:
|
||||
*/
|
||||
struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size)
|
||||
{
|
||||
return __drm_gem_shmem_create(dev, size, false);
|
||||
return __drm_gem_shmem_create(dev, size, false, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_shmem_create);
|
||||
|
||||
/**
|
||||
* drm_gem_shmem_create_with_mnt - Allocate an object with the given size in a
|
||||
* given mountpoint
|
||||
* @dev: DRM device
|
||||
* @size: Size of the object to allocate
|
||||
* @gemfs: tmpfs mount where the GEM object will be created
|
||||
*
|
||||
* This function creates a shmem GEM object in a given tmpfs mountpoint.
|
||||
*
|
||||
* Returns:
|
||||
* A struct drm_gem_shmem_object * on success or an ERR_PTR()-encoded negative
|
||||
* error code on failure.
|
||||
*/
|
||||
struct drm_gem_shmem_object *drm_gem_shmem_create_with_mnt(struct drm_device *dev,
|
||||
size_t size,
|
||||
struct vfsmount *gemfs)
|
||||
{
|
||||
return __drm_gem_shmem_create(dev, size, false, gemfs);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_shmem_create_with_mnt);
|
||||
|
||||
/**
|
||||
* drm_gem_shmem_free - Free resources associated with a shmem GEM object
|
||||
* @shmem: shmem GEM object to free
|
||||
@ -765,7 +787,7 @@ drm_gem_shmem_prime_import_sg_table(struct drm_device *dev,
|
||||
size_t size = PAGE_ALIGN(attach->dmabuf->size);
|
||||
struct drm_gem_shmem_object *shmem;
|
||||
|
||||
shmem = __drm_gem_shmem_create(dev, size, true);
|
||||
shmem = __drm_gem_shmem_create(dev, size, true, NULL);
|
||||
if (IS_ERR(shmem))
|
||||
return ERR_CAST(shmem);
|
||||
|
||||
|
@ -184,6 +184,12 @@ static const struct dmi_system_id orientation_data[] = {
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T103HAF"),
|
||||
},
|
||||
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||
}, { /* AYA NEO AYANEO 2 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "AYANEO 2"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
||||
}, { /* AYA NEO 2021 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYADEVICE"),
|
||||
@ -196,6 +202,18 @@ static const struct dmi_system_id orientation_data[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "AIR"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1080x1920_leftside_up,
|
||||
}, { /* AYA NEO Founder */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYA NEO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "AYA NEO Founder"),
|
||||
},
|
||||
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||
}, { /* AYA NEO GEEK */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "GEEK"),
|
||||
},
|
||||
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||
}, { /* AYA NEO NEXT */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
|
||||
|
@ -4,6 +4,7 @@ config DRM_EXYNOS
|
||||
depends on OF && DRM && COMMON_CLK
|
||||
depends on ARCH_S3C64XX || ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST
|
||||
depends on MMU
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_DISPLAY_HELPER if DRM_EXYNOS_DP
|
||||
select DRM_KMS_HELPER
|
||||
select VIDEOMODE_HELPERS
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_file.h>
|
||||
#include <drm/drm_fourcc.h>
|
||||
@ -111,6 +112,7 @@ static const struct drm_driver exynos_drm_driver = {
|
||||
.dumb_create = exynos_drm_gem_dumb_create,
|
||||
.gem_prime_import = exynos_drm_gem_prime_import,
|
||||
.gem_prime_import_sg_table = exynos_drm_gem_prime_import_sg_table,
|
||||
EXYNOS_DRM_FBDEV_DRIVER_OPS,
|
||||
.ioctls = exynos_ioctls,
|
||||
.num_ioctls = ARRAY_SIZE(exynos_ioctls),
|
||||
.fops = &exynos_drm_driver_fops,
|
||||
@ -288,7 +290,7 @@ static int exynos_drm_bind(struct device *dev)
|
||||
if (ret < 0)
|
||||
goto err_cleanup_poll;
|
||||
|
||||
exynos_drm_fbdev_setup(drm);
|
||||
drm_client_setup(drm, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include "exynos_drm_fbdev.h"
|
||||
|
||||
#define MAX_CONNECTOR 4
|
||||
#define PREFERRED_BPP 32
|
||||
|
||||
static int exynos_drm_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
||||
{
|
||||
@ -87,8 +86,11 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
static const struct drm_fb_helper_funcs exynos_drm_fbdev_helper_funcs = {
|
||||
};
|
||||
|
||||
int exynos_drm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
struct exynos_drm_gem *exynos_gem;
|
||||
struct drm_device *dev = helper->dev;
|
||||
@ -120,6 +122,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
|
||||
ret = PTR_ERR(helper->fb);
|
||||
goto err_destroy_gem;
|
||||
}
|
||||
helper->funcs = &exynos_drm_fbdev_helper_funcs;
|
||||
|
||||
ret = exynos_drm_fbdev_update(helper, sizes, exynos_gem);
|
||||
if (ret < 0)
|
||||
@ -134,93 +137,3 @@ err_destroy_gem:
|
||||
exynos_drm_gem_destroy(exynos_gem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_fb_helper_funcs exynos_drm_fb_helper_funcs = {
|
||||
.fb_probe = exynos_drm_fbdev_create,
|
||||
};
|
||||
|
||||
/*
|
||||
* struct drm_client
|
||||
*/
|
||||
|
||||
static void exynos_drm_fbdev_client_unregister(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
|
||||
if (fb_helper->info) {
|
||||
drm_fb_helper_unregister_info(fb_helper);
|
||||
} else {
|
||||
drm_client_release(&fb_helper->client);
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
}
|
||||
|
||||
static int exynos_drm_fbdev_client_restore(struct drm_client_dev *client)
|
||||
{
|
||||
drm_fb_helper_lastclose(client->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int exynos_drm_fbdev_client_hotplug(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
struct drm_device *dev = client->dev;
|
||||
int ret;
|
||||
|
||||
if (dev->fb_helper)
|
||||
return drm_fb_helper_hotplug_event(dev->fb_helper);
|
||||
|
||||
ret = drm_fb_helper_init(dev, fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_err;
|
||||
|
||||
if (!drm_drv_uses_atomic_modeset(dev))
|
||||
drm_helper_disable_unused_functions(dev);
|
||||
|
||||
ret = drm_fb_helper_initial_config(fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_fb_helper_fini;
|
||||
|
||||
return 0;
|
||||
|
||||
err_drm_fb_helper_fini:
|
||||
drm_fb_helper_fini(fb_helper);
|
||||
err_drm_err:
|
||||
drm_err(dev, "Failed to setup fbdev emulation (ret=%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_client_funcs exynos_drm_fbdev_client_funcs = {
|
||||
.owner = THIS_MODULE,
|
||||
.unregister = exynos_drm_fbdev_client_unregister,
|
||||
.restore = exynos_drm_fbdev_client_restore,
|
||||
.hotplug = exynos_drm_fbdev_client_hotplug,
|
||||
};
|
||||
|
||||
void exynos_drm_fbdev_setup(struct drm_device *dev)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper;
|
||||
int ret;
|
||||
|
||||
drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
|
||||
drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
|
||||
|
||||
fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
|
||||
if (!fb_helper)
|
||||
return;
|
||||
drm_fb_helper_prepare(dev, fb_helper, PREFERRED_BPP, &exynos_drm_fb_helper_funcs);
|
||||
|
||||
ret = drm_client_init(dev, &fb_helper->client, "fbdev", &exynos_drm_fbdev_client_funcs);
|
||||
if (ret)
|
||||
goto err_drm_client_init;
|
||||
|
||||
drm_client_register(&fb_helper->client);
|
||||
|
||||
return;
|
||||
|
||||
err_drm_client_init:
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
|
@ -11,12 +11,17 @@
|
||||
#ifndef _EXYNOS_DRM_FBDEV_H_
|
||||
#define _EXYNOS_DRM_FBDEV_H_
|
||||
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
void exynos_drm_fbdev_setup(struct drm_device *dev);
|
||||
struct drm_fb_helper;
|
||||
struct drm_fb_helper_surface_size;
|
||||
|
||||
#if defined(CONFIG_DRM_FBDEV_EMULATION)
|
||||
int exynos_drm_fbdev_driver_fbdev_probe(struct drm_fb_helper *fbh,
|
||||
struct drm_fb_helper_surface_size *sizes);
|
||||
#define EXYNOS_DRM_FBDEV_DRIVER_OPS \
|
||||
.fbdev_probe = exynos_drm_fbdev_driver_fbdev_probe
|
||||
#else
|
||||
static inline void exynos_drm_fbdev_setup(struct drm_device *dev)
|
||||
{
|
||||
}
|
||||
#define EXYNOS_DRM_FBDEV_DRIVER_OPS \
|
||||
.fbdev_probe = NULL
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -3,6 +3,7 @@ config DRM_FSL_DCU
|
||||
tristate "DRM Support for Freescale DCU"
|
||||
depends on DRM && OF && ARM && COMMON_CLK
|
||||
select BACKLIGHT_CLASS_DEVICE
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_GEM_DMA_HELPER
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_PANEL
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_gem_dma_helper.h>
|
||||
@ -156,6 +157,7 @@ static const struct drm_driver fsl_dcu_drm_driver = {
|
||||
.load = fsl_dcu_load,
|
||||
.unload = fsl_dcu_unload,
|
||||
DRM_GEM_DMA_DRIVER_OPS,
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
.fops = &fsl_dcu_drm_fops,
|
||||
.name = "fsl-dcu-drm",
|
||||
.desc = "Freescale DCU DRM",
|
||||
@ -333,7 +335,7 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
|
||||
if (ret < 0)
|
||||
goto put;
|
||||
|
||||
drm_fbdev_dma_setup(drm, legacyfb_depth);
|
||||
drm_client_setup_with_color_mode(drm, legacyfb_depth);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
config DRM_GMA500
|
||||
tristate "Intel GMA500/600/3600/3650 KMS Framebuffer"
|
||||
depends on DRM && PCI && X86 && MMU
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select FB_IOMEM_HELPERS if DRM_FBDEV_EMULATION
|
||||
select I2C
|
||||
|
@ -143,12 +143,15 @@ static const struct fb_ops psb_fbdev_fb_ops = {
|
||||
.fb_destroy = psb_fbdev_fb_destroy,
|
||||
};
|
||||
|
||||
static const struct drm_fb_helper_funcs psb_fbdev_fb_helper_funcs = {
|
||||
};
|
||||
|
||||
/*
|
||||
* struct drm_fb_helper_funcs
|
||||
* struct drm_driver
|
||||
*/
|
||||
|
||||
static int psb_fbdev_fb_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
int psb_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
|
||||
@ -206,6 +209,7 @@ static int psb_fbdev_fb_probe(struct drm_fb_helper *fb_helper,
|
||||
goto err_drm_gem_object_put;
|
||||
}
|
||||
|
||||
fb_helper->funcs = &psb_fbdev_fb_helper_funcs;
|
||||
fb_helper->fb = fb;
|
||||
|
||||
info = drm_fb_helper_alloc_info(fb_helper);
|
||||
@ -246,93 +250,3 @@ err_drm_gem_object_put:
|
||||
drm_gem_object_put(obj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_fb_helper_funcs psb_fbdev_fb_helper_funcs = {
|
||||
.fb_probe = psb_fbdev_fb_probe,
|
||||
};
|
||||
|
||||
/*
|
||||
* struct drm_client_funcs and setup code
|
||||
*/
|
||||
|
||||
static void psb_fbdev_client_unregister(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
|
||||
if (fb_helper->info) {
|
||||
drm_fb_helper_unregister_info(fb_helper);
|
||||
} else {
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
drm_client_release(&fb_helper->client);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
}
|
||||
|
||||
static int psb_fbdev_client_restore(struct drm_client_dev *client)
|
||||
{
|
||||
drm_fb_helper_lastclose(client->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int psb_fbdev_client_hotplug(struct drm_client_dev *client)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
|
||||
struct drm_device *dev = client->dev;
|
||||
int ret;
|
||||
|
||||
if (dev->fb_helper)
|
||||
return drm_fb_helper_hotplug_event(dev->fb_helper);
|
||||
|
||||
ret = drm_fb_helper_init(dev, fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_err;
|
||||
|
||||
if (!drm_drv_uses_atomic_modeset(dev))
|
||||
drm_helper_disable_unused_functions(dev);
|
||||
|
||||
ret = drm_fb_helper_initial_config(fb_helper);
|
||||
if (ret)
|
||||
goto err_drm_fb_helper_fini;
|
||||
|
||||
return 0;
|
||||
|
||||
err_drm_fb_helper_fini:
|
||||
drm_fb_helper_fini(fb_helper);
|
||||
err_drm_err:
|
||||
drm_err(dev, "Failed to setup gma500 fbdev emulation (ret=%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_client_funcs psb_fbdev_client_funcs = {
|
||||
.owner = THIS_MODULE,
|
||||
.unregister = psb_fbdev_client_unregister,
|
||||
.restore = psb_fbdev_client_restore,
|
||||
.hotplug = psb_fbdev_client_hotplug,
|
||||
};
|
||||
|
||||
void psb_fbdev_setup(struct drm_psb_private *dev_priv)
|
||||
{
|
||||
struct drm_device *dev = &dev_priv->dev;
|
||||
struct drm_fb_helper *fb_helper;
|
||||
int ret;
|
||||
|
||||
fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
|
||||
if (!fb_helper)
|
||||
return;
|
||||
drm_fb_helper_prepare(dev, fb_helper, 32, &psb_fbdev_fb_helper_funcs);
|
||||
|
||||
ret = drm_client_init(dev, &fb_helper->client, "fbdev-gma500", &psb_fbdev_client_funcs);
|
||||
if (ret) {
|
||||
drm_err(dev, "Failed to register client: %d\n", ret);
|
||||
goto err_drm_fb_helper_unprepare;
|
||||
}
|
||||
|
||||
drm_client_register(&fb_helper->client);
|
||||
|
||||
return;
|
||||
|
||||
err_drm_fb_helper_unprepare:
|
||||
drm_fb_helper_unprepare(fb_helper);
|
||||
kfree(fb_helper);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <acpi/video.h>
|
||||
|
||||
#include <drm/drm.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_file.h>
|
||||
#include <drm/drm_ioctl.h>
|
||||
@ -475,7 +476,7 @@ static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
psb_fbdev_setup(dev_priv);
|
||||
drm_client_setup(dev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -507,6 +508,7 @@ static const struct drm_driver driver = {
|
||||
.num_ioctls = ARRAY_SIZE(psb_ioctls),
|
||||
|
||||
.dumb_create = psb_gem_dumb_create,
|
||||
PSB_FBDEV_DRIVER_OPS,
|
||||
.ioctls = psb_ioctls,
|
||||
.fops = &psb_gem_fops,
|
||||
.name = DRIVER_NAME,
|
||||
|
@ -184,6 +184,9 @@
|
||||
#define KSEL_BYPASS_25 6
|
||||
#define KSEL_BYPASS_83_100 7
|
||||
|
||||
struct drm_fb_helper;
|
||||
struct drm_fb_helper_surface_size;
|
||||
|
||||
struct opregion_header;
|
||||
struct opregion_acpi;
|
||||
struct opregion_swsci;
|
||||
@ -597,10 +600,13 @@ struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
|
||||
|
||||
/* fbdev */
|
||||
#if defined(CONFIG_DRM_FBDEV_EMULATION)
|
||||
void psb_fbdev_setup(struct drm_psb_private *dev_priv);
|
||||
int psb_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes);
|
||||
#define PSB_FBDEV_DRIVER_OPS \
|
||||
.fbdev_probe = psb_fbdev_driver_fbdev_probe
|
||||
#else
|
||||
static inline void psb_fbdev_setup(struct drm_psb_private *dev_priv)
|
||||
{ }
|
||||
#define PSB_FBDEV_DRIVER_OPS \
|
||||
.fbdev_probe = NULL
|
||||
#endif
|
||||
|
||||
/* backlight.c */
|
||||
|
@ -4,6 +4,7 @@ config DRM_GUD
|
||||
tristate "GUD USB Display"
|
||||
depends on DRM && USB && MMU
|
||||
select LZ4_COMPRESS
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_GEM_SHMEM_HELPER
|
||||
select BACKLIGHT_CLASS_DEVICE
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_blend.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_damage_helper.h>
|
||||
#include <drm/drm_debugfs.h>
|
||||
#include <drm/drm_drv.h>
|
||||
@ -376,6 +377,7 @@ static const struct drm_driver gud_drm_driver = {
|
||||
.fops = &gud_fops,
|
||||
DRM_GEM_SHMEM_DRIVER_OPS,
|
||||
.gem_prime_import = gud_gem_prime_import,
|
||||
DRM_FBDEV_SHMEM_DRIVER_OPS,
|
||||
|
||||
.name = "gud",
|
||||
.desc = "Generic USB Display",
|
||||
@ -622,7 +624,7 @@ static int gud_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
drm_kms_helper_poll_init(drm);
|
||||
|
||||
drm_fbdev_shmem_setup(drm, 0);
|
||||
drm_client_setup(drm, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ config DRM_HISI_HIBMC
|
||||
tristate "DRM Support for Hisilicon Hibmc"
|
||||
depends on DRM && PCI && (ARM64 || COMPILE_TEST)
|
||||
depends on MMU
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_VRAM_HELPER
|
||||
select DRM_TTM
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
#include <drm/drm_aperture.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_ttm.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
@ -63,6 +64,7 @@ static const struct drm_driver hibmc_driver = {
|
||||
.debugfs_init = drm_vram_mm_debugfs_init,
|
||||
.dumb_create = hibmc_dumb_create,
|
||||
.dumb_map_offset = drm_gem_ttm_dumb_map_offset,
|
||||
DRM_FBDEV_TTM_DRIVER_OPS,
|
||||
};
|
||||
|
||||
static int __maybe_unused hibmc_pm_suspend(struct device *dev)
|
||||
@ -339,7 +341,7 @@ static int hibmc_pci_probe(struct pci_dev *pdev,
|
||||
goto err_unload;
|
||||
}
|
||||
|
||||
drm_fbdev_ttm_setup(dev, 32);
|
||||
drm_client_setup(dev, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
config DRM_HISI_KIRIN
|
||||
tristate "DRM Support for Hisilicon Kirin series SoCs Platform"
|
||||
depends on DRM && OF && (ARM64 || COMPILE_TEST)
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_GEM_DMA_HELPER
|
||||
select DRM_MIPI_DSI
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fb_dma_helper.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_fourcc.h>
|
||||
#include <drm/drm_framebuffer.h>
|
||||
#include <drm/drm_gem_dma_helper.h>
|
||||
@ -925,6 +926,7 @@ static const struct drm_driver ade_driver = {
|
||||
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
|
||||
.fops = &ade_fops,
|
||||
DRM_GEM_DMA_DRIVER_OPS,
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
.name = "kirin",
|
||||
.desc = "Hisilicon Kirin620 SoC DRM Driver",
|
||||
.date = "20150718",
|
||||
|
@ -18,8 +18,8 @@
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_gem_dma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_module.h>
|
||||
@ -237,7 +237,7 @@ static int kirin_drm_bind(struct device *dev)
|
||||
if (ret)
|
||||
goto err_kms_cleanup;
|
||||
|
||||
drm_fbdev_dma_setup(drm_dev, 32);
|
||||
drm_client_setup(drm_dev, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
#include <drm/drm_aperture.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_shmem.h>
|
||||
#include <drm/drm_gem_shmem_helper.h>
|
||||
@ -36,6 +37,7 @@ static struct drm_driver hyperv_driver = {
|
||||
|
||||
.fops = &hv_fops,
|
||||
DRM_GEM_SHMEM_DRIVER_OPS,
|
||||
DRM_FBDEV_SHMEM_DRIVER_OPS,
|
||||
};
|
||||
|
||||
static int hyperv_pci_probe(struct pci_dev *pdev,
|
||||
@ -149,7 +151,7 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
|
||||
goto err_free_mmio;
|
||||
}
|
||||
|
||||
drm_fbdev_shmem_setup(dev, 0);
|
||||
drm_client_setup(dev, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
config DRM_IMX_DCSS
|
||||
tristate "i.MX8MQ DCSS"
|
||||
select IMX_IRQSTEER
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_DISPLAY_HELPER
|
||||
select DRM_BRIDGE_CONNECTOR
|
||||
|
@ -206,15 +206,13 @@ int dcss_crtc_init(struct dcss_crtc *crtc, struct drm_device *drm)
|
||||
if (crtc->irq < 0)
|
||||
return crtc->irq;
|
||||
|
||||
ret = request_irq(crtc->irq, dcss_crtc_irq_handler,
|
||||
0, "dcss_drm", crtc);
|
||||
ret = request_irq(crtc->irq, dcss_crtc_irq_handler, IRQF_NO_AUTOEN,
|
||||
"dcss_drm", crtc);
|
||||
if (ret) {
|
||||
dev_err(dcss->dev, "irq request failed with %d.\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
disable_irq(crtc->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -134,14 +134,12 @@ static int dcss_dtg_irq_config(struct dcss_dtg *dtg,
|
||||
dtg->base_reg + DCSS_DTG_INT_MASK);
|
||||
|
||||
ret = request_irq(dtg->ctxld_kick_irq, dcss_dtg_irq_handler,
|
||||
0, "dcss_ctxld_kick", dtg);
|
||||
IRQF_NO_AUTOEN, "dcss_ctxld_kick", dtg);
|
||||
if (ret) {
|
||||
dev_err(dtg->dev, "dtg: irq request failed.\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
disable_irq(dtg->ctxld_kick_irq);
|
||||
|
||||
dtg->ctxld_kick_irq_en = false;
|
||||
|
||||
return 0;
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_bridge_connector.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_gem_dma_helper.h>
|
||||
@ -28,6 +29,7 @@ static const struct drm_mode_config_funcs dcss_drm_mode_config_funcs = {
|
||||
static const struct drm_driver dcss_kms_driver = {
|
||||
.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
|
||||
DRM_GEM_DMA_DRIVER_OPS,
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
.fops = &dcss_cma_fops,
|
||||
.name = "imx-dcss",
|
||||
.desc = "i.MX8MQ Display Subsystem",
|
||||
@ -145,7 +147,7 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss)
|
||||
if (ret)
|
||||
goto cleanup_crtc;
|
||||
|
||||
drm_fbdev_dma_setup(drm, 32);
|
||||
drm_client_setup(drm, NULL);
|
||||
|
||||
return kms;
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config DRM_IMX
|
||||
tristate "DRM Support for Freescale i.MX"
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select VIDEOMODE_HELPERS
|
||||
select DRM_GEM_DMA_HELPER
|
||||
@ -13,6 +14,7 @@ config DRM_IMX_PARALLEL_DISPLAY
|
||||
tristate "Support for parallel displays"
|
||||
depends on DRM_IMX
|
||||
select DRM_BRIDGE
|
||||
select DRM_BRIDGE_CONNECTOR
|
||||
select DRM_PANEL_BRIDGE
|
||||
select VIDEOMODE_HELPERS
|
||||
|
||||
@ -31,6 +33,7 @@ config DRM_IMX_LDB
|
||||
depends on COMMON_CLK
|
||||
select MFD_SYSCON
|
||||
select DRM_BRIDGE
|
||||
select DRM_BRIDGE_CONNECTOR
|
||||
select DRM_PANEL_BRIDGE
|
||||
select DRM_IMX_LEGACY_BRIDGE
|
||||
help
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
#include <drm/drm_gem_dma_helper.h>
|
||||
@ -156,6 +157,7 @@ static int imx_drm_dumb_create(struct drm_file *file_priv,
|
||||
static const struct drm_driver imx_drm_driver = {
|
||||
.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
|
||||
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(imx_drm_dumb_create),
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
.ioctls = imx_drm_ioctls,
|
||||
.num_ioctls = ARRAY_SIZE(imx_drm_ioctls),
|
||||
.fops = &imx_drm_driver_fops,
|
||||
@ -242,7 +244,7 @@ static int imx_drm_bind(struct device *dev)
|
||||
if (ret)
|
||||
goto err_poll_fini;
|
||||
|
||||
drm_fbdev_dma_setup(drm, legacyfb_depth);
|
||||
drm_client_setup_with_color_mode(drm, legacyfb_depth);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -410,14 +410,12 @@ static int ipu_drm_bind(struct device *dev, struct device *master, void *data)
|
||||
}
|
||||
|
||||
ipu_crtc->irq = ipu_plane_irq(ipu_crtc->plane[0]);
|
||||
ret = devm_request_irq(ipu_crtc->dev, ipu_crtc->irq, ipu_irq_handler, 0,
|
||||
"imx_drm", ipu_crtc);
|
||||
ret = devm_request_irq(ipu_crtc->dev, ipu_crtc->irq, ipu_irq_handler,
|
||||
IRQF_NO_AUTOEN, "imx_drm", ipu_crtc);
|
||||
if (ret < 0) {
|
||||
dev_err(ipu_crtc->dev, "irq request failed with %d.\n", ret);
|
||||
return ret;
|
||||
}
|
||||
/* Only enable IRQ when we actually need it to trigger work. */
|
||||
disable_irq(ipu_crtc->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
config DRM_IMX_LCDC
|
||||
tristate "Freescale i.MX LCDC displays"
|
||||
depends on DRM && (ARCH_MXC || COMPILE_TEST)
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_GEM_DMA_HELPER
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_DISPLAY_HELPER
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
#include <drm/drm_bridge.h>
|
||||
#include <drm/drm_bridge_connector.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_damage_helper.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_fbdev_dma.h>
|
||||
@ -348,6 +349,7 @@ static struct drm_driver imx_lcdc_drm_driver = {
|
||||
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
|
||||
.fops = &imx_lcdc_drm_fops,
|
||||
DRM_GEM_DMA_DRIVER_OPS_VMAP,
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
.name = "imx-lcdc",
|
||||
.desc = "i.MX LCDC driver",
|
||||
.date = "20200716",
|
||||
@ -501,7 +503,7 @@ static int imx_lcdc_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Cannot register device\n");
|
||||
|
||||
drm_fbdev_dma_setup(drm, 0);
|
||||
drm_client_setup(drm, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ config DRM_INGENIC
|
||||
depends on OF
|
||||
depends on COMMON_CLK
|
||||
select DRM_BRIDGE
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_PANEL_BRIDGE
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_DISPLAY_HELPER
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_bridge.h>
|
||||
#include <drm/drm_bridge_connector.h>
|
||||
#include <drm/drm_client_setup.h>
|
||||
#include <drm/drm_color_mgmt.h>
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_damage_helper.h>
|
||||
@ -960,6 +961,7 @@ static const struct drm_driver ingenic_drm_driver_data = {
|
||||
.fops = &ingenic_drm_fops,
|
||||
.gem_create_object = ingenic_drm_gem_create_object,
|
||||
DRM_GEM_DMA_DRIVER_OPS,
|
||||
DRM_FBDEV_DMA_DRIVER_OPS,
|
||||
};
|
||||
|
||||
static const struct drm_plane_funcs ingenic_drm_primary_plane_funcs = {
|
||||
@ -1399,7 +1401,7 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
|
||||
goto err_clk_notifier_unregister;
|
||||
}
|
||||
|
||||
drm_fbdev_dma_setup(drm, 32);
|
||||
drm_client_setup(drm, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -2,6 +2,7 @@ config DRM_KMB_DISPLAY
|
||||
tristate "Intel Keembay Display"
|
||||
depends on DRM
|
||||
depends on ARCH_KEEMBAY || COMPILE_TEST
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_DISPLAY_HELPER
|
||||
select DRM_BRIDGE_CONNECTOR
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user