summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/openchrome/via_drv.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/openchrome/via_drv.h')
-rw-r--r--drivers/gpu/drm/openchrome/via_drv.h273
1 files changed, 273 insertions, 0 deletions
diff --git a/drivers/gpu/drm/openchrome/via_drv.h b/drivers/gpu/drm/openchrome/via_drv.h
new file mode 100644
index 000000000000..8e6d1c416f99
--- /dev/null
+++ b/drivers/gpu/drm/openchrome/via_drv.h
@@ -0,0 +1,273 @@
+/*
+ * Copyright 2014 James Simmons <jsimmons@infradead.org>
+ * Influenced by sample code from VIA Technologies and the radeon driver.
+ *
+ * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
+ * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+#ifndef _VIA_DRV_H_
+#define _VIA_DRV_H_
+
+#define DRIVER_AUTHOR "The OpenChrome Project"
+#define DRIVER_NAME "via"
+#define DRIVER_DESC "OpenChrome DRM for VIA Technologies Chrome IGP"
+#define DRIVER_DATE "20170712"
+
+#define DRIVER_MAJOR 3
+#define DRIVER_MINOR 0
+#define DRIVER_PATCHLEVEL 41
+
+#include <linux/module.h>
+
+#include "ttm/ttm_bo_api.h"
+#include "ttm/ttm_bo_driver.h"
+#include "ttm/ttm_placement.h"
+#include "ttm/ttm_memory.h"
+#include "ttm/ttm_module.h"
+#include "ttm/ttm_page_alloc.h"
+
+#include <drm/drmP.h>
+#include <drm/drm_gem.h>
+#include <drm/via_drm.h>
+
+#include "via_regs.h"
+#include "via_fence.h"
+#include "via_dma.h"
+#include "via_verifier.h"
+#include "via_display.h"
+
+#define VIA_MM_ALIGN_SIZE 16
+
+#define VIA_PCI_BUF_SIZE 60000
+#define VIA_FIRE_BUF_SIZE 1024
+#define VIA_NUM_IRQS 4
+
+#define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
+
+#define CLE266_REVISION_AX 0x0A
+#define CLE266_REVISION_CX 0x0C
+#define CX700_REVISION_700 0x0
+#define CX700_REVISION_700M 0x1
+#define CX700_REVISION_700M2 0x2
+
+/* For VT3353 */
+#define VX800_REVISION_A 0x0f
+#define VX800_REVISION_B0 0x10
+#define VX800_REVISION_B1 0x11
+#define VX800_REVISION_B2 0x12
+
+/* For VT3409 */
+#define VX855_REVISION_A0 0x00
+#define VX855_REVISION_A1 0x01
+#define VX855_REVISION_A2 0x02
+
+/* For VT3410 */
+#define VX900_REVISION_A0 0x00
+#define VX900_REVISION_A1 0x01
+#define VX900_REVISION_A2 0x02
+#define VX900_REVISION_A3 0x03
+
+typedef uint32_t maskarray_t[5];
+
+typedef struct drm_via_irq {
+ atomic_t irq_received;
+ uint32_t pending_mask;
+ uint32_t enable_mask;
+ wait_queue_head_t irq_queue;
+} drm_via_irq_t;
+
+struct sgdma_tt {
+ struct ttm_dma_tt sgdma;
+ unsigned long offset;
+};
+
+struct via_state {
+ struct vga_regset crt_regs[256];
+ struct vga_regset seq_regs[256];
+};
+
+struct ttm_heap {
+ struct ttm_place busy_placements[TTM_NUM_MEM_TYPES];
+ struct ttm_place placements[TTM_NUM_MEM_TYPES];
+ struct ttm_buffer_object pbo;
+};
+
+enum via_engine {
+ VIA_ENG_H1 = 0,
+ VIA_ENG_H2,
+ VIA_ENG_H5S1,
+ VIA_ENG_H5S2VP1,
+ VIA_ENG_H6S2
+};
+
+struct via_device {
+ struct drm_global_reference mem_global_ref;
+ struct ttm_bo_global_ref bo_global_ref;
+ struct ttm_bo_device bdev;
+ struct drm_device *dev;
+ int revision;
+
+ struct ttm_bo_kmap_obj dmabuf;
+ struct ttm_bo_kmap_obj mmio;
+ struct ttm_bo_kmap_obj gart;
+ struct ttm_bo_kmap_obj vq;
+
+ struct drm_fb_helper *helper;
+ u8 vram_type;
+ unsigned long long vram_start;
+ unsigned int vram_size;
+ int vram_mtrr;
+
+ struct via_state pm_cache;
+
+ enum via_engine engine_type;
+ struct drm_via_state hc_state;
+ unsigned int dma_low;
+ unsigned int dma_high;
+ unsigned int dma_offset;
+ uint32_t dma_diff;
+ uint32_t dma_wrap;
+ void __iomem *last_pause_ptr;
+ void __iomem *hw_addr_ptr;
+
+ char pci_buf[VIA_PCI_BUF_SIZE];
+ const uint32_t *fire_offsets[VIA_FIRE_BUF_SIZE];
+ uint32_t num_fire_offsets;
+
+ drm_via_irq_t via_irqs[VIA_NUM_IRQS];
+ struct work_struct hotplug_work;
+ struct workqueue_struct *wq;
+ unsigned num_irqs;
+ maskarray_t *irq_masks;
+ uint32_t irq_enable_mask;
+ uint32_t irq_pending_mask;
+ int *irq_map;
+
+ /* fence handling */
+ struct via_fence_pool *dma_fences;
+ int desc_size;
+
+ struct via_crtc iga[2];
+ bool spread_spectrum;
+};
+
+#define VIA_MEM_NONE 0x00
+#define VIA_MEM_SDR66 0x01
+#define VIA_MEM_SDR100 0x02
+#define VIA_MEM_SDR133 0x03
+#define VIA_MEM_DDR_200 0x04
+#define VIA_MEM_DDR_266 0x05
+#define VIA_MEM_DDR_333 0x06
+#define VIA_MEM_DDR_400 0x07
+#define VIA_MEM_DDR2_400 0x08
+#define VIA_MEM_DDR2_533 0x09
+#define VIA_MEM_DDR2_667 0x0A
+#define VIA_MEM_DDR2_800 0x0B
+#define VIA_MEM_DDR2_1066 0x0C
+#define VIA_MEM_DDR3_533 0x0D
+#define VIA_MEM_DDR3_667 0x0E
+#define VIA_MEM_DDR3_800 0x0F
+#define VIA_MEM_DDR3_1066 0x10
+#define VIA_MEM_DDR3_1333 0x11
+#define VIA_MEM_DDR3_1600 0x12
+
+/* VIA MMIO register access */
+#define VIA_BASE ((dev_priv->mmio.virtual))
+
+#define VIA_READ(reg) ioread32(VIA_BASE + reg)
+#define VIA_WRITE(reg, val) iowrite32(val, VIA_BASE + reg)
+#define VIA_READ8(reg) ioread8(VIA_BASE + reg)
+#define VIA_WRITE8(reg, val) iowrite8(val, VIA_BASE + reg)
+
+#define VIA_WRITE_MASK(reg, data, mask) \
+ VIA_WRITE(reg, (data & mask) | (VIA_READ(reg) & ~mask)) \
+
+#define VGABASE (VIA_BASE+VIA_MMIO_VGABASE)
+
+extern const struct drm_ioctl_desc via_ioctls[];
+extern int via_max_ioctl;
+
+extern int via_hdmi_audio;
+
+extern void via_engine_init(struct drm_device *dev);
+
+extern int via_dma_init(struct drm_device *dev, void *data, struct drm_file *file_priv);
+extern int via_flush_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
+extern int via_dispatch_cmdbuffer(struct drm_device *dev, drm_via_cmdbuffer_t *cmd);
+extern int via_cmdbuffer(struct drm_device *dev, void *data, struct drm_file *file_priv);
+extern int via_cmdbuf_size(struct drm_device *dev, void *data, struct drm_file *file_priv);
+extern int via_pci_cmdbuffer(struct drm_device *dev, void *data, struct drm_file *file_priv);
+extern int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv);
+extern int via_wait_idle(struct via_device *dev_priv);
+
+extern int via_vram_init(struct via_device *dev_priv);
+
+extern int via_enable_vblank(struct drm_device *dev, int crtc);
+extern void via_disable_vblank(struct drm_device *dev, int crtc);
+
+extern irqreturn_t via_driver_irq_handler(int irq, void *arg);
+extern void via_driver_irq_preinstall(struct drm_device *dev);
+extern int via_driver_irq_postinstall(struct drm_device *dev);
+extern void via_driver_irq_uninstall(struct drm_device *dev);
+
+extern void via_init_command_verifier(void);
+extern int via_driver_dma_quiescent(struct drm_device *dev);
+extern int via_dma_cleanup(struct drm_device *dev);
+
+extern void via_dmablit_handler(struct drm_device *dev, int engine, int from_irq);
+extern int via_dmablit_init(struct drm_device *dev);
+
+extern int via_mm_init(struct via_device *dev_priv);
+void via_mm_fini(struct drm_device *dev);
+extern void ttm_placement_from_domain(struct ttm_buffer_object *bo,
+ struct ttm_placement *placement,
+ u32 domains, struct ttm_bo_device *bdev);
+extern int via_bo_create(struct ttm_bo_device *bdev, unsigned long size,
+ enum ttm_bo_type origin, uint32_t domains,
+ uint32_t byte_align, uint32_t page_align,
+ bool interruptible, struct sg_table *sg,
+ struct reservation_object *resv,
+ struct ttm_buffer_object **p_bo);
+extern int via_bo_pin(struct ttm_buffer_object *bo, struct ttm_bo_kmap_obj *kmap);
+extern int via_bo_unpin(struct ttm_buffer_object *bo, struct ttm_bo_kmap_obj *kmap);
+extern int via_ttm_allocate_kernel_buffer(struct ttm_bo_device *bdev, unsigned long size,
+ uint32_t alignment, uint32_t domain,
+ struct ttm_bo_kmap_obj *kmap);
+
+
+extern int ttm_mmap(struct file *filp, struct vm_area_struct *vma);
+
+extern int ttm_gem_open_object(struct drm_gem_object *obj, struct drm_file *file_priv);
+extern void ttm_gem_free_object(struct drm_gem_object *obj);
+extern struct drm_gem_object *ttm_gem_create(struct drm_device *dev,
+ struct ttm_bo_device *bdev,
+ enum ttm_bo_type origin,
+ int type, bool interruptible,
+ int byte_align, int page_align,
+ unsigned long size);
+extern struct ttm_buffer_object *ttm_gem_mapping(struct drm_gem_object *obj);
+
+extern struct ttm_tt *
+via_sgdma_backend_init(struct ttm_bo_device *bdev, unsigned long size,
+ uint32_t page_flags, struct page *dummy_read_page);
+
+#endif