1 /* SPDX-License-Identifier: GPL-2.0-only OR MIT */ 2 /* Copyright (c) 2023 Imagination Technologies Ltd. */ 3 4 #ifndef PVR_FW_H 5 #define PVR_FW_H 6 7 #include "pvr_fw_info.h" 8 #include "pvr_fw_trace.h" 9 #include "pvr_gem.h" 10 11 #include <drm/drm_mm.h> 12 13 #include <linux/types.h> 14 15 /* Forward declarations from "pvr_device.h". */ 16 struct pvr_device; 17 struct pvr_file; 18 19 /* Forward declaration from "pvr_vm.h". */ 20 struct pvr_vm_context; 21 22 #define ROGUE_FWIF_FWCCB_NUMCMDS_LOG2 5 23 24 #define ROGUE_FWIF_KCCB_NUMCMDS_LOG2_DEFAULT 7 25 26 /** 27 * struct pvr_fw_object - container for firmware memory allocations 28 */ 29 struct pvr_fw_object { 30 /** @ref_count: FW object reference counter. */ 31 struct kref ref_count; 32 33 /** @gem: GEM object backing the FW object. */ 34 struct pvr_gem_object *gem; 35 36 /** 37 * @fw_mm_node: Node representing mapping in FW address space. @pvr_obj->lock must 38 * be held when writing. 39 */ 40 struct drm_mm_node fw_mm_node; 41 42 /** 43 * @fw_addr_offset: Virtual address offset of firmware mapping. Only 44 * valid if @flags has %PVR_GEM_OBJECT_FLAGS_FW_MAPPED 45 * set. 46 */ 47 u32 fw_addr_offset; 48 49 /** 50 * @init: Initialisation callback. Will be called on object creation and FW hard reset. 51 * Object will have been zeroed before this is called. 52 */ 53 void (*init)(void *cpu_ptr, void *priv); 54 55 /** @init_priv: Private data for initialisation callback. */ 56 void *init_priv; 57 58 /** @node: Node for firmware object list. */ 59 struct list_head node; 60 }; 61 62 /** 63 * struct pvr_fw_defs - FW processor function table and static definitions 64 */ 65 struct pvr_fw_defs { 66 /** 67 * @init: 68 * 69 * FW processor specific initialisation. 70 * @pvr_dev: Target PowerVR device. 71 * 72 * This function must call pvr_fw_heap_calculate() to initialise the firmware heap for this 73 * FW processor. 74 * 75 * This function is mandatory. 76 * 77 * Returns: 78 * * 0 on success, or 79 * * Any appropriate error on failure. 80 */ 81 int (*init)(struct pvr_device *pvr_dev); 82 83 /** 84 * @fini: 85 * 86 * FW processor specific finalisation. 87 * @pvr_dev: Target PowerVR device. 88 * 89 * This function is optional. 90 */ 91 void (*fini)(struct pvr_device *pvr_dev); 92 93 /** 94 * @fw_process: 95 * 96 * Load and process firmware image. 97 * @pvr_dev: Target PowerVR device. 98 * @fw: Pointer to firmware image. 99 * @fw_code_ptr: Pointer to firmware code section. 100 * @fw_data_ptr: Pointer to firmware data section. 101 * @fw_core_code_ptr: Pointer to firmware core code section. May be %NULL. 102 * @fw_core_data_ptr: Pointer to firmware core data section. May be %NULL. 103 * @core_code_alloc_size: Total allocation size of core code section. 104 * 105 * This function is mandatory. 106 * 107 * Returns: 108 * * 0 on success, or 109 * * Any appropriate error on failure. 110 */ 111 int (*fw_process)(struct pvr_device *pvr_dev, const u8 *fw, 112 u8 *fw_code_ptr, u8 *fw_data_ptr, u8 *fw_core_code_ptr, 113 u8 *fw_core_data_ptr, u32 core_code_alloc_size); 114 115 /** 116 * @vm_map: 117 * 118 * Map FW object into FW processor address space. 119 * @pvr_dev: Target PowerVR device. 120 * @fw_obj: FW object to map. 121 * 122 * This function is mandatory. 123 * 124 * Returns: 125 * * 0 on success, or 126 * * Any appropriate error on failure. 127 */ 128 int (*vm_map)(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj); 129 130 /** 131 * @vm_unmap: 132 * 133 * Unmap FW object from FW processor address space. 134 * @pvr_dev: Target PowerVR device. 135 * @fw_obj: FW object to map. 136 * 137 * This function is mandatory. 138 */ 139 void (*vm_unmap)(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj); 140 141 /** 142 * @get_fw_addr_with_offset: 143 * 144 * Called to get address of object in firmware address space, with offset. 145 * @fw_obj: Pointer to object. 146 * @offset: Desired offset from start of object. 147 * 148 * This function is mandatory. 149 * 150 * Returns: 151 * * Address in firmware address space. 152 */ 153 u32 (*get_fw_addr_with_offset)(struct pvr_fw_object *fw_obj, u32 offset); 154 155 /** 156 * @wrapper_init: 157 * 158 * Called to initialise FW wrapper. 159 * @pvr_dev: Target PowerVR device. 160 * 161 * This function is mandatory. 162 * 163 * Returns: 164 * * 0 on success. 165 * * Any appropriate error on failure. 166 */ 167 int (*wrapper_init)(struct pvr_device *pvr_dev); 168 169 /** 170 * @has_fixed_data_addr: 171 * 172 * Called to check if firmware fixed data must be loaded at the address given by the 173 * firmware layout table. 174 * 175 * This function is mandatory. 176 * 177 * Returns: 178 * * %true if firmware fixed data must be loaded at the address given by the firmware 179 * layout table. 180 * * %false otherwise. 181 */ 182 bool (*has_fixed_data_addr)(void); 183 184 /** 185 * @irq: FW Interrupt information. 186 * 187 * Those are processor dependent, and should be initialized by the 188 * processor backend in pvr_fw_funcs::init(). 189 */ 190 struct { 191 /** @enable_reg: FW interrupt enable register. */ 192 u32 enable_reg; 193 194 /** @status_reg: FW interrupt status register. */ 195 u32 status_reg; 196 197 /** 198 * @clear_reg: FW interrupt clear register. 199 * 200 * If @status_reg == @clear_reg, we clear by write a bit to zero, 201 * otherwise we clear by writing a bit to one. 202 */ 203 u32 clear_reg; 204 205 /** @event_mask: Bitmask of events to listen for. */ 206 u32 event_mask; 207 208 /** @clear_mask: Value to write to the clear_reg in order to clear FW IRQs. */ 209 u32 clear_mask; 210 } irq; 211 }; 212 213 /** 214 * struct pvr_fw_mem - FW memory allocations 215 */ 216 struct pvr_fw_mem { 217 /** @code_obj: Object representing firmware code. */ 218 struct pvr_fw_object *code_obj; 219 220 /** @data_obj: Object representing firmware data. */ 221 struct pvr_fw_object *data_obj; 222 223 /** 224 * @core_code_obj: Object representing firmware core code. May be 225 * %NULL if firmware does not contain this section. 226 */ 227 struct pvr_fw_object *core_code_obj; 228 229 /** 230 * @core_data_obj: Object representing firmware core data. May be 231 * %NULL if firmware does not contain this section. 232 */ 233 struct pvr_fw_object *core_data_obj; 234 235 /** @code: Driver-side copy of firmware code. */ 236 u8 *code; 237 238 /** @data: Driver-side copy of firmware data. */ 239 u8 *data; 240 241 /** 242 * @core_code: Driver-side copy of firmware core code. May be %NULL if firmware does not 243 * contain this section. 244 */ 245 u8 *core_code; 246 247 /** 248 * @core_data: Driver-side copy of firmware core data. May be %NULL if firmware does not 249 * contain this section. 250 */ 251 u8 *core_data; 252 253 /** @code_alloc_size: Allocation size of firmware code section. */ 254 u32 code_alloc_size; 255 256 /** @data_alloc_size: Allocation size of firmware data section. */ 257 u32 data_alloc_size; 258 259 /** @core_code_alloc_size: Allocation size of firmware core code section. */ 260 u32 core_code_alloc_size; 261 262 /** @core_data_alloc_size: Allocation size of firmware core data section. */ 263 u32 core_data_alloc_size; 264 265 /** 266 * @fwif_connection_ctl_obj: Object representing FWIF connection control 267 * structure. 268 */ 269 struct pvr_fw_object *fwif_connection_ctl_obj; 270 271 /** @osinit_obj: Object representing FW OSINIT structure. */ 272 struct pvr_fw_object *osinit_obj; 273 274 /** @sysinit_obj: Object representing FW SYSINIT structure. */ 275 struct pvr_fw_object *sysinit_obj; 276 277 /** @osdata_obj: Object representing FW OSDATA structure. */ 278 struct pvr_fw_object *osdata_obj; 279 280 /** @hwrinfobuf_obj: Object representing FW hwrinfobuf structure. */ 281 struct pvr_fw_object *hwrinfobuf_obj; 282 283 /** @sysdata_obj: Object representing FW SYSDATA structure. */ 284 struct pvr_fw_object *sysdata_obj; 285 286 /** @power_sync_obj: Object representing power sync state. */ 287 struct pvr_fw_object *power_sync_obj; 288 289 /** @fault_page_obj: Object representing FW fault page. */ 290 struct pvr_fw_object *fault_page_obj; 291 292 /** @gpu_util_fwcb_obj: Object representing FW GPU utilisation control structure. */ 293 struct pvr_fw_object *gpu_util_fwcb_obj; 294 295 /** @runtime_cfg_obj: Object representing FW runtime config structure. */ 296 struct pvr_fw_object *runtime_cfg_obj; 297 298 /** @mmucache_sync_obj: Object used as the sync parameter in an MMU cache operation. */ 299 struct pvr_fw_object *mmucache_sync_obj; 300 }; 301 302 struct pvr_fw_device { 303 /** @firmware: Handle to the firmware loaded into the device. */ 304 const struct firmware *firmware; 305 306 /** @header: Pointer to firmware header. */ 307 const struct pvr_fw_info_header *header; 308 309 /** @layout_entries: Pointer to firmware layout. */ 310 const struct pvr_fw_layout_entry *layout_entries; 311 312 /** @mem: Structure containing objects representing firmware memory allocations. */ 313 struct pvr_fw_mem mem; 314 315 /** @booted: %true if the firmware has been booted, %false otherwise. */ 316 bool booted; 317 318 /** 319 * @processor_type: FW processor type for this device. Must be one of 320 * %PVR_FW_PROCESSOR_TYPE_*. 321 */ 322 u16 processor_type; 323 324 /** @funcs: Function table for the FW processor used by this device. */ 325 const struct pvr_fw_defs *defs; 326 327 /** @processor_data: Pointer to data specific to FW processor. */ 328 union { 329 /** @mips_data: Pointer to MIPS-specific data. */ 330 struct pvr_fw_mips_data *mips_data; 331 } processor_data; 332 333 /** @fw_heap_info: Firmware heap information. */ 334 struct { 335 /** @gpu_addr: Base address of firmware heap in GPU address space. */ 336 u64 gpu_addr; 337 338 /** @size: Size of main area of heap. */ 339 u32 size; 340 341 /** @offset_mask: Mask for offsets within FW heap. */ 342 u32 offset_mask; 343 344 /** @raw_size: Raw size of heap, including reserved areas. */ 345 u32 raw_size; 346 347 /** @log2_size: Log2 of raw size of heap. */ 348 u32 log2_size; 349 350 /** @config_offset: Offset of config area within heap. */ 351 u32 config_offset; 352 353 /** @reserved_size: Size of reserved area in heap. */ 354 u32 reserved_size; 355 } fw_heap_info; 356 357 /** @fw_mm: Firmware address space allocator. */ 358 struct drm_mm fw_mm; 359 360 /** @fw_mm_lock: Lock protecting access to &fw_mm. */ 361 spinlock_t fw_mm_lock; 362 363 /** @fw_mm_base: Base address of address space managed by @fw_mm. */ 364 u64 fw_mm_base; 365 366 /** 367 * @fwif_connection_ctl: Pointer to CPU mapping of FWIF connection 368 * control structure. 369 */ 370 struct rogue_fwif_connection_ctl *fwif_connection_ctl; 371 372 /** @fwif_sysinit: Pointer to CPU mapping of FW SYSINIT structure. */ 373 struct rogue_fwif_sysinit *fwif_sysinit; 374 375 /** @fwif_sysdata: Pointer to CPU mapping of FW SYSDATA structure. */ 376 struct rogue_fwif_sysdata *fwif_sysdata; 377 378 /** @fwif_osinit: Pointer to CPU mapping of FW OSINIT structure. */ 379 struct rogue_fwif_osinit *fwif_osinit; 380 381 /** @fwif_osdata: Pointer to CPU mapping of FW OSDATA structure. */ 382 struct rogue_fwif_osdata *fwif_osdata; 383 384 /** @power_sync: Pointer to CPU mapping of power sync state. */ 385 u32 *power_sync; 386 387 /** @hwrinfobuf: Pointer to CPU mapping of FW HWR info buffer. */ 388 struct rogue_fwif_hwrinfobuf *hwrinfobuf; 389 390 /** @fw_trace: Device firmware trace buffer state. */ 391 struct pvr_fw_trace fw_trace; 392 393 /** @fw_objs: Structure tracking FW objects. */ 394 struct { 395 /** @list: Head of FW object list. */ 396 struct list_head list; 397 398 /** @lock: Lock protecting access to FW object list. */ 399 struct mutex lock; 400 } fw_objs; 401 }; 402 403 #define pvr_fw_irq_read_reg(pvr_dev, name) \ 404 pvr_cr_read32((pvr_dev), (pvr_dev)->fw_dev.defs->irq.name ## _reg) 405 406 #define pvr_fw_irq_write_reg(pvr_dev, name, value) \ 407 pvr_cr_write32((pvr_dev), (pvr_dev)->fw_dev.defs->irq.name ## _reg, value) 408 409 #define pvr_fw_irq_pending(pvr_dev) \ 410 (pvr_fw_irq_read_reg(pvr_dev, status) & (pvr_dev)->fw_dev.defs->irq.event_mask) 411 412 #define pvr_fw_irq_clear(pvr_dev) \ 413 pvr_fw_irq_write_reg(pvr_dev, clear, (pvr_dev)->fw_dev.defs->irq.clear_mask) 414 415 #define pvr_fw_irq_enable(pvr_dev) \ 416 pvr_fw_irq_write_reg(pvr_dev, enable, (pvr_dev)->fw_dev.defs->irq.event_mask) 417 418 #define pvr_fw_irq_disable(pvr_dev) \ 419 pvr_fw_irq_write_reg(pvr_dev, enable, 0) 420 421 extern const struct pvr_fw_defs pvr_fw_defs_meta; 422 extern const struct pvr_fw_defs pvr_fw_defs_mips; 423 424 int pvr_fw_validate_init_device_info(struct pvr_device *pvr_dev); 425 int pvr_fw_init(struct pvr_device *pvr_dev); 426 void pvr_fw_fini(struct pvr_device *pvr_dev); 427 428 int pvr_wait_for_fw_boot(struct pvr_device *pvr_dev); 429 430 int 431 pvr_fw_hard_reset(struct pvr_device *pvr_dev); 432 433 void pvr_fw_mts_schedule(struct pvr_device *pvr_dev, u32 val); 434 435 void 436 pvr_fw_heap_info_init(struct pvr_device *pvr_dev, u32 log2_size, u32 reserved_size); 437 438 const struct pvr_fw_layout_entry * 439 pvr_fw_find_layout_entry(struct pvr_device *pvr_dev, enum pvr_fw_section_id id); 440 int 441 pvr_fw_find_mmu_segment(struct pvr_device *pvr_dev, u32 addr, u32 size, void *fw_code_ptr, 442 void *fw_data_ptr, void *fw_core_code_ptr, void *fw_core_data_ptr, 443 void **host_addr_out); 444 445 int 446 pvr_fw_structure_cleanup(struct pvr_device *pvr_dev, u32 type, struct pvr_fw_object *fw_obj, 447 u32 offset); 448 449 int pvr_fw_object_create(struct pvr_device *pvr_dev, size_t size, u64 flags, 450 void (*init)(void *cpu_ptr, void *priv), void *init_priv, 451 struct pvr_fw_object **pvr_obj_out); 452 453 void *pvr_fw_object_create_and_map(struct pvr_device *pvr_dev, size_t size, u64 flags, 454 void (*init)(void *cpu_ptr, void *priv), 455 void *init_priv, struct pvr_fw_object **pvr_obj_out); 456 457 void * 458 pvr_fw_object_create_and_map_offset(struct pvr_device *pvr_dev, u32 dev_offset, size_t size, 459 u64 flags, void (*init)(void *cpu_ptr, void *priv), 460 void *init_priv, struct pvr_fw_object **pvr_obj_out); 461 462 static __always_inline void * 463 pvr_fw_object_vmap(struct pvr_fw_object *fw_obj) 464 { 465 return pvr_gem_object_vmap(fw_obj->gem); 466 } 467 468 static __always_inline void 469 pvr_fw_object_vunmap(struct pvr_fw_object *fw_obj) 470 { 471 pvr_gem_object_vunmap(fw_obj->gem); 472 } 473 474 void pvr_fw_object_destroy(struct pvr_fw_object *fw_obj); 475 476 static __always_inline void 477 pvr_fw_object_unmap_and_destroy(struct pvr_fw_object *fw_obj) 478 { 479 pvr_fw_object_vunmap(fw_obj); 480 pvr_fw_object_destroy(fw_obj); 481 } 482 483 /** 484 * pvr_fw_object_get_dma_addr() - Get DMA address for given offset in firmware 485 * object. 486 * @fw_obj: Pointer to object to lookup address in. 487 * @offset: Offset within object to lookup address at. 488 * @dma_addr_out: Pointer to location to store DMA address. 489 * 490 * Returns: 491 * * 0 on success, or 492 * * -%EINVAL if object is not currently backed, or if @offset is out of valid 493 * range for this object. 494 */ 495 static __always_inline int 496 pvr_fw_object_get_dma_addr(struct pvr_fw_object *fw_obj, u32 offset, dma_addr_t *dma_addr_out) 497 { 498 return pvr_gem_get_dma_addr(fw_obj->gem, offset, dma_addr_out); 499 } 500 501 void pvr_fw_object_get_fw_addr_offset(struct pvr_fw_object *fw_obj, u32 offset, u32 *fw_addr_out); 502 503 static __always_inline void 504 pvr_fw_object_get_fw_addr(struct pvr_fw_object *fw_obj, u32 *fw_addr_out) 505 { 506 pvr_fw_object_get_fw_addr_offset(fw_obj, 0, fw_addr_out); 507 } 508 509 #endif /* PVR_FW_H */ 510