1d6c0b56eSmrg/* 2d6c0b56eSmrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and 3d6c0b56eSmrg * VA Linux Systems Inc., Fremont, California. 4d6c0b56eSmrg * 5d6c0b56eSmrg * All Rights Reserved. 6d6c0b56eSmrg * 7d6c0b56eSmrg * Permission is hereby granted, free of charge, to any person obtaining 8d6c0b56eSmrg * a copy of this software and associated documentation files (the 9d6c0b56eSmrg * "Software"), to deal in the Software without restriction, including 10d6c0b56eSmrg * without limitation on the rights to use, copy, modify, merge, 11d6c0b56eSmrg * publish, distribute, sublicense, and/or sell copies of the Software, 12d6c0b56eSmrg * and to permit persons to whom the Software is furnished to do so, 13d6c0b56eSmrg * subject to the following conditions: 14d6c0b56eSmrg * 15d6c0b56eSmrg * The above copyright notice and this permission notice (including the 16d6c0b56eSmrg * next paragraph) shall be included in all copies or substantial 17d6c0b56eSmrg * portions of the Software. 18d6c0b56eSmrg * 19d6c0b56eSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20d6c0b56eSmrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21d6c0b56eSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22d6c0b56eSmrg * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR 23d6c0b56eSmrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24d6c0b56eSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25d6c0b56eSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26d6c0b56eSmrg * DEALINGS IN THE SOFTWARE. 27d6c0b56eSmrg */ 28d6c0b56eSmrg 29d6c0b56eSmrg/* 30d6c0b56eSmrg * Authors: 31d6c0b56eSmrg * Kevin E. Martin <martin@xfree86.org> 32d6c0b56eSmrg * Rickard E. Faith <faith@valinux.com> 33d6c0b56eSmrg * Alan Hourihane <alanh@fairlite.demon.co.uk> 34d6c0b56eSmrg * 35d6c0b56eSmrg */ 36d6c0b56eSmrg 37d6c0b56eSmrg#ifndef _AMDGPU_DRV_H_ 38d6c0b56eSmrg#define _AMDGPU_DRV_H_ 39d6c0b56eSmrg 40d6c0b56eSmrg#include <stdlib.h> /* For abs() */ 41d6c0b56eSmrg#include <unistd.h> /* For usleep() */ 42d6c0b56eSmrg#include <sys/time.h> /* For gettimeofday() */ 43d6c0b56eSmrg 44d6c0b56eSmrg#include "config.h" 45d6c0b56eSmrg 46d6c0b56eSmrg#include "xf86str.h" 47d6c0b56eSmrg#include "compiler.h" 48d6c0b56eSmrg 49d6c0b56eSmrg/* PCI support */ 50d6c0b56eSmrg#include "xf86Pci.h" 51d6c0b56eSmrg 52d6c0b56eSmrg#include "fb.h" 53d6c0b56eSmrg 54d6c0b56eSmrg/* Cursor Support */ 55d6c0b56eSmrg#include "xf86Cursor.h" 56d6c0b56eSmrg 57d6c0b56eSmrg/* DDC support */ 58d6c0b56eSmrg#include "xf86DDC.h" 59d6c0b56eSmrg 60d6c0b56eSmrg/* Xv support */ 61d6c0b56eSmrg#include "xf86xv.h" 62d6c0b56eSmrg 63d6c0b56eSmrg#include "amdgpu_probe.h" 64d6c0b56eSmrg 65d6c0b56eSmrg/* DRI support */ 66d6c0b56eSmrg#include "xf86drm.h" 67d6c0b56eSmrg#include "amdgpu_drm.h" 68d6c0b56eSmrg 69d6c0b56eSmrg#ifdef DAMAGE 70d6c0b56eSmrg#include "damage.h" 71d6c0b56eSmrg#include "globals.h" 72d6c0b56eSmrg#endif 73d6c0b56eSmrg 74d6c0b56eSmrg#include "xf86Crtc.h" 75d6c0b56eSmrg#include "X11/Xatom.h" 76d6c0b56eSmrg 77d6c0b56eSmrg#include "amdgpu_dri2.h" 78d6c0b56eSmrg#include "drmmode_display.h" 79d6c0b56eSmrg#include "amdgpu_bo_helper.h" 80d6c0b56eSmrg 81d6c0b56eSmrg/* Render support */ 82d6c0b56eSmrg#ifdef RENDER 83d6c0b56eSmrg#include "picturestr.h" 84d6c0b56eSmrg#endif 85d6c0b56eSmrg 86d6c0b56eSmrg#include "compat-api.h" 87d6c0b56eSmrg 88d6c0b56eSmrg#include "simple_list.h" 89d6c0b56eSmrg 90d6c0b56eSmrgstruct _SyncFence; 91d6c0b56eSmrg 9211bf0794Smrg#ifndef HAVE_REGIONDUPLICATE 9311bf0794Smrg 9411bf0794Smrgstatic inline RegionPtr 9511bf0794SmrgRegionDuplicate(RegionPtr pOld) 9611bf0794Smrg{ 9711bf0794Smrg RegionPtr pNew; 9811bf0794Smrg 9911bf0794Smrg pNew = RegionCreate(&pOld->extents, 0); 10011bf0794Smrg if (!pNew) 10111bf0794Smrg return NULL; 10211bf0794Smrg if (!RegionCopy(pNew, pOld)) { 10311bf0794Smrg RegionDestroy(pNew); 10411bf0794Smrg return NULL; 10511bf0794Smrg } 10611bf0794Smrg return pNew; 10711bf0794Smrg} 10811bf0794Smrg 10911bf0794Smrg#endif 11011bf0794Smrg 111d6c0b56eSmrg#ifndef MAX 112d6c0b56eSmrg#define MAX(a,b) ((a)>(b)?(a):(b)) 113d6c0b56eSmrg#endif 114d6c0b56eSmrg#ifndef MIN 115d6c0b56eSmrg#define MIN(a,b) ((a)>(b)?(b):(a)) 116d6c0b56eSmrg#endif 117d6c0b56eSmrg 118d6c0b56eSmrg#if HAVE_BYTESWAP_H 119d6c0b56eSmrg#include <byteswap.h> 120d6c0b56eSmrg#elif defined(USE_SYS_ENDIAN_H) 121d6c0b56eSmrg#include <sys/endian.h> 122d6c0b56eSmrg#else 123d6c0b56eSmrg#define bswap_16(value) \ 124d6c0b56eSmrg ((((value) & 0xff) << 8) | ((value) >> 8)) 125d6c0b56eSmrg 126d6c0b56eSmrg#define bswap_32(value) \ 127d6c0b56eSmrg (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ 128d6c0b56eSmrg (uint32_t)bswap_16((uint16_t)((value) >> 16))) 129d6c0b56eSmrg 130d6c0b56eSmrg#define bswap_64(value) \ 131d6c0b56eSmrg (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \ 132d6c0b56eSmrg << 32) | \ 133d6c0b56eSmrg (uint64_t)bswap_32((uint32_t)((value) >> 32))) 134d6c0b56eSmrg#endif 135d6c0b56eSmrg 136d6c0b56eSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 137d6c0b56eSmrg#define le32_to_cpu(x) bswap_32(x) 138d6c0b56eSmrg#define le16_to_cpu(x) bswap_16(x) 139d6c0b56eSmrg#define cpu_to_le32(x) bswap_32(x) 140d6c0b56eSmrg#define cpu_to_le16(x) bswap_16(x) 141d6c0b56eSmrg#else 142d6c0b56eSmrg#define le32_to_cpu(x) (x) 143d6c0b56eSmrg#define le16_to_cpu(x) (x) 144d6c0b56eSmrg#define cpu_to_le32(x) (x) 145d6c0b56eSmrg#define cpu_to_le16(x) (x) 146d6c0b56eSmrg#endif 147d6c0b56eSmrg 148d6c0b56eSmrg/* Provide substitutes for gcc's __FUNCTION__ on other compilers */ 149d6c0b56eSmrg#if !defined(__GNUC__) && !defined(__FUNCTION__) 150d6c0b56eSmrg#define __FUNCTION__ __func__ /* C99 */ 151d6c0b56eSmrg#endif 152d6c0b56eSmrg 153d6c0b56eSmrgtypedef enum { 154d6c0b56eSmrg OPTION_ACCEL, 155d6c0b56eSmrg OPTION_SW_CURSOR, 156d6c0b56eSmrg OPTION_PAGE_FLIP, 157d6c0b56eSmrg#ifdef RENDER 158d6c0b56eSmrg OPTION_SUBPIXEL_ORDER, 159d6c0b56eSmrg#endif 160d6c0b56eSmrg OPTION_ZAPHOD_HEADS, 161d6c0b56eSmrg OPTION_ACCEL_METHOD, 162d6c0b56eSmrg OPTION_DRI3, 163d6c0b56eSmrg OPTION_DRI, 164d6c0b56eSmrg OPTION_SHADOW_PRIMARY, 165d6c0b56eSmrg OPTION_TEAR_FREE, 166d6c0b56eSmrg OPTION_DELETE_DP12, 16790f2b693Smrg OPTION_VARIABLE_REFRESH, 168e49c54bcSmrg OPTION_ASYNC_FLIP_SECONDARIES, 169d6c0b56eSmrg} AMDGPUOpts; 170d6c0b56eSmrg 17124b90cf4Smrgstatic inline ScreenPtr 17246845023Smrgamdgpu_primary_screen(ScreenPtr screen) 17324b90cf4Smrg{ 17446845023Smrg if (screen->current_primary) 17546845023Smrg return screen->current_primary; 17624b90cf4Smrg 17724b90cf4Smrg return screen; 17824b90cf4Smrg} 17924b90cf4Smrg 18024b90cf4Smrgstatic inline ScreenPtr 18146845023Smrgamdgpu_dirty_primary(PixmapDirtyUpdatePtr dirty) 18224b90cf4Smrg{ 18346845023Smrg return amdgpu_primary_screen(dirty->secondary_dst->drawable.pScreen); 18424b90cf4Smrg} 18524b90cf4Smrg 18624b90cf4Smrgstatic inline DrawablePtr 18724b90cf4Smrgamdgpu_dirty_src_drawable(PixmapDirtyUpdatePtr dirty) 18824b90cf4Smrg{ 18924b90cf4Smrg#ifdef HAS_DIRTYTRACKING_DRAWABLE_SRC 19024b90cf4Smrg return dirty->src; 19111bf0794Smrg#else 19224b90cf4Smrg return &dirty->src->drawable; 193d6c0b56eSmrg#endif 19424b90cf4Smrg} 19524b90cf4Smrg 19624b90cf4Smrgstatic inline Bool 19724b90cf4Smrgamdgpu_dirty_src_equals(PixmapDirtyUpdatePtr dirty, PixmapPtr pixmap) 19824b90cf4Smrg{ 19924b90cf4Smrg return amdgpu_dirty_src_drawable(dirty) == &pixmap->drawable; 20024b90cf4Smrg} 20124b90cf4Smrg 202d6c0b56eSmrg 203d6c0b56eSmrg#define AMDGPU_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */ 204d6c0b56eSmrg 205d6c0b56eSmrg/* Buffer are aligned on 4096 byte boundaries */ 206d6c0b56eSmrg#define AMDGPU_GPU_PAGE_SIZE 4096 207d6c0b56eSmrg#define AMDGPU_BUFFER_ALIGN (AMDGPU_GPU_PAGE_SIZE - 1) 208d6c0b56eSmrg 209d6c0b56eSmrg#define xFixedToFloat(f) (((float) (f)) / 65536) 210d6c0b56eSmrg 211d6c0b56eSmrg#define AMDGPU_LOGLEVEL_DEBUG 4 212d6c0b56eSmrg 213d6c0b56eSmrg/* Other macros */ 214d6c0b56eSmrg#define AMDGPU_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1)) 215d6c0b56eSmrg#define AMDGPUPTR(pScrn) ((AMDGPUInfoPtr)(pScrn)->driverPrivate) 216d6c0b56eSmrg 217d6c0b56eSmrg#define CURSOR_WIDTH 64 218d6c0b56eSmrg#define CURSOR_HEIGHT 64 219d6c0b56eSmrg 220d6c0b56eSmrg#define CURSOR_WIDTH_CIK 128 221d6c0b56eSmrg#define CURSOR_HEIGHT_CIK 128 222d6c0b56eSmrg 223d6c0b56eSmrg#define AMDGPU_BO_FLAGS_GBM 0x1 224d6c0b56eSmrg 225d6c0b56eSmrgstruct amdgpu_buffer { 226d6c0b56eSmrg union { 227d6c0b56eSmrg struct gbm_bo *gbm; 228d6c0b56eSmrg amdgpu_bo_handle amdgpu; 229d6c0b56eSmrg } bo; 230d6c0b56eSmrg void *cpu_ptr; 231d6c0b56eSmrg uint32_t ref_count; 232d6c0b56eSmrg uint32_t flags; 233d6c0b56eSmrg}; 234d6c0b56eSmrg 235504d986fSmrgstruct amdgpu_client_priv { 236504d986fSmrg uint_fast32_t needs_flush; 237504d986fSmrg}; 238504d986fSmrg 23924b90cf4Smrgstruct amdgpu_device_priv { 24024b90cf4Smrg CursorPtr cursor; 24124b90cf4Smrg Bool sprite_visible; 24224b90cf4Smrg}; 24324b90cf4Smrg 24490f2b693Smrgstruct amdgpu_window_priv { 24590f2b693Smrg Bool variable_refresh; 24690f2b693Smrg}; 24790f2b693Smrg 24824b90cf4Smrgextern DevScreenPrivateKeyRec amdgpu_device_private_key; 24924b90cf4Smrg 250d6c0b56eSmrgtypedef struct { 251d6c0b56eSmrg EntityInfoPtr pEnt; 25211bf0794Smrg uint32_t family; 253d6c0b56eSmrg struct gbm_device *gbm; 254d6c0b56eSmrg 25524b90cf4Smrg Bool(*CloseScreen) (ScreenPtr pScreen); 256d6c0b56eSmrg 257d6c0b56eSmrg void (*BlockHandler) (BLOCKHANDLER_ARGS_DECL); 258d6c0b56eSmrg 259d6c0b56eSmrg void (*CreateFence) (ScreenPtr pScreen, struct _SyncFence *pFence, 260d6c0b56eSmrg Bool initially_triggered); 261d6c0b56eSmrg 262d6c0b56eSmrg int pix24bpp; /* Depth of pixmap for 24bpp fb */ 263d6c0b56eSmrg Bool dac6bits; /* Use 6 bit DAC? */ 264d6c0b56eSmrg 265d6c0b56eSmrg int pixel_bytes; 266d6c0b56eSmrg 267d6c0b56eSmrg Bool directRenderingEnabled; 268d6c0b56eSmrg struct amdgpu_dri2 dri2; 269d6c0b56eSmrg 270d6c0b56eSmrg /* accel */ 271504d986fSmrg int callback_event_type; 272d6c0b56eSmrg uint_fast32_t gpu_flushed; 273d6c0b56eSmrg uint_fast32_t gpu_synced; 274d6c0b56eSmrg Bool use_glamor; 275d6c0b56eSmrg Bool force_accel; 276d6c0b56eSmrg Bool shadow_primary; 27790f2b693Smrg Bool vrr_support; 27811bf0794Smrg int tear_free; 279d6c0b56eSmrg 280d6c0b56eSmrg /* general */ 281d6c0b56eSmrg OptionInfoPtr Options; 282d6c0b56eSmrg 283d6c0b56eSmrg DisplayModePtr currentMode; 284d6c0b56eSmrg 285d6c0b56eSmrg CreateScreenResourcesProcPtr CreateScreenResources; 286d6c0b56eSmrg CreateWindowProcPtr CreateWindow; 28711bf0794Smrg WindowExposuresProcPtr WindowExposures; 28835d5b7c7Smrg miPointerSpriteFuncPtr SpriteFuncs; 28924b90cf4Smrg 29024b90cf4Smrg /* Number of SW cursors currently visible on this screen */ 29124b90cf4Smrg int sprites_visible; 292d6c0b56eSmrg 29390f2b693Smrg int instance_id; 294d6c0b56eSmrg 295d6c0b56eSmrg Bool shadow_fb; 296d6c0b56eSmrg void *fb_shadow; 297d6c0b56eSmrg struct amdgpu_buffer *front_buffer; 298d6c0b56eSmrg 299d6c0b56eSmrg uint64_t vram_size; 300d6c0b56eSmrg uint64_t gart_size; 301d6c0b56eSmrg drmmode_rec drmmode; 302d6c0b56eSmrg Bool drmmode_inited; 303d6c0b56eSmrg /* r6xx+ tile config */ 304d6c0b56eSmrg Bool have_tiling_info; 305d6c0b56eSmrg int group_bytes; 306d6c0b56eSmrg 307d6c0b56eSmrg /* kms pageflipping */ 30890f2b693Smrg WindowPtr flip_window; 309d6c0b56eSmrg Bool allowPageFlip; 310e49c54bcSmrg Bool can_async_flip; 311e49c54bcSmrg Bool async_flip_secondaries; 312d6c0b56eSmrg 313d6c0b56eSmrg /* cursor size */ 314d6c0b56eSmrg int cursor_w; 315d6c0b56eSmrg int cursor_h; 316d6c0b56eSmrg 317d6c0b56eSmrg /* If bit n of this field is set, xf86_config->crtc[n] currently can't 318d6c0b56eSmrg * use the HW cursor 319d6c0b56eSmrg */ 320d6c0b56eSmrg unsigned hwcursor_disabled; 321d6c0b56eSmrg 322d6c0b56eSmrg struct { 323d6c0b56eSmrg CreateGCProcPtr SavedCreateGC; 324d6c0b56eSmrg RegionPtr (*SavedCopyArea)(DrawablePtr, DrawablePtr, GCPtr, 325d6c0b56eSmrg int, int, int, int, int, int); 326d6c0b56eSmrg void (*SavedPolyFillRect)(DrawablePtr, GCPtr, int, xRectangle*); 327d6c0b56eSmrg CloseScreenProcPtr SavedCloseScreen; 328d6c0b56eSmrg GetImageProcPtr SavedGetImage; 329d6c0b56eSmrg GetSpansProcPtr SavedGetSpans; 330d6c0b56eSmrg CreatePixmapProcPtr SavedCreatePixmap; 331d6c0b56eSmrg DestroyPixmapProcPtr SavedDestroyPixmap; 332d6c0b56eSmrg CopyWindowProcPtr SavedCopyWindow; 333d6c0b56eSmrg ChangeWindowAttributesProcPtr SavedChangeWindowAttributes; 334d6c0b56eSmrg BitmapToRegionProcPtr SavedBitmapToRegion; 335d6c0b56eSmrg#ifdef RENDER 336d6c0b56eSmrg CompositeProcPtr SavedComposite; 337d6c0b56eSmrg TrianglesProcPtr SavedTriangles; 338d6c0b56eSmrg GlyphsProcPtr SavedGlyphs; 339d6c0b56eSmrg TrapezoidsProcPtr SavedTrapezoids; 340d6c0b56eSmrg AddTrapsProcPtr SavedAddTraps; 341d6c0b56eSmrg UnrealizeGlyphProcPtr SavedUnrealizeGlyph; 342d6c0b56eSmrg#endif 343d6c0b56eSmrg SharePixmapBackingProcPtr SavedSharePixmapBacking; 344d6c0b56eSmrg SetSharedPixmapBackingProcPtr SavedSetSharedPixmapBacking; 345d6c0b56eSmrg } glamor; 346d6c0b56eSmrg 34724b90cf4Smrg xf86CrtcFuncsRec drmmode_crtc_funcs; 348d6c0b56eSmrg} AMDGPUInfoRec, *AMDGPUInfoPtr; 349d6c0b56eSmrg 350d6c0b56eSmrg 351d6c0b56eSmrg/* amdgpu_dri3.c */ 352d6c0b56eSmrgBool amdgpu_dri3_screen_init(ScreenPtr screen); 353d6c0b56eSmrg 354d6c0b56eSmrg/* amdgpu_kms.c */ 35590f2b693SmrgBool amdgpu_window_has_variable_refresh(WindowPtr win); 35624b90cf4SmrgBool amdgpu_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id, 35735d5b7c7Smrg PixmapPtr src_pix, BoxRec extents); 35824b90cf4Smrgvoid AMDGPUWindowExposures_oneshot(WindowPtr pWin, RegionPtr pRegion 35924b90cf4Smrg#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,16,99,901,0) 36024b90cf4Smrg , RegionPtr pBSRegion 36124b90cf4Smrg#endif 36224b90cf4Smrg ); 363d6c0b56eSmrg 364d6c0b56eSmrg/* amdgpu_present.c */ 36590f2b693Smrgvoid amdgpu_present_set_screen_vrr(ScrnInfoPtr scrn, Bool vrr_enabled); 366d6c0b56eSmrgBool amdgpu_present_screen_init(ScreenPtr screen); 367d6c0b56eSmrg 368d6c0b56eSmrg/* amdgpu_sync.c */ 369d6c0b56eSmrgextern Bool amdgpu_sync_init(ScreenPtr screen); 370d6c0b56eSmrgextern void amdgpu_sync_close(ScreenPtr screen); 371d6c0b56eSmrg 372d6c0b56eSmrg/* amdgpu_video.c */ 373d6c0b56eSmrgextern void AMDGPUInitVideo(ScreenPtr pScreen); 374d6c0b56eSmrgextern void AMDGPUResetVideo(ScrnInfoPtr pScrn); 375e49c54bcSmrgextern xf86CrtcPtr amdgpu_pick_best_crtc(ScreenPtr pScreen, 376d6c0b56eSmrg int x1, int x2, int y1, int y2); 377e49c54bcSmrgextern RRCrtcPtr amdgpu_randr_crtc_covering_drawable(DrawablePtr pDraw); 378d6c0b56eSmrg 379d6c0b56eSmrgextern AMDGPUEntPtr AMDGPUEntPriv(ScrnInfoPtr pScrn); 380d6c0b56eSmrg 381d6c0b56eSmrg#endif /* _AMDGPU_DRV_H_ */ 382