123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067 |
- #ifndef __ADRENO_H
- #define __ADRENO_H
- #include <linux/iopoll.h>
- #include <linux/of.h>
- #include <linux/soc/qcom/llcc-qcom.h>
- #include "adreno_coresight.h"
- #include "adreno_dispatch.h"
- #include "adreno_drawctxt.h"
- #include "adreno_hfi.h"
- #include "adreno_hwsched.h"
- #include "adreno_perfcounter.h"
- #include "adreno_profile.h"
- #include "adreno_ringbuffer.h"
- #include "kgsl_sharedmem.h"
- #define SET_PSEUDO_SMMU_INFO 0
- #define SET_PSEUDO_PRIV_NON_SECURE_SAVE_ADDR 1
- #define SET_PSEUDO_PRIV_SECURE_SAVE_ADDR 2
- #define SET_PSEUDO_NON_PRIV_SAVE_ADDR 3
- #define SET_PSEUDO_COUNTER 4
- #define QOS_VALUE_IDX KGSL_PRIORITY_MAX_RB_LEVELS
- #define ADRENO_DEVICE(device) \
- container_of(device, struct adreno_device, dev)
- #define KGSL_DEVICE(_dev) (&((_dev)->dev))
- #define ADRENO_CONTEXT(context) \
- container_of(context, struct adreno_context, base)
- #define ADRENO_GPU_DEVICE(_a) ((_a)->gpucore->gpudev)
- #define ADRENO_POWER_OPS(_a) ((_a)->gpucore->gpudev->power_ops)
- #define ADRENO_CHIPID_CORE(_id) FIELD_GET(GENMASK(31, 24), _id)
- #define ADRENO_CHIPID_MAJOR(_id) FIELD_GET(GENMASK(23, 16), _id)
- #define ADRENO_CHIPID_MINOR(_id) FIELD_GET(GENMASK(15, 8), _id)
- #define ADRENO_CHIPID_PATCH(_id) FIELD_GET(GENMASK(7, 0), _id)
- #define ADRENO_GMU_CHIPID(_id) \
- (FIELD_PREP(GENMASK(31, 24), ADRENO_CHIPID_CORE(_id)) | \
- FIELD_PREP(GENMASK(23, 16), ADRENO_CHIPID_MAJOR(_id)) | \
- FIELD_PREP(GENMASK(15, 12), ADRENO_CHIPID_MINOR(_id)) | \
- FIELD_PREP(GENMASK(11, 8), ADRENO_CHIPID_PATCH(_id)))
- #define ADRENO_REV_MAJOR(_rev) FIELD_GET(GENMASK(23, 16), _rev)
- #define ADRENO_REV_MINOR(_rev) FIELD_GET(GENMASK(15, 8), _rev)
- #define ADRENO_REV_PATCH(_rev) FIELD_GET(GENMASK(7, 0), _rev)
- #define ADRENO_GMU_REV(_rev) \
- (FIELD_PREP(GENMASK(31, 24), ADRENO_REV_MAJOR(_rev)) | \
- FIELD_PREP(GENMASK(23, 16), ADRENO_REV_MINOR(_rev)) | \
- FIELD_PREP(GENMASK(15, 8), ADRENO_REV_PATCH(_rev)))
- #define ADRENO_GPUREV(_a) ((_a)->gpucore->gpurev)
- #define ADRENO_FEATURE(_dev, _bit) \
- ((_dev)->gpucore->features & (_bit))
- #define ADRENO_QUIRK(_dev, _bit) \
- ((_dev)->quirks & (_bit))
- #define ADRENO_FW(a, f) (&(a->fw[f]))
- #define ADRENO_SPTP_PC BIT(0)
- #define ADRENO_CONTENT_PROTECTION BIT(1)
- #define ADRENO_PREEMPTION BIT(2)
- #define ADRENO_LM BIT(3)
- #define ADRENO_CPZ_RETENTION BIT(4)
- #define ADRENO_SOFT_FAULT_DETECT BIT(5)
- #define ADRENO_IFPC BIT(6)
- #define ADRENO_IOCOHERENT BIT(7)
- #define ADRENO_ACD BIT(8)
- #define ADRENO_COOP_RESET BIT(9)
- #define ADRENO_DEPRECATED BIT(10)
- #define ADRENO_APRIV BIT(11)
- #define ADRENO_BCL BIT(12)
- #define ADRENO_L3_VOTE BIT(13)
- #define ADRENO_LPAC BIT(14)
- #define ADRENO_LSR BIT(15)
- #define ADRENO_HW_FENCE BIT(16)
- #define ADRENO_DMS BIT(17)
- #define ADRENO_AQE BIT(18)
- #define ADRENO_GMU_WARMBOOT BIT(19)
- #define ADRENO_CLX BIT(20)
- #define ADRENO_QUIRK_TWO_PASS_USE_WFI BIT(0)
- #define ADRENO_QUIRK_CRITICAL_PACKETS BIT(1)
- #define ADRENO_QUIRK_FAULT_DETECT_MASK BIT(2)
- #define ADRENO_QUIRK_DISABLE_RB_DP2CLOCKGATING BIT(3)
- #define ADRENO_QUIRK_DISABLE_LMLOADKILL BIT(4)
- #define ADRENO_QUIRK_HFI_USE_REG BIT(5)
- #define ADRENO_QUIRK_SECVID_SET_ONCE BIT(6)
- #define ADRENO_QUIRK_LIMIT_UCHE_GBIF_RW BIT(8)
- #define ADRENO_QUIRK_CX_GDSC BIT(9)
- #define CONTEXT_TO_MEM_IDENTIFIER 0x2EADBEEF
- #define CMD_IDENTIFIER 0x2EEDFACE
- #define CMD_INTERNAL_IDENTIFIER 0x2EEDD00D
- #define START_IB_IDENTIFIER 0x2EADEABE
- #define END_IB_IDENTIFIER 0x2ABEDEAD
- #define START_PROFILE_IDENTIFIER 0x2DEFADE1
- #define END_PROFILE_IDENTIFIER 0x2DEFADE2
- #define PWRON_FIXUP_IDENTIFIER 0x2AFAFAFA
- #define ADRENO_IDLE_TIMEOUT (20 * 1000)
- #define ADRENO_FW_PFP 0
- #define ADRENO_FW_SQE 0
- #define ADRENO_FW_PM4 1
- #define ADRENO_FW_AQE 1
- #define ADRENO_GPUREV_VALUE(_major, _minor, _patchid) (((_major & 0xFF) << 16) | \
- ((_minor & 0xFF) << 8) | \
- (_patchid & 0xFF))
- enum adreno_gpurev {
- ADRENO_REV_UNKNOWN = 0,
- ADRENO_REV_A304 = 304,
- ADRENO_REV_A305 = 305,
- ADRENO_REV_A305C = 306,
- ADRENO_REV_A306 = 307,
- ADRENO_REV_A306A = 308,
- ADRENO_REV_A310 = 310,
- ADRENO_REV_A320 = 320,
- ADRENO_REV_A330 = 330,
- ADRENO_REV_A305B = 335,
- ADRENO_REV_A405 = 405,
- ADRENO_REV_A418 = 418,
- ADRENO_REV_A420 = 420,
- ADRENO_REV_A430 = 430,
- ADRENO_REV_A505 = 505,
- ADRENO_REV_A506 = 506,
- ADRENO_REV_A508 = 508,
- ADRENO_REV_A510 = 510,
- ADRENO_REV_A512 = 512,
- ADRENO_REV_A530 = 530,
- ADRENO_REV_A540 = 540,
- ADRENO_REV_A610 = 610,
- ADRENO_REV_A611 = 611,
- ADRENO_REV_A612 = 612,
- ADRENO_REV_A615 = 615,
- ADRENO_REV_A616 = 616,
- ADRENO_REV_A618 = 618,
- ADRENO_REV_A619 = 619,
- ADRENO_REV_A620 = 620,
- ADRENO_REV_A621 = 621,
- ADRENO_REV_A630 = 630,
- ADRENO_REV_A635 = 635,
- ADRENO_REV_A640 = 640,
- ADRENO_REV_A650 = 650,
- ADRENO_REV_A660 = 660,
- ADRENO_REV_A662 = 662,
- ADRENO_REV_A663 = 663,
- ADRENO_REV_A680 = 680,
- ADRENO_REV_A702 = 702,
-
- ADRENO_REV_GEN7_0_0 = ADRENO_GPUREV_VALUE(7, 0, 0),
- ADRENO_REV_GEN7_0_1 = ADRENO_GPUREV_VALUE(7, 0, 1),
- ADRENO_REV_GEN7_2_0 = ADRENO_GPUREV_VALUE(7, 2, 0),
- ADRENO_REV_GEN7_2_1 = ADRENO_GPUREV_VALUE(7, 2, 1),
- ADRENO_REV_GEN7_4_0 = ADRENO_GPUREV_VALUE(7, 4, 0),
- ADRENO_REV_GEN7_9_0 = ADRENO_GPUREV_VALUE(7, 9, 0),
- ADRENO_REV_GEN7_9_1 = ADRENO_GPUREV_VALUE(7, 9, 1),
- ADRENO_REV_GEN7_11_0 = ADRENO_GPUREV_VALUE(7, 11, 0),
- ADRENO_REV_GEN8_3_0 = ADRENO_GPUREV_VALUE(8, 3, 0),
- };
- #define ADRENO_SOFT_FAULT BIT(0)
- #define ADRENO_HARD_FAULT BIT(1)
- #define ADRENO_TIMEOUT_FAULT BIT(2)
- #define ADRENO_IOMMU_PAGE_FAULT BIT(3)
- #define ADRENO_PREEMPT_FAULT BIT(4)
- #define ADRENO_GMU_FAULT BIT(5)
- #define ADRENO_CTX_DETATCH_TIMEOUT_FAULT BIT(6)
- #define ADRENO_GMU_FAULT_SKIP_SNAPSHOT BIT(7)
- enum adreno_pipe_type {
- PIPE_NONE = 0,
- PIPE_BR = 1,
- PIPE_BV = 2,
- PIPE_LPAC = 3,
- PIPE_AQE0 = 4,
- PIPE_AQE1 = 5,
- PIPE_DDE_BR = 6,
- PIPE_DDE_BV = 7,
- };
- #define ADRENO_AHB_CNTL_DEFAULT (BIT(12) | BIT(11) | BIT(9) | BIT(8))
- #define ADRENO_GPMU_THROTTLE_COUNTERS 4
- struct adreno_gpudev;
- #define ADRENO_PREEMPT_TIMEOUT 10000
- #define PREEMPT_SCRATCH_OFFSET(id) (id * sizeof(u64))
- #define PREEMPT_SCRATCH_ADDR(dev, id) \
- ((dev)->preempt.scratch->gpuaddr + PREEMPT_SCRATCH_OFFSET(id))
- enum adreno_preempt_states {
- ADRENO_PREEMPT_NONE = 0,
- ADRENO_PREEMPT_START,
- ADRENO_PREEMPT_TRIGGERED,
- ADRENO_PREEMPT_FAULTED,
- ADRENO_PREEMPT_PENDING,
- ADRENO_PREEMPT_COMPLETE,
- };
- struct adreno_protected_regs {
-
- u32 reg;
-
- u32 start;
-
- u32 end;
-
- u32 noaccess;
- };
- struct adreno_preemption {
- atomic_t state;
- struct kgsl_memdesc *scratch;
- struct timer_list timer;
- struct work_struct work;
- unsigned int preempt_level;
- bool skipsaverestore;
- bool usesgmem;
- unsigned int count;
-
- u32 postamble_len;
-
- u32 postamble_bootup_len;
- };
- struct adreno_busy_data {
- unsigned int gpu_busy;
- unsigned int bif_ram_cycles;
- unsigned int bif_ram_cycles_read_ch1;
- unsigned int bif_ram_cycles_write_ch0;
- unsigned int bif_ram_cycles_write_ch1;
- unsigned int bif_starved_ram;
- unsigned int bif_starved_ram_ch1;
- unsigned int num_ifpc;
- unsigned int throttle_cycles[ADRENO_GPMU_THROTTLE_COUNTERS];
- u32 bcl_throttle;
- };
- struct adreno_firmware {
- unsigned int *fwvirt;
- size_t size;
- unsigned int version;
- struct kgsl_memdesc *memdesc;
- };
- struct adreno_perfcounter_list_node {
- unsigned int groupid;
- unsigned int countable;
- struct list_head node;
- };
- struct adreno_device_private {
- struct kgsl_device_private dev_priv;
- struct list_head perfcounter_list;
- };
- struct adreno_reglist_list {
-
- const u32 *regs;
-
- u32 count;
- };
- struct adreno_power_ops {
-
- int (*first_open)(struct adreno_device *adreno_dev);
-
- int (*last_close)(struct adreno_device *adreno_dev);
-
- int (*active_count_get)(struct adreno_device *adreno_dev);
-
- void (*active_count_put)(struct adreno_device *adreno_dev);
-
- int (*pm_suspend)(struct adreno_device *adreno_dev);
-
- void (*pm_resume)(struct adreno_device *adreno_dev);
-
- void (*touch_wakeup)(struct adreno_device *adreno_dev);
-
- int (*gpu_clock_set)(struct adreno_device *adreno_dev, u32 pwrlevel);
-
- int (*gpu_bus_set)(struct adreno_device *adreno_dev, int bus_level,
- u32 ab);
- };
- struct adreno_gpu_core {
- enum adreno_gpurev gpurev;
- unsigned int core, major, minor, patchid;
-
- const char *compatible;
- unsigned long features;
- const struct adreno_gpudev *gpudev;
- const struct adreno_perfcounters *perfcounters;
- u32 uche_gmem_alignment;
- size_t gmem_size;
- u32 bus_width;
-
- u32 snapshot_size;
-
- u32 num_ddr_channels;
- };
- struct adreno_dispatch_ops {
-
- void (*close)(struct adreno_device *adreno_dev);
-
- int (*queue_cmds)(struct kgsl_device_private *dev_priv,
- struct kgsl_context *context, struct kgsl_drawobj *drawobj[],
- u32 count, u32 *timestamp);
-
- void (*queue_context)(struct adreno_device *adreno_dev,
- struct adreno_context *drawctxt);
- void (*setup_context)(struct adreno_device *adreno_dev,
- struct adreno_context *drawctxt);
- void (*fault)(struct adreno_device *adreno_dev, u32 fault);
-
- void (*create_hw_fence)(struct adreno_device *adreno_dev, struct kgsl_sync_fence *kfence);
-
- u32 (*get_fault)(struct adreno_device *adreno_dev);
- };
- struct adreno_device {
- struct kgsl_device dev;
- unsigned long priv;
- unsigned int chipid;
-
- u64 uche_gmem_base;
- unsigned int cx_misc_len;
- void __iomem *cx_misc_virt;
- unsigned long isense_base;
- unsigned int isense_len;
- void __iomem *isense_virt;
- const struct adreno_gpu_core *gpucore;
- struct adreno_firmware fw[2];
- size_t gpmu_cmds_size;
- unsigned int *gpmu_cmds;
- struct adreno_ringbuffer ringbuffers[KGSL_PRIORITY_MAX_RB_LEVELS];
- int num_ringbuffers;
- struct adreno_ringbuffer *cur_rb;
- struct adreno_ringbuffer *next_rb;
- struct adreno_ringbuffer *prev_rb;
- unsigned int fast_hang_detect;
- unsigned long ft_policy;
- bool long_ib_detect;
- bool cooperative_reset;
- struct adreno_profile profile;
- struct adreno_dispatcher dispatcher;
- struct kgsl_memdesc *pwron_fixup;
- unsigned int pwron_fixup_dwords;
- struct work_struct input_work;
- struct adreno_busy_data busy_data;
- unsigned int ram_cycles_lo;
- unsigned int ram_cycles_lo_ch1_read;
- unsigned int ram_cycles_lo_ch0_write;
- unsigned int ram_cycles_lo_ch1_write;
- unsigned int starved_ram_lo;
- unsigned int starved_ram_lo_ch1;
- atomic_t halt;
- atomic_t pending_irq_refcnt;
- struct dentry *ctx_d_debugfs;
-
- bool lm_enabled;
-
- bool acd_enabled;
-
- bool hwcg_enabled;
-
- bool throttling_enabled;
-
- bool sptp_pc_enabled;
-
- bool bcl_enabled;
-
- bool clx_enabled;
-
- bool lpac_enabled;
-
- bool dms_enabled;
-
- bool warmboot_enabled;
-
- bool preempt_override;
- struct kgsl_memdesc *profile_buffer;
- unsigned int profile_index;
- struct kgsl_memdesc *pwrup_reglist;
- uint32_t *lm_sequence;
- uint32_t lm_size;
- struct adreno_preemption preempt;
- struct work_struct gpmu_work;
- uint32_t lm_leakage;
- uint32_t lm_limit;
- uint32_t lm_threshold_count;
- uint32_t lm_threshold_cross;
- uint32_t ifpc_count;
- unsigned int highest_bank_bit;
- unsigned int quirks;
- #ifdef CONFIG_QCOM_KGSL_CORESIGHT
-
- struct adreno_coresight_device gx_coresight;
-
- struct adreno_coresight_device cx_coresight;
-
- struct adreno_funnel_device funnel_gfx;
- #endif
- uint32_t gpmu_throttle_counters[ADRENO_GPMU_THROTTLE_COUNTERS];
- struct work_struct irq_storm_work;
- struct list_head active_list;
- spinlock_t active_list_lock;
- void *gpu_llc_slice;
- bool gpu_llc_slice_enable;
- void *gpuhtw_llc_slice;
- bool gpuhtw_llc_slice_enable;
- unsigned int zap_loaded;
-
- struct kgsl_memdesc *critpkts;
-
- struct kgsl_memdesc *critpkts_secure;
-
- u32 irq_mask;
-
- u32 *soft_ft_regs;
-
- u32 *soft_ft_vals;
-
- int soft_ft_count;
-
- const struct adreno_dispatch_ops *dispatch_ops;
-
- struct adreno_hwsched hwsched;
-
- bool perfcounter;
-
- u64 gmu_hub_clk_freq;
-
- bool patch_reglist;
-
- u32 uche_client_pf;
-
- u32 bcl_data;
-
- struct dentry *bcl_debugfs_dir;
-
- u32 bcl_throttle_time_us;
-
- struct dentry *preemption_debugfs_dir;
-
- bool hwsched_enabled;
-
- bool fastblend_enabled;
-
- bool raytracing_enabled;
-
- u32 feature_fuse;
-
- bool gmu_ab;
-
- u32 ifpc_hyst;
-
- u32 ifpc_hyst_floor;
-
- u32 cx_misc_base;
-
- u32 no_restore_count;
-
- u32 ahb_timeout_val;
- };
- enum adreno_device_flags {
- ADRENO_DEVICE_PWRON = 0,
- ADRENO_DEVICE_PWRON_FIXUP = 1,
- ADRENO_DEVICE_INITIALIZED = 2,
- ADRENO_DEVICE_STARTED = 5,
- ADRENO_DEVICE_FAULT = 6,
- ADRENO_DEVICE_DRAWOBJ_PROFILE = 7,
- ADRENO_DEVICE_GPU_REGULATOR_ENABLED = 8,
- ADRENO_DEVICE_PREEMPTION = 9,
- ADRENO_DEVICE_SOFT_FAULT_DETECT = 10,
- ADRENO_DEVICE_GPMU_INITIALIZED = 11,
- ADRENO_DEVICE_ISDB_ENABLED = 12,
- ADRENO_DEVICE_CACHE_FLUSH_TS_SUSPENDED = 13,
-
- ADRENO_DEVICE_DMS = 14,
-
- ADRENO_DEVICE_GMU_AB = 15,
-
- ADRENO_DEVICE_FORCE_COLDBOOT = 16,
-
- ADRENO_DEVICE_CX_TIMER_INITIALIZED = 17,
- };
- struct adreno_drawobj_profile_entry {
- uint64_t started;
- uint64_t retired;
- uint64_t ctx_start;
- uint64_t ctx_end;
- };
- #define ADRENO_DRAWOBJ_PROFILE_OFFSET(_index, _member) \
- ((_index) * sizeof(struct adreno_drawobj_profile_entry) \
- + offsetof(struct adreno_drawobj_profile_entry, _member))
- enum adreno_regs {
- ADRENO_REG_CP_ME_RAM_DATA,
- ADRENO_REG_CP_RB_BASE,
- ADRENO_REG_CP_RB_BASE_HI,
- ADRENO_REG_CP_RB_RPTR_ADDR_LO,
- ADRENO_REG_CP_RB_RPTR_ADDR_HI,
- ADRENO_REG_CP_RB_RPTR,
- ADRENO_REG_CP_RB_WPTR,
- ADRENO_REG_CP_ME_CNTL,
- ADRENO_REG_CP_RB_CNTL,
- ADRENO_REG_CP_IB1_BASE,
- ADRENO_REG_CP_IB1_BASE_HI,
- ADRENO_REG_CP_IB1_BUFSZ,
- ADRENO_REG_CP_IB2_BASE,
- ADRENO_REG_CP_IB2_BASE_HI,
- ADRENO_REG_CP_IB2_BUFSZ,
- ADRENO_REG_CP_TIMESTAMP,
- ADRENO_REG_CP_SCRATCH_REG6,
- ADRENO_REG_CP_SCRATCH_REG7,
- ADRENO_REG_CP_PROTECT_STATUS,
- ADRENO_REG_CP_PREEMPT,
- ADRENO_REG_CP_PREEMPT_DEBUG,
- ADRENO_REG_CP_PREEMPT_DISABLE,
- ADRENO_REG_CP_PROTECT_REG_0,
- ADRENO_REG_CP_CONTEXT_SWITCH_SMMU_INFO_LO,
- ADRENO_REG_CP_CONTEXT_SWITCH_SMMU_INFO_HI,
- ADRENO_REG_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR_LO,
- ADRENO_REG_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR_HI,
- ADRENO_REG_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR_LO,
- ADRENO_REG_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR_HI,
- ADRENO_REG_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR_LO,
- ADRENO_REG_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR_HI,
- ADRENO_REG_CP_PREEMPT_LEVEL_STATUS,
- ADRENO_REG_RBBM_STATUS,
- ADRENO_REG_RBBM_STATUS3,
- ADRENO_REG_RBBM_PERFCTR_LOAD_CMD0,
- ADRENO_REG_RBBM_PERFCTR_LOAD_CMD1,
- ADRENO_REG_RBBM_PERFCTR_LOAD_CMD2,
- ADRENO_REG_RBBM_PERFCTR_LOAD_CMD3,
- ADRENO_REG_RBBM_PERFCTR_PWR_1_LO,
- ADRENO_REG_RBBM_INT_0_MASK,
- ADRENO_REG_RBBM_PM_OVERRIDE2,
- ADRENO_REG_RBBM_SW_RESET_CMD,
- ADRENO_REG_RBBM_CLOCK_CTL,
- ADRENO_REG_PA_SC_AA_CONFIG,
- ADRENO_REG_SQ_GPR_MANAGEMENT,
- ADRENO_REG_SQ_INST_STORE_MANAGEMENT,
- ADRENO_REG_TP0_CHICKEN,
- ADRENO_REG_RBBM_PERFCTR_LOAD_VALUE_LO,
- ADRENO_REG_RBBM_PERFCTR_LOAD_VALUE_HI,
- ADRENO_REG_GMU_AO_HOST_INTERRUPT_MASK,
- ADRENO_REG_GMU_AHB_FENCE_STATUS,
- ADRENO_REG_GMU_GMU2HOST_INTR_MASK,
- ADRENO_REG_GPMU_POWER_COUNTER_ENABLE,
- ADRENO_REG_REGISTER_MAX,
- };
- #define ADRENO_REG_UNUSED 0xFFFFFFFF
- #define ADRENO_REG_SKIP 0xFFFFFFFE
- #define ADRENO_REG_DEFINE(_offset, _reg)[_offset] = _reg
- struct adreno_irq_funcs {
- void (*func)(struct adreno_device *adreno_dev, int mask);
- };
- #define ADRENO_IRQ_CALLBACK(_c) { .func = _c }
- struct adreno_debugbus_block {
- unsigned int block_id;
- unsigned int dwords;
- };
- enum adreno_cp_marker_type {
- IFPC_DISABLE,
- IFPC_ENABLE,
- IB1LIST_START,
- IB1LIST_END,
- };
- struct adreno_gpudev {
-
- unsigned int *const reg_offsets;
-
- int (*probe)(struct platform_device *pdev, u32 chipid,
- const struct adreno_gpu_core *gpucore);
- void (*snapshot)(struct adreno_device *adreno_dev,
- struct kgsl_snapshot *snapshot);
- irqreturn_t (*irq_handler)(struct adreno_device *adreno_dev);
- int (*init)(struct adreno_device *adreno_dev);
- void (*remove)(struct adreno_device *adreno_dev);
- int (*rb_start)(struct adreno_device *adreno_dev);
- int (*start)(struct adreno_device *adreno_dev);
- int (*regulator_enable)(struct adreno_device *adreno_dev);
- void (*regulator_disable)(struct adreno_device *adreno_dev);
- void (*pwrlevel_change_settings)(struct adreno_device *adreno_dev,
- unsigned int prelevel, unsigned int postlevel,
- bool post);
- void (*preemption_schedule)(struct adreno_device *adreno_dev);
- int (*preemption_context_init)(struct kgsl_context *context);
- void (*context_detach)(struct adreno_context *drawctxt);
- void (*pre_reset)(struct adreno_device *adreno_dev);
- void (*gpu_keepalive)(struct adreno_device *adreno_dev,
- bool state);
- bool (*hw_isidle)(struct adreno_device *adreno_dev);
- const char *(*iommu_fault_block)(struct kgsl_device *device,
- unsigned int fsynr1);
- int (*reset)(struct adreno_device *adreno_dev);
-
- u64 (*read_alwayson)(struct adreno_device *adreno_dev);
-
- const struct adreno_power_ops *power_ops;
- int (*clear_pending_transactions)(struct adreno_device *adreno_dev);
- void (*deassert_gbif_halt)(struct adreno_device *adreno_dev);
- int (*ringbuffer_submitcmd)(struct adreno_device *adreno_dev,
- struct kgsl_drawobj_cmd *cmdobj, u32 flags,
- struct adreno_submit_time *time);
-
- bool (*is_hw_collapsible)(struct adreno_device *adreno_dev);
-
- void (*power_stats)(struct adreno_device *adreno_dev,
- struct kgsl_power_stats *stats);
- int (*setproperty)(struct kgsl_device_private *priv, u32 type,
- void __user *value, u32 sizebytes);
- int (*add_to_va_minidump)(struct adreno_device *adreno_dev);
-
- bool (*gx_is_on)(struct adreno_device *adreno_dev);
-
- int (*send_recurring_cmdobj)(struct adreno_device *adreno_dev,
- struct kgsl_drawobj_cmd *cmdobj);
-
- int (*perfcounter_remove)(struct adreno_device *adreno_dev,
- struct adreno_perfcount_register *reg, u32 groupid);
-
- void (*set_isdb_breakpoint_registers)(struct adreno_device *adreno_dev);
-
- void (*context_destroy)(struct adreno_device *adreno_dev, struct adreno_context *drawctxt);
-
- void (*swfuse_irqctrl)(struct adreno_device *adreno_dev, bool state);
-
- int (*lpac_store)(struct adreno_device *adreno_dev, bool enable);
-
- u64 (*get_uche_trap_base)(void);
-
- void (*fault_header)(struct adreno_device *adreno_dev, struct kgsl_drawobj *drawobj);
-
- void (*lpac_fault_header)(struct adreno_device *adreno_dev, struct kgsl_drawobj *drawobj);
- };
- enum kgsl_ft_policy_bits {
- KGSL_FT_OFF = 0,
- KGSL_FT_REPLAY,
- KGSL_FT_SKIPIB,
- KGSL_FT_SKIPFRAME,
- KGSL_FT_DISABLE,
- KGSL_FT_TEMP_DISABLE,
- KGSL_FT_THROTTLE,
- KGSL_FT_SKIPCMD,
-
- KGSL_FT_MAX_BITS,
-
-
- KGSL_FT_SKIP_PMDUMP = 31,
- };
- #define KGSL_FT_POLICY_MASK GENMASK(KGSL_FT_MAX_BITS - 1, 0)
- #define FOR_EACH_RINGBUFFER(_dev, _rb, _i) \
- for ((_i) = 0, (_rb) = &((_dev)->ringbuffers[0]); \
- (_i) < (_dev)->num_ringbuffers; \
- (_i)++, (_rb)++)
- extern const struct adreno_power_ops adreno_power_operations;
- extern const struct adreno_gpudev adreno_a3xx_gpudev;
- extern const struct adreno_gpudev adreno_a5xx_gpudev;
- extern const struct adreno_gpudev adreno_a6xx_gpudev;
- extern const struct adreno_gpudev adreno_a6xx_rgmu_gpudev;
- extern const struct adreno_gpudev adreno_a619_holi_gpudev;
- extern const struct adreno_gpudev adreno_a611_gpudev;
- extern int adreno_wake_nice;
- extern unsigned int adreno_wake_timeout;
- int adreno_start(struct kgsl_device *device, int priority);
- long adreno_ioctl(struct kgsl_device_private *dev_priv,
- unsigned int cmd, unsigned long arg);
- long adreno_ioctl_helper(struct kgsl_device_private *dev_priv,
- unsigned int cmd, unsigned long arg,
- const struct kgsl_ioctl *cmds, int len);
- int adreno_spin_idle(struct adreno_device *device, unsigned int timeout);
- int adreno_idle(struct kgsl_device *device);
- int adreno_set_constraint(struct kgsl_device *device,
- struct kgsl_context *context,
- struct kgsl_device_constraint *constraint);
- void adreno_snapshot(struct kgsl_device *device,
- struct kgsl_snapshot *snapshot,
- struct kgsl_context *context, struct kgsl_context *context_lpac);
- int adreno_reset(struct kgsl_device *device, int fault);
- void adreno_fault_skipcmd_detached(struct adreno_device *adreno_dev,
- struct adreno_context *drawctxt,
- struct kgsl_drawobj *drawobj);
- void adreno_hang_int_callback(struct adreno_device *adreno_dev, int bit);
- void adreno_cp_callback(struct adreno_device *adreno_dev, int bit);
- int adreno_sysfs_init(struct adreno_device *adreno_dev);
- void adreno_irqctrl(struct adreno_device *adreno_dev, int state);
- long adreno_ioctl_perfcounter_get(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long adreno_ioctl_perfcounter_put(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- void adreno_cx_misc_regread(struct adreno_device *adreno_dev,
- unsigned int offsetwords, unsigned int *value);
- void adreno_cx_misc_regwrite(struct adreno_device *adreno_dev,
- unsigned int offsetwords, unsigned int value);
- void adreno_cx_misc_regrmw(struct adreno_device *adreno_dev,
- unsigned int offsetwords,
- unsigned int mask, unsigned int bits);
- void adreno_isense_regread(struct adreno_device *adreno_dev,
- unsigned int offsetwords, unsigned int *value);
- bool adreno_gx_is_on(struct adreno_device *adreno_dev);
- u64 adreno_read_cx_timer(struct adreno_device *adreno_dev);
- int adreno_active_count_get(struct adreno_device *adreno_dev);
- void adreno_active_count_put(struct adreno_device *adreno_dev);
- #define ADRENO_TARGET(_name, _id) \
- static inline int adreno_is_##_name(struct adreno_device *adreno_dev) \
- { \
- return (ADRENO_GPUREV(adreno_dev) == (_id)); \
- }
- static inline int adreno_is_a3xx(struct adreno_device *adreno_dev)
- {
- return ((ADRENO_GPUREV(adreno_dev) >= 300) &&
- (ADRENO_GPUREV(adreno_dev) < 400));
- }
- ADRENO_TARGET(a304, ADRENO_REV_A304)
- ADRENO_TARGET(a306, ADRENO_REV_A306)
- ADRENO_TARGET(a306a, ADRENO_REV_A306A)
- static inline int adreno_is_a5xx(struct adreno_device *adreno_dev)
- {
- return ADRENO_GPUREV(adreno_dev) >= 500 &&
- ADRENO_GPUREV(adreno_dev) < 600;
- }
- ADRENO_TARGET(a505, ADRENO_REV_A505)
- ADRENO_TARGET(a506, ADRENO_REV_A506)
- ADRENO_TARGET(a508, ADRENO_REV_A508)
- ADRENO_TARGET(a510, ADRENO_REV_A510)
- ADRENO_TARGET(a512, ADRENO_REV_A512)
- ADRENO_TARGET(a530, ADRENO_REV_A530)
- ADRENO_TARGET(a540, ADRENO_REV_A540)
- static inline int adreno_is_a530v2(struct adreno_device *adreno_dev)
- {
- return (ADRENO_GPUREV(adreno_dev) == ADRENO_REV_A530) &&
- (ADRENO_CHIPID_PATCH(adreno_dev->chipid) == 1);
- }
- static inline int adreno_is_a530v3(struct adreno_device *adreno_dev)
- {
- return (ADRENO_GPUREV(adreno_dev) == ADRENO_REV_A530) &&
- (ADRENO_CHIPID_PATCH(adreno_dev->chipid) == 2);
- }
- static inline int adreno_is_a505_or_a506(struct adreno_device *adreno_dev)
- {
- return ADRENO_GPUREV(adreno_dev) >= 505 &&
- ADRENO_GPUREV(adreno_dev) <= 506;
- }
- static inline int adreno_is_a6xx(struct adreno_device *adreno_dev)
- {
- return ADRENO_GPUREV(adreno_dev) >= 600 &&
- ADRENO_GPUREV(adreno_dev) <= 702;
- }
- static inline int adreno_is_a660_shima(struct adreno_device *adreno_dev)
- {
- return (ADRENO_GPUREV(adreno_dev) == ADRENO_REV_A660) &&
- (adreno_dev->gpucore->compatible &&
- !strcmp(adreno_dev->gpucore->compatible,
- "qcom,adreno-gpu-a660-shima"));
- }
- ADRENO_TARGET(a610, ADRENO_REV_A610)
- ADRENO_TARGET(a611, ADRENO_REV_A611)
- ADRENO_TARGET(a612, ADRENO_REV_A612)
- ADRENO_TARGET(a618, ADRENO_REV_A618)
- ADRENO_TARGET(a619, ADRENO_REV_A619)
- ADRENO_TARGET(a621, ADRENO_REV_A621)
- ADRENO_TARGET(a630, ADRENO_REV_A630)
- ADRENO_TARGET(a635, ADRENO_REV_A635)
- ADRENO_TARGET(a662, ADRENO_REV_A662)
- ADRENO_TARGET(a640, ADRENO_REV_A640)
- ADRENO_TARGET(a650, ADRENO_REV_A650)
- ADRENO_TARGET(a663, ADRENO_REV_A663)
- ADRENO_TARGET(a680, ADRENO_REV_A680)
- ADRENO_TARGET(a702, ADRENO_REV_A702)
- static inline int adreno_is_a660(struct adreno_device *adreno_dev)
- {
- unsigned int rev = ADRENO_GPUREV(adreno_dev);
- return (rev == ADRENO_REV_A660 || rev == ADRENO_REV_A635 ||
- rev == ADRENO_REV_A662);
- }
- static inline int adreno_is_a615_family(struct adreno_device *adreno_dev)
- {
- unsigned int rev = ADRENO_GPUREV(adreno_dev);
- return (rev == ADRENO_REV_A615 || rev == ADRENO_REV_A616 ||
- rev == ADRENO_REV_A618 || rev == ADRENO_REV_A619);
- }
- static inline int adreno_is_a640_family(struct adreno_device *adreno_dev)
- {
- unsigned int rev = ADRENO_GPUREV(adreno_dev);
- return (rev == ADRENO_REV_A640 || rev == ADRENO_REV_A680);
- }
- static inline int adreno_is_a650_family(struct adreno_device *adreno_dev)
- {
- unsigned int rev = ADRENO_GPUREV(adreno_dev);
- return (rev == ADRENO_REV_A650 || rev == ADRENO_REV_A620 ||
- rev == ADRENO_REV_A660 || rev == ADRENO_REV_A635 ||
- rev == ADRENO_REV_A662 || rev == ADRENO_REV_A621 ||
- rev == ADRENO_REV_A663);
- }
- static inline int adreno_is_a619_holi(struct adreno_device *adreno_dev)
- {
- return of_device_is_compatible(adreno_dev->dev.pdev->dev.of_node,
- "qcom,adreno-gpu-a619-holi");
- }
- static inline int adreno_is_a620(struct adreno_device *adreno_dev)
- {
- unsigned int rev = ADRENO_GPUREV(adreno_dev);
- return (rev == ADRENO_REV_A620 || rev == ADRENO_REV_A621);
- }
- static inline int adreno_is_a610_family(struct adreno_device *adreno_dev)
- {
- unsigned int rev = ADRENO_GPUREV(adreno_dev);
- return (rev == ADRENO_REV_A610 || rev == ADRENO_REV_A611);
- }
- static inline int adreno_is_a640v2(struct adreno_device *adreno_dev)
- {
- return (ADRENO_GPUREV(adreno_dev) == ADRENO_REV_A640) &&
- (ADRENO_CHIPID_PATCH(adreno_dev->chipid) == 1);
- }
- static inline int adreno_is_gen7(struct adreno_device *adreno_dev)
- {
- return ADRENO_GPUREV(adreno_dev) >= 0x070000 &&
- ADRENO_GPUREV(adreno_dev) < 0x080000;
- }
- static inline int adreno_is_gen8(struct adreno_device *adreno_dev)
- {
- return ADRENO_GPUREV(adreno_dev) >= 0x080000 &&
- ADRENO_GPUREV(adreno_dev) < 0x090000;
- }
- ADRENO_TARGET(gen7_0_0, ADRENO_REV_GEN7_0_0)
- ADRENO_TARGET(gen7_0_1, ADRENO_REV_GEN7_0_1)
- ADRENO_TARGET(gen7_2_0, ADRENO_REV_GEN7_2_0)
- ADRENO_TARGET(gen7_2_1, ADRENO_REV_GEN7_2_1)
- ADRENO_TARGET(gen7_4_0, ADRENO_REV_GEN7_4_0)
- ADRENO_TARGET(gen7_9_0, ADRENO_REV_GEN7_9_0)
- ADRENO_TARGET(gen7_9_1, ADRENO_REV_GEN7_9_1)
- ADRENO_TARGET(gen7_11_0, ADRENO_REV_GEN7_11_0)
- ADRENO_TARGET(gen8_3_0, ADRENO_REV_GEN8_3_0)
- static inline int adreno_is_gen7_9_x(struct adreno_device *adreno_dev)
- {
- return adreno_is_gen7_9_0(adreno_dev) || adreno_is_gen7_9_1(adreno_dev);
- }
- static inline int adreno_is_gen7_0_x_family(struct adreno_device *adreno_dev)
- {
- return adreno_is_gen7_0_0(adreno_dev) || adreno_is_gen7_0_1(adreno_dev) ||
- adreno_is_gen7_4_0(adreno_dev);
- }
- static inline int adreno_is_gen7_2_x_family(struct adreno_device *adreno_dev)
- {
- return adreno_is_gen7_2_0(adreno_dev) || adreno_is_gen7_2_1(adreno_dev) ||
- adreno_is_gen7_9_x(adreno_dev) || adreno_is_gen7_11_0(adreno_dev);
- }
- static inline bool adreno_checkreg_off(struct adreno_device *adreno_dev,
- enum adreno_regs offset_name)
- {
- const struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev);
- if (offset_name >= ADRENO_REG_REGISTER_MAX ||
- gpudev->reg_offsets[offset_name] == ADRENO_REG_UNUSED)
- return false;
-
- if (gpudev->reg_offsets[offset_name] == ADRENO_REG_SKIP)
- return false;
- return true;
- }
- static inline void adreno_readreg(struct adreno_device *adreno_dev,
- enum adreno_regs offset_name, unsigned int *val)
- {
- const struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev);
- if (adreno_checkreg_off(adreno_dev, offset_name))
- kgsl_regread(KGSL_DEVICE(adreno_dev),
- gpudev->reg_offsets[offset_name], val);
- else
- *val = 0;
- }
- static inline void adreno_writereg(struct adreno_device *adreno_dev,
- enum adreno_regs offset_name, unsigned int val)
- {
- const struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev);
- if (adreno_checkreg_off(adreno_dev, offset_name))
- kgsl_regwrite(KGSL_DEVICE(adreno_dev),
- gpudev->reg_offsets[offset_name], val);
- }
- static inline unsigned int adreno_getreg(struct adreno_device *adreno_dev,
- enum adreno_regs offset_name)
- {
- const struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev);
- if (!adreno_checkreg_off(adreno_dev, offset_name))
- return ADRENO_REG_REGISTER_MAX;
- return gpudev->reg_offsets[offset_name];
- }
- static inline void adreno_write_gmureg(struct adreno_device *adreno_dev,
- enum adreno_regs offset_name, unsigned int val)
- {
- const struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev);
- if (adreno_checkreg_off(adreno_dev, offset_name))
- gmu_core_regwrite(KGSL_DEVICE(adreno_dev),
- gpudev->reg_offsets[offset_name], val);
- }
- static inline unsigned int adreno_gpu_fault(struct adreno_device *adreno_dev)
- {
-
- smp_rmb();
- return atomic_read(&adreno_dev->dispatcher.fault);
- }
- static inline void adreno_set_gpu_fault(struct adreno_device *adreno_dev,
- int state)
- {
-
- atomic_or(state, &adreno_dev->dispatcher.fault);
-
- smp_wmb();
- }
- static inline void adreno_clear_gpu_fault(struct adreno_device *adreno_dev)
- {
- atomic_set(&adreno_dev->dispatcher.fault, 0);
-
- smp_wmb();
- }
- static inline int adreno_gpu_halt(struct adreno_device *adreno_dev)
- {
-
- smp_rmb();
- return atomic_read(&adreno_dev->halt);
- }
- static inline void adreno_clear_gpu_halt(struct adreno_device *adreno_dev)
- {
- atomic_set(&adreno_dev->halt, 0);
-
- smp_wmb();
- }
- static inline void adreno_get_gpu_halt(struct adreno_device *adreno_dev)
- {
- atomic_inc(&adreno_dev->halt);
- }
- static inline void adreno_put_gpu_halt(struct adreno_device *adreno_dev)
- {
-
- int ret = atomic_dec_if_positive(&adreno_dev->halt);
- WARN(ret < 0, "GPU halt refcount unbalanced\n");
- }
- #ifdef CONFIG_DEBUG_FS
- void adreno_debugfs_init(struct adreno_device *adreno_dev);
- void adreno_context_debugfs_init(struct adreno_device *adreno_dev,
- struct adreno_context *ctx);
- #else
- static inline void adreno_debugfs_init(struct adreno_device *adreno_dev) { }
- static inline void adreno_context_debugfs_init(struct adreno_device *device,
- struct adreno_context *context)
- {
- context->debug_root = NULL;
- }
- #endif
- static inline int adreno_compare_pm4_version(struct adreno_device *adreno_dev,
- unsigned int version)
- {
- if (adreno_dev->fw[ADRENO_FW_PM4].version == version)
- return 0;
- return (adreno_dev->fw[ADRENO_FW_PM4].version > version) ? 1 : -1;
- }
- static inline int adreno_compare_pfp_version(struct adreno_device *adreno_dev,
- unsigned int version)
- {
- if (adreno_dev->fw[ADRENO_FW_PFP].version == version)
- return 0;
- return (adreno_dev->fw[ADRENO_FW_PFP].version > version) ? 1 : -1;
- }
- static inline bool adreno_in_preempt_state(struct adreno_device *adreno_dev,
- enum adreno_preempt_states state)
- {
- return atomic_read(&adreno_dev->preempt.state) == state;
- }
- static inline void adreno_set_preempt_state(struct adreno_device *adreno_dev,
- enum adreno_preempt_states state)
- {
-
- smp_wmb();
- atomic_set(&adreno_dev->preempt.state, state);
-
- smp_wmb();
- }
- static inline bool adreno_is_preemption_enabled(
- struct adreno_device *adreno_dev)
- {
- return test_bit(ADRENO_DEVICE_PREEMPTION, &adreno_dev->priv);
- }
- static inline bool adreno_preemption_feature_set(struct adreno_device *adreno_dev)
- {
- return ADRENO_FEATURE(adreno_dev, ADRENO_PREEMPTION) || adreno_dev->preempt_override;
- }
- static inline int adreno_compare_prio_level(int p1, int p2)
- {
- return p2 - p1;
- }
- void adreno_readreg64(struct adreno_device *adreno_dev,
- enum adreno_regs lo, enum adreno_regs hi, uint64_t *val);
- void adreno_writereg64(struct adreno_device *adreno_dev,
- enum adreno_regs lo, enum adreno_regs hi, uint64_t val);
- unsigned int adreno_get_rptr(struct adreno_ringbuffer *rb);
- void adreno_touch_wake(struct kgsl_device *device);
- static inline bool adreno_rb_empty(struct adreno_ringbuffer *rb)
- {
- return (adreno_get_rptr(rb) == rb->wptr);
- }
- static inline bool adreno_soft_fault_detect(struct adreno_device *adreno_dev)
- {
- return adreno_dev->fast_hang_detect &&
- !test_bit(ADRENO_DEVICE_ISDB_ENABLED, &adreno_dev->priv);
- }
- static inline bool adreno_long_ib_detect(struct adreno_device *adreno_dev)
- {
- return adreno_dev->long_ib_detect &&
- !test_bit(ADRENO_DEVICE_ISDB_ENABLED, &adreno_dev->priv);
- }
- static inline bool adreno_support_64bit(struct adreno_device *adreno_dev)
- {
-
- return (BITS_PER_LONG > 32 && ADRENO_GPUREV(adreno_dev) >= 500);
- }
- static inline void adreno_ringbuffer_set_pagetable(struct kgsl_device *device,
- struct adreno_ringbuffer *rb, struct kgsl_pagetable *pt)
- {
- unsigned long flags;
- spin_lock_irqsave(&rb->preempt_lock, flags);
- kgsl_sharedmem_writel(device->scratch,
- SCRATCH_RB_OFFSET(rb->id, current_rb_ptname), pt->name);
- kgsl_sharedmem_writeq(device->scratch,
- SCRATCH_RB_OFFSET(rb->id, ttbr0),
- kgsl_mmu_pagetable_get_ttbr0(pt));
- kgsl_sharedmem_writel(device->scratch,
- SCRATCH_RB_OFFSET(rb->id, contextidr), 0);
- spin_unlock_irqrestore(&rb->preempt_lock, flags);
- }
- static inline u32 counter_delta(struct kgsl_device *device,
- unsigned int reg, unsigned int *counter)
- {
- u32 val, ret = 0;
- if (!reg)
- return 0;
- kgsl_regread(device, reg, &val);
- if (*counter) {
- if (val >= *counter)
- ret = val - *counter;
- else
- ret = (UINT_MAX - *counter) + val;
- }
- *counter = val;
- return ret;
- }
- static inline int adreno_perfcntr_active_oob_get(
- struct adreno_device *adreno_dev)
- {
- struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
- int ret = adreno_active_count_get(adreno_dev);
- if (!ret) {
- ret = gmu_core_dev_oob_set(device, oob_perfcntr);
- if (ret)
- adreno_active_count_put(adreno_dev);
- }
- return ret;
- }
- static inline void adreno_perfcntr_active_oob_put(
- struct adreno_device *adreno_dev)
- {
- struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
- gmu_core_dev_oob_clear(device, oob_perfcntr);
- adreno_active_count_put(adreno_dev);
- }
- static inline int adreno_wait_for_halt_ack(struct kgsl_device *device,
- int ack_reg, unsigned int mask)
- {
- u32 val;
- int ret = kgsl_regmap_read_poll_timeout(&device->regmap, ack_reg,
- val, (val & mask) == mask, 100, 100 * 1000);
- if (ret)
- dev_err(device->dev,
- "GBIF/VBIF Halt ack timeout: reg=%08x mask=%08x status=%08x\n",
- ack_reg, mask, val);
- return ret;
- }
- static inline bool adreno_move_preempt_state(struct adreno_device *adreno_dev,
- enum adreno_preempt_states old, enum adreno_preempt_states new)
- {
- return (atomic_cmpxchg(&adreno_dev->preempt.state, old, new) == old);
- }
- static inline void adreno_reg_offset_init(u32 *reg_offsets)
- {
- int i;
-
- for (i = 0; i < ADRENO_REG_REGISTER_MAX; i++) {
- if (!reg_offsets[i])
- reg_offsets[i] = ADRENO_REG_UNUSED;
- }
- }
- static inline u32 adreno_get_level(struct kgsl_context *context)
- {
- u32 level;
- if (kgsl_context_is_lpac(context))
- return KGSL_LPAC_RB_ID;
- level = context->priority / KGSL_PRIORITY_MAX_RB_LEVELS;
- return min_t(u32, level, KGSL_PRIORITY_MAX_RB_LEVELS - 1);
- }
- int adreno_get_firmware(struct adreno_device *adreno_dev,
- const char *fwfile, struct adreno_firmware *firmware);
- int adreno_zap_shader_load(struct adreno_device *adreno_dev,
- const char *name);
- irqreturn_t adreno_irq_callbacks(struct adreno_device *adreno_dev,
- const struct adreno_irq_funcs *funcs, u32 status);
- int adreno_device_probe(struct platform_device *pdev,
- struct adreno_device *adreno_dev);
- int adreno_power_cycle(struct adreno_device *adreno_dev,
- void (*callback)(struct adreno_device *adreno_dev, void *priv),
- void *priv);
- int adreno_power_cycle_bool(struct adreno_device *adreno_dev,
- bool *flag, bool val);
- int adreno_power_cycle_u32(struct adreno_device *adreno_dev,
- u32 *flag, u32 val);
- void adreno_set_active_ctxs_null(struct adreno_device *adreno_dev);
- void adreno_get_bus_counters(struct adreno_device *adreno_dev);
- int adreno_suspend_context(struct kgsl_device *device);
- void adreno_profile_submit_time(struct adreno_submit_time *time);
- void adreno_preemption_timer(struct timer_list *t);
- void adreno_create_profile_buffer(struct adreno_device *adreno_dev);
- bool adreno_isidle(struct adreno_device *adreno_dev);
- static inline int adreno_allocate_global(struct kgsl_device *device,
- struct kgsl_memdesc **memdesc, u64 size, u32 padding, u64 flags,
- u32 priv, const char *name)
- {
- if (!IS_ERR_OR_NULL(*memdesc))
- return 0;
- *memdesc = kgsl_allocate_global(device, size, padding, flags, priv, name);
- return PTR_ERR_OR_ZERO(*memdesc);
- }
- static inline void adreno_set_dispatch_ops(struct adreno_device *adreno_dev,
- const struct adreno_dispatch_ops *ops)
- {
- adreno_dev->dispatch_ops = ops;
- }
- #ifdef CONFIG_QCOM_KGSL_FENCE_TRACE
- void adreno_fence_trace_array_init(struct kgsl_device *device);
- #else
- static inline void adreno_fence_trace_array_init(struct kgsl_device *device) {}
- #endif
- void adreno_drawobj_set_constraint(struct kgsl_device *device,
- struct kgsl_drawobj *drawobj);
- const char *adreno_get_gpu_model(struct kgsl_device *device);
- int adreno_verify_cmdobj(struct kgsl_device_private *dev_priv,
- struct kgsl_context *context, struct kgsl_drawobj *drawobj[],
- uint32_t count);
- void adreno_mark_for_coldboot(struct adreno_device *adreno_dev);
- bool adreno_smmu_is_stalled(struct adreno_device *adreno_dev);
- u32 adreno_get_ahb_timeout_val(struct adreno_device *adreno_dev, u32 noc_timeout_us);
- static inline void adreno_llcc_slice_deactivate(struct adreno_device *adreno_dev)
- {
- if (adreno_dev->gpu_llc_slice_enable && !IS_ERR_OR_NULL(adreno_dev->gpu_llc_slice))
- llcc_slice_deactivate(adreno_dev->gpu_llc_slice);
- if (adreno_dev->gpuhtw_llc_slice_enable && !IS_ERR_OR_NULL(adreno_dev->gpuhtw_llc_slice))
- llcc_slice_deactivate(adreno_dev->gpuhtw_llc_slice);
- }
- static inline void adreno_irq_free(struct adreno_device *adreno_dev)
- {
- struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
- if (!(adreno_dev->irq_mask || device->pwrctrl.interrupt_num))
- return;
- devm_free_irq(&device->pdev->dev, device->pwrctrl.interrupt_num, device);
- adreno_dev->irq_mask = 0;
- device->pwrctrl.interrupt_num = 0;
- }
- #endif
|