2017-10-04 15:33:25 +00:00
/*
* Copyright © 2014 - 2017 Intel Corporation
*
* 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 , sublicense ,
* 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 NONINFRINGEMENT . IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS 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 _INTEL_UC_FW_H_
# define _INTEL_UC_FW_H_
2017-10-17 09:44:49 +00:00
struct drm_printer ;
2017-10-04 15:33:25 +00:00
struct drm_i915_private ;
2017-10-16 14:47:21 +00:00
struct i915_vma ;
2017-10-04 15:33:25 +00:00
2017-10-16 14:47:20 +00:00
/* Home of GuC, HuC and DMC firmwares */
2018-04-30 15:59:28 -07:00
# define INTEL_UC_FIRMWARE_URL "https: //git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915"
2017-10-16 14:47:19 +00:00
2017-10-04 15:33:25 +00:00
enum intel_uc_fw_status {
INTEL_UC_FIRMWARE_FAIL = - 1 ,
INTEL_UC_FIRMWARE_NONE = 0 ,
INTEL_UC_FIRMWARE_PENDING ,
INTEL_UC_FIRMWARE_SUCCESS
} ;
enum intel_uc_fw_type {
INTEL_UC_FW_TYPE_GUC ,
INTEL_UC_FW_TYPE_HUC
} ;
/*
* This structure encapsulates all the data needed during the process
* of fetching , caching , and loading the firmware image into the uC .
*/
struct intel_uc_fw {
const char * path ;
size_t size ;
struct drm_i915_gem_object * obj ;
enum intel_uc_fw_status fetch_status ;
enum intel_uc_fw_status load_status ;
2017-10-16 14:47:13 +00:00
/*
* The firmware build process will generate a version header file with major and
* minor version defined . The versions are built into CSS header of firmware .
* i915 kernel driver set the minimal firmware version required per platform .
*/
2017-10-06 11:49:40 +03:00
u16 major_ver_wanted ;
u16 minor_ver_wanted ;
u16 major_ver_found ;
u16 minor_ver_found ;
2017-10-04 15:33:25 +00:00
enum intel_uc_fw_type type ;
2017-10-06 11:49:40 +03:00
u32 header_size ;
u32 header_offset ;
u32 rsa_size ;
u32 rsa_offset ;
u32 ucode_size ;
u32 ucode_offset ;
2017-10-04 15:33:25 +00:00
} ;
static inline
const char * intel_uc_fw_status_repr ( enum intel_uc_fw_status status )
{
switch ( status ) {
case INTEL_UC_FIRMWARE_FAIL :
return " FAIL " ;
case INTEL_UC_FIRMWARE_NONE :
return " NONE " ;
case INTEL_UC_FIRMWARE_PENDING :
return " PENDING " ;
case INTEL_UC_FIRMWARE_SUCCESS :
return " SUCCESS " ;
}
return " <invalid> " ;
}
static inline const char * intel_uc_fw_type_repr ( enum intel_uc_fw_type type )
{
switch ( type ) {
case INTEL_UC_FW_TYPE_GUC :
return " GuC " ;
case INTEL_UC_FW_TYPE_HUC :
return " HuC " ;
}
return " uC " ;
}
2017-10-04 18:13:43 +00:00
static inline
void intel_uc_fw_init ( struct intel_uc_fw * uc_fw , enum intel_uc_fw_type type )
{
uc_fw - > path = NULL ;
uc_fw - > fetch_status = INTEL_UC_FIRMWARE_NONE ;
uc_fw - > load_status = INTEL_UC_FIRMWARE_NONE ;
uc_fw - > type = type ;
}
2017-12-06 13:53:11 +00:00
static inline bool intel_uc_fw_is_selected ( struct intel_uc_fw * uc_fw )
{
return uc_fw - > path ! = NULL ;
}
2018-03-12 13:03:07 +00:00
static inline void intel_uc_fw_sanitize ( struct intel_uc_fw * uc_fw )
{
if ( uc_fw - > load_status = = INTEL_UC_FIRMWARE_SUCCESS )
uc_fw - > load_status = INTEL_UC_FIRMWARE_PENDING ;
}
2018-03-13 17:32:50 -07:00
/**
* intel_uc_fw_get_upload_size ( ) - Get size of firmware needed to be uploaded .
* @ uc_fw : uC firmware .
*
* Get the size of the firmware and header that will be uploaded to WOPCM .
*
* Return : Upload firmware size , or zero on firmware fetch failure .
*/
static inline u32 intel_uc_fw_get_upload_size ( struct intel_uc_fw * uc_fw )
{
if ( uc_fw - > fetch_status ! = INTEL_UC_FIRMWARE_SUCCESS )
return 0 ;
return uc_fw - > header_size + uc_fw - > ucode_size ;
}
2017-10-04 15:33:25 +00:00
void intel_uc_fw_fetch ( struct drm_i915_private * dev_priv ,
struct intel_uc_fw * uc_fw ) ;
2017-10-16 14:47:21 +00:00
int intel_uc_fw_upload ( struct intel_uc_fw * uc_fw ,
int ( * xfer ) ( struct intel_uc_fw * uc_fw ,
struct i915_vma * vma ) ) ;
2017-10-04 15:33:25 +00:00
void intel_uc_fw_fini ( struct intel_uc_fw * uc_fw ) ;
2017-10-26 17:36:55 +00:00
void intel_uc_fw_dump ( const struct intel_uc_fw * uc_fw , struct drm_printer * p ) ;
2017-10-04 15:33:25 +00:00
# endif